繁体   English   中英

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

[英]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 之间建立主-主复制。 这是操作方法:

  1. 在 AWS 上创建新参数组并为实例启用(需要重启实例)
  2. 通过设置以下设置启用逻辑复制
环境 价值
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 → GCP 和第 11 步(AWS ← GCP)之间创建的。 因此,您必须先启用 AWS → GCP 复制,然后启用 GCP → AWS 复制,然后再将后端切换到新数据库,这样数据才会开始流回 AWS。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM