[英]PostgreSQL multi-master replication between AWS RDS and GCP Cloud SQL
我发现很多关于如何将数据从 RDS 迁移到 Cloud SQL 的文章,但是它们都只是做主从复制,然后是切换。 但是,我找不到有关两个云之间的主-主复制的任何信息。
我们需要在同步完成后将我们的后端切换到 Cloud SQL,但我们希望保持一种轻松切换回而不会丢失任何数据的方式。
假设我们切换到 Cloud SQL,然后由于一些当前未知的问题,我们决定它不能按预期工作,我们想要切换回来。 因此,我们必须将所有带有新数据的数据迁移回 RDS,然后再切换回 RDS。 这将需要时间,我们至少会有一个小时的停机时间(设置复制 CloudSQL -> RDS,切换;或从 CloudSQL 导出数据并导入 RDS,切换)。 因此,如果我们决定切换回来,我们希望避免这种停机时间。
有没有办法在两个云之间设置主-主复制?
免责声明:在将其应用于生产之前,请在一些测试实例上对其进行测试。 我还没有进行迁移的 go ,所以应该对此进行测试。
因此,经过一番调查和研究,我能够在 GCP 和 AWS 之间建立主-主复制。 这是操作方法:
环境 | 价值 |
---|---|
rds.logical_replication |
1 |
track_commit_timestamp |
1 |
pglogical.conflict_resolution |
last_update_wins |
shared_preload_libraries |
添加pglogical |
建议在设置其他标志之前将
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 |
CREATE USER pguser NOLOGIN;
\password pguser
ALTER USER pguser LOGIN;
GRANT rds_superuser TO pguser;
CREATE USER pguser NOLOGIN;
\password pguser
ALTER USER pguser LOGIN;
GRANT cloudsqlsuperuser TO pguser;
GRANT ALL ON ALL TABLES IN SCHEMA public TO pguser;
GRANT ALL ON SCHEMA pglogical TO pguser;
CREATE EXTENSION pglogical;
SELECT pglogical.create_node(
node_name := 'aws-node1',
dsn := 'host=x.x.x.x port=5432 sslmode=require dbname=postgres user=pguser password=secur3p455word');
SELECT pglogical.create_node(
node_name := 'gcp-node1',
dsn := 'host=y.y.y.y port=5432 sslmode=require dbname=postgres user=pguser password=secur3p455word');
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
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 := '{}' );
SELECT * FROM pglogical.show_subscription_status('aws_sub');
SELECT pglogical.replication_set_add_table('default', 'order_details', true);
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 → GCP 和第 11 步(AWS ← GCP)之间创建的。 因此,您必须先启用 AWS → GCP 复制,然后启用 GCP → AWS 复制,然后再将后端切换到新数据库,这样数据才会开始流回 AWS。
基本上我是按照这两个官方指南进行设置的:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.