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

标签 postgresql amazon-rds google-cloud-sql multi-master-replication

我找到了很多关于如何将数据从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 之间设置主主复制。这是操作方法:

  1. 创建新参数组并为 AWS 上的实例启用它(需要重新启动实例)
  2. 通过设置以下设置启用逻辑复制
<表类=“s-表”> <标题> 设置 值 <正文> 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 to ON before setting other flags. Also all other flags should be set at once, otherwise it might fail.

    <表类=“s-表”> <标题> 设置 值 <正文> 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/

    相关文章:

    postgresql - postgres 中有 "AS"的命令吗?

    sql - 插入或更新另一个表时更新表中列的 Postgresql 触发器

    postgresql - 避免 PostgreSQL 中的嵌套循环

    google-app-engine - 如何使用 SSH 连接到 Google Cloud SQL

    mysql - Django DateTimeField 值在线程结束后丢失

    django - 即使在运行迁移之后 Django Programming 错误列也不存在

    amazon-web-services - AWS lambda 捕获 IoT 注册事件

    php - 尝试使用来自共享主机的 SSL 连接到 Amazon-RDS 实例时出现“访问被拒绝”(但在本地测试时有效)

    amazon-web-services - AWS 云信息 : Does CloudWatch Alarm for RDS needs IAM role?

    python-3.x - Cloud Run 连接到 Cloud SQL 模块时出错 Python