AWS RDS和GCP Cloud SQL之间的PostgreSQL多主机复制

lmvvr0a8  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(163)

我发现了很多关于如何将数据从RDS迁移到Cloud SQL的文章,但所有这些文章都只是进行主从复制,然后进行切换。但是,我找不到任何关于两个云之间的主-主复制的信息。
我们需要在同步完成后将后端切换到Cloud SQL,但我们希望保持一种轻松切换的方式,而不会丢失任何数据。
假设我们切换到Cloud SQL,然后我们决定由于一些当前未知的问题,它无法按预期工作,我们希望切换回来。因此,我们必须将所有数据与新数据一起迁移回RDS,然后再切换回RDS。这将需要时间,我们将有至少一个小时的停机时间(设置复制CloudSQL -> RDS,交换机;或从CloudSQL导出数据并导入到RDS、交换机)。因此,我们希望避免这种停机时间,以防我们决定切换回来。
有没有办法在两个云之间设置主-主复制?

0md85ypi

0md85ypi1#

免责声明:在将其应用于生产之前,请在一些测试示例上对其进行测试。我还没有进行迁移,所以应该测试一下。

因此,经过一些调查和研究,我能够在GCP和AWS之间建立主-主复制。以下是操作方法:
1.创建新的参数组并在AWS上为示例启用该参数组(需要重启示例)
1.通过设置以下设置启用逻辑复制
| 设置|价值|
| - -----|- -----|
| rds.logical_replication| 1|
| track_commit_timestamp| 1|
| pglogical.conflict_resolution| last_update_wins|
| shared_preload_libraries| * 添加 * pglogical|
1.在GCP上添加标志
建议先将track_commit_timestamp设置为ON,然后再设置其他标志。另外,所有其他标志应该立即设置,否则可能会失败。
| 设置|价值|
| - -----|- -----|
| cloudsql.enable_pglogical| ON|
| cloudsql.logical_decoding| ON|
| max_replication_slots| 10|
| max_worker_processesset| 8|
| max_wal_senders| 10|
| track_commit_timestamp| ON|
| pglogical.conflict_resolution| * 添加 * last_update_wins|
1.在两端创建pguser:

AWS

CREATE USER pguser NOLOGIN;
\password pguser
ALTER USER pguser LOGIN;
GRANT rds_superuser TO pguser;

GCP

CREATE USER pguser NOLOGIN;
\password pguser
ALTER USER pguser LOGIN;
GRANT cloudsqlsuperuser TO pguser;

1.在GCP和AWS上向pguser授予所有表的所有权限

GRANT ALL ON ALL TABLES IN SCHEMA public TO pguser;
GRANT ALL ON SCHEMA pglogical TO pguser;

1.在两端启用扩展

CREATE EXTENSION pglogical;

1.创建节点

AWS

SELECT pglogical.create_node(
    node_name := 'aws-node1',
    dsn := 'host=x.x.x.x port=5432 sslmode=require dbname=postgres user=pguser password=secur3p455word');

GCP

SELECT pglogical.create_node(
    node_name := 'gcp-node1',
    dsn := 'host=y.y.y.y port=5432 sslmode=require dbname=postgres user=pguser password=secur3p455word');

1.将所有表添加到AWS上的复制

SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);

1.在GCP上创建订阅

SELECT pglogical.create_subscription(
    subscription_name := 'aws_sub',
    provider_dsn := 'host=x.x.x.x port=5432 sslmode=require dbname=postgres user=pguser password=secur3p455word',
    replication_sets := ARRAY['default'],
    synchronize_data := true,
    forward_origins := '{}' );

1.检查订阅状态

SELECT * FROM pglogical.show_subscription_status('aws_sub');

1.以另一种方式启用复制。在GCP上添加复制集

SELECT pglogical.replication_set_add_table('default', 'order_details', true);

1.在AWS上创建订阅

SELECT pglogical.create_subscription(
    subscription_name := 'aws_sub',
    provider_dsn := 'host=y.y.y.y port=5432 sslmode=require dbname=postgres user=pguser password=7wjFnMMT8GL5cJLO',
    replication_sets := ARRAY['default'],
    synchronize_data := true,
    forward_origins := '{}' );

注意事项

  • 在设置复制之后,向两个表写入数据都可以工作,并且数据将显示在每个数据库中,而不管数据被写入到何处。如果插入的行具有相同的id,则显示错误,这不会打乱数据。
    *请确保使用主键和id,以免混淆数据
  • 在第11步中打开复制并没有将数据从GCP复制到AWS,而AWS是在启用复制AWS → GCP和第11步(AWS ← GCP)之间创建的。因此,您必须首先启用AWS → GCP复制,然后启用GCP → AWS复制,然后才能将后端切换到新数据库,以便数据开始流回AWS。

基本上我是按照这两个官方指南来设置的:

8fq7wneg

8fq7wneg2#

2步5和6步位置怎么样?如果你不先运行第6步,将在命令GRANT ALL ON SCHEMA pgrological TO pguser中出现错误'schema“pgrological”does not exist';

5.Grant all privileges on all tables to pguser on both GCP and AWS
GRANT ALL ON ALL TABLES IN SCHEMA public TO pguser;
GRANT ALL ON SCHEMA pglogical TO pguser;

6.Enable extension on both ends
CREATE EXTENSION pglogical;
------

相关问题