我找到了很多关于如何将数据从RDS迁移到Cloud SQL的文章,但它们都只是进行主从复制,然后进行切换。但是我找不到任何有关两个云之间主主复制的信息。
我们需要在同步完成后将后端切换到 Cloud SQL,但我们希望保持一种轻松切换回来而不丢失任何数据的方式。
假设我们切换到 Cloud SQL,然后由于一些当前未知的问题,我们认为它无法按预期工作,因此我们想要切换回来。因此,我们必须将所有数据和新数据迁移回 RDS,然后再切换回 RDS。这需要时间,我们至少会有一个小时的停机时间(设置复制 CloudSQL -> RDS,切换;或者从 CloudSQL 导出数据并导入到 RDS,切换)。因此,如果我们决定切换回来,我们希望避免这种停机时间。
有什么方法可以在两个云之间设置主主复制吗?
最佳答案
Disclaimer: Please test it on some test instances before applying this in production. I didn't go with migration yet, so this should be tested yet.
经过一些调查和研究,我能够在 GCP 和 AWS 之间设置主主复制。这是操作方法:
- 创建新参数组并为 AWS 上的实例启用它(需要重新启动实例)
- 通过设置以下设置启用逻辑复制
rds.logical_replication
1
track_commit_timestamp
1
pglogical.conflict_resolution
last_update_wins
shared_preload_libraries
pglogical
- 在 GCP 上添加标记
It’s recommended to set
track_commit_timestamp
toON
before setting other flags. Also all other flags should be set at once, otherwise it might fail.
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
- 在两端创建 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;
- 向 GCP 和 AWS 上的 pguser 授予所有表的所有权限
GRANT ALL ON ALL TABLES IN SCHEMA public TO pguser;
GRANT ALL ON SCHEMA pglogical TO pguser;
- 在两端启用扩展
CREATE EXTENSION pglogical;
- 创建节点
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');
- 将所有表添加到 AWS 上的复制
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
- 在 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 := '{}' );
- 检查订阅状态
SELECT * FROM pglogical.show_subscription_status('aws_sub');
- 以另一种方式启用复制。在 GCP 上添加复制集
SELECT pglogical.replication_set_add_table('default', 'order_details', true);
- 在 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。
基本上我是按照这两个官方指南来进行设置的:
关于AWS RDS 和 GCP Cloud SQL 之间的 PostgreSQL 多主复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73501560/