在 AlloyDB Omni 和其他数据库之间复制数据

本页介绍了使用 pglogical 扩展程序在 AlloyDB Omni 和其他数据库之间复制数据的步骤。

如需了解详情,请参阅 pglogical 扩展程序简介pglogical 术语和基本组件

支持的身份验证方法

pglogical 扩展程序搭配使用的两个主要身份验证方法是密码和信任身份验证方法。

建议的身份验证方法是信任身份验证方法。如需了解详情,请参阅支持的身份验证方法

准备工作

您可以将 pglogical 作为扩展程序安装在给定数据库中。

在 AlloyDB Omni 上实现 pglogical 扩展之前,请确保您满足以下系统要求:

  • superuser 的身份访问非 AlloyDB PostgreSQL 集群。
  • pglogical 扩展程序已安装在非 AlloyDB PostgreSQL 集群中。如需了解特定于版本和发行版本的安装说明,请参阅 pglogical
  • 已安装并配置的 AlloyDB Omni 服务器。如需了解如何安装 AlloyDB Omni,请参阅安装 AlloyDB Omni
  • 非 AlloyDB PostgreSQL 集群和 AlloyDB Omni 主机服务器的 IP 地址。
  • 非 AlloyDB PostgreSQL 集群与 AlloyDB Omni 主机服务器之间已建立安全的网络。必须在标准 PostgreSQL 端口 5432 上建立 TCP 连接。

调整非 AlloyDB 提供方的参数

  1. wal_level 参数设置为 logical,并将 pglogical 附加到 postgresql.conf 文件中的 shared_preload_libraries 参数。pglogical 扩展程序需要对非 AlloyDB 提供程序集群进行一组最少的参数调整。

    cp postgresql.conf postgresql.bak
    sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
    sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
    sed -r -i "s|',|'|" postgresql.conf
  2. 验证参数是否设置正确:

    grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
  3. 重启非 AlloyDB 集群,以使参数更改生效。

    其他参数可能已设置为足够的值,也可能需要调整,具体取决于您的非 AlloyDB 发行版和版本。

    请检查以下参数:

    • max_worker_processes:每个提供方数据库一个,每个订阅方节点至少一个。此参数的标准值至少为 10。
    • max_replication_slots:提供方节点上的每个节点一个。
    • max_wal_senders:提供方节点上的每个节点一个。
    • track_commit_timestamp:如果需要最后或第一个更新胜出冲突解决方案,请将其设置为 on
    • listen_addresses:必须包含 AlloyDB Omni IP 地址,或通过覆盖 CIDR 块提及。
  4. (可选)如果您的非 AlloyDB 提供程序是 Amazon RDS 或 Aurora,则必须启用 pglogical 扩展程序,并通过 cluster parameter group 调整来调整所需的参数。

    1. 在现有或新建的集群参数组中,设置以下参数:

      • rds.logical_replication1
      • max_replication_slots50
      • max_wal_senders50
      • max_worker_processes64
      • shared_preload_librariespg_stat_statements, pglogical
    2. 重启 Amazon RDS 或 Aurora 集群,以使集群参数组调整生效。

  5. 确认所有参数值均相关:

    SELECT name, setting
    FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
     ORDER BY name;
    

对非 AlloyDB Omni 提供方集群进行基于主机的身份验证调整

pglogical 会与提供程序数据库建立本地 TCP 连接。因此,您必须将主机服务器的 IP 地址添加到 AlloyDB Omni DATA_DIR/pg_hba.conf 文件中,其中 DATA_DIR 是数据目录的文件系统路径,例如 /home/$USER/alloydb-data

  1. 将针对新 pglogical_replication 用户的本地服务器信任身份验证条目添加到 DATA_DIR/pg_hba.conf 文件中。

    此外,订阅方节点必须能够对提供方节点进行身份验证。将每个订阅方节点的 IP 地址或相应的 CIDR 块 IP 范围添加到 DATA_DIR/pg_hba.conf 文件中:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    host all pglogical_replication SERVER_IP_ADDRESS/32 trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf

    SERVER_IP_ADDRESS 替换为要从中复制的主 AlloyDB Omni 实例的 IP 地址。

  2. 验证条目是否正确:

    tail -3 DATA_DIR/pg_hba.conf
  3. 重启非 AlloyDB 集群,以使参数更改生效。

调整 AlloyDB Omni 订阅方集群的参数

pglogical 还需要对 AlloyDB Omni 订阅方集群进行一组最少的参数调整。您必须将 pglogical 附加到 DATA_DIR/postgresql.conf 文件中的 shared_preload_libraries 参数。如果集群中的任何数据库都充当提供方数据库,请对提供方数据库进行所需的参数更改。

  1. 调整参数:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. 验证参数是否设置正确:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. 重启 AlloyDB Omni 以使参数更改生效:

    Docker

     docker container restart CONTAINER_NAME

    CONTAINER_NAME 替换为您在启动 AlloyDB Omni 容器时为其分配的名称。

    Podman

     podman container restart CONTAINER_NAME

    CONTAINER_NAME 替换为您在启动 AlloyDB Omni 容器时为其分配的名称。

  4. 为其他提供程序数据库参数设置 AlloyDB Omni 默认值:

    • max_worker_processes:每个提供方数据库一个,每个订阅方节点一个。
    • track_commit_timestamp:如果需要使用“上次/首次更新胜出”冲突解决方式,请将其设置为 on
  5. 确认所有参数值均相关:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

对 AlloyDB Omni 订阅方集群进行基于主机的身份验证调整

pglogical 会与 AlloyDB Omni 订阅者数据库建立本地 TCP 连接。因此,您必须将订阅者的主机服务器的 IP 地址添加到 AlloyDB Omni DATA_DIR/pg_hba.conf 文件中。

  1. 将针对新 pglogical_replication 用户的本地服务器信任身份验证条目添加到 DATA_DIR/pg_hba.conf 文件中:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
  2. 验证条目是否正确:

    tail -2 DATA_DIR/pg_hba.conf
  3. 重启 AlloyDB Omni 以使身份验证更改生效:

    docker container restart CONTAINER_NAME

在提供方集群和订阅方集群中创建 pglogical 用户

您必须在提供方集群和订阅方集群中都创建新用户。pglogical 要求用户同时具有 superuserreplication 属性。

  1. 在 Google Cloud AlloyDB 提供程序集群中,创建用户角色:

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    
  2. (可选)如果您的非 AlloyDB 提供程序是 Amazon RDS 或 Aurora,则必须授予以下角色:

    GRANT rds_superuser TO replication_user;
    

pglogical 和节点添加到非 AlloyDB 提供方数据库

  1. 授予所需权限。

    您必须在每个数据库中安装 pglogical 扩展程序,并向 pglogical 数据库用户授予 usage 权限。

    例如,如果您的数据库为 my_test_db,请运行以下命令:

    CREATE EXTENSION IF NOT EXISTS pglogical;
    GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    
  2. 为提供方数据库创建 pglogical 节点。 node_name 是任意的,dsn 字符串必须是指向同一数据库的有效 TCP 连接。

    例如,对于 my_test_db 数据库,请运行以下命令:

    SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    

创建表并将其添加到默认复制集

创建一个表,并将其添加到非 AlloyDB 提供程序数据库上的默认复制集。

  1. 在提供程序数据库中创建一个名为 test_table_1 的测试表:

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. 将测试表手动添加到默认复制集中。您可以创建自定义 pglogical 复制集,也可以使用默认的复制集。在您创建扩展程序时,系统会创建多个默认复制集,例如 defaultdefault_insert_onlyddl_sql。您可以单独向复制集添加表和序列,也可以为指定架构一次性添加所有表和序列。

    -- Add the specified table to the default replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
  3. (可选)添加指定架构(例如 public)中的所有表:

    -- Add all "public" schema tables to the default replication set:
    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
    -- Add all "public" schema sequences to the default replication:
    SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']);
    
    -- Check which sequences have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_seq;
    
  4. default 复制集中移除该表。如果架构中存在没有主键或副本 ID 的表,则只能复制 INSERT 语句。如果您已通过 replication_set_add_all_tables 函数自动将这些表添加到 default 复制集,则需要手动将其从该复制集中移除,然后将其添加到 default_insert_only 集。

    -- Remove the table from the **default** replication set:
    SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
    
    -- Manually add to the **default_insert_only** replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
    

    您可以根据需要,如果想自动将新创建的表添加到复制集,请按照 pglogical中的建议添加 pglogical_assign_repset 触发器。

将数据库复制到 AlloyDB Omni 订阅方集群

  1. 使用 pg_dump 实用程序创建源数据库的仅架构备份。

  2. 使用非 AlloyDB 服务器的 IP 地址或端点,从 AlloyDB Omni 订阅方服务器运行 pg_dump 命令。

    pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
  3. 将备份导入订阅者 AlloyDB Omni 服务器上的订阅者数据库:

    Docker

    docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

    Podman

    podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

这会创建数据库和架构,但不包含任何行数据。pglogical 扩展程序会复制行数据。手动复制或重新创建所需的任何其他用户或角色。

在 AlloyDB Omni 订阅者数据库中创建节点和订阅

  1. 在 AlloyDB Omni 订阅者数据库上创建一个节点。如果您选择使用密码身份验证,请将密码添加到 dsn

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "
  2. 在订阅者数据库中创建订阅,指向 AlloyDB Omni 提供程序服务器中的提供程序数据库。

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "
  3. 在几秒或几分钟内,初始数据应已从提供方复制到订阅方:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    添加到提供程序数据库中的其他行也会在几秒钟内实时复制。

其他 pglogical 部署注意事项

pglogical 扩展程序具有许多本文档未介绍的高级功能。其中许多功能都适用于您的实现。您可以考虑使用以下高级功能:

  • 冲突解决
  • 多主和双向复制
  • 包含序列
  • 切换和故障切换过程

后续步骤