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 提供方上的参数
- 将 - 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
- 验证是否已正确设置参数: - grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
- 重启非 AlloyDB 集群,以使参数更改生效。 - 其他参数可能已设置为足够的值,也可能需要调整,具体取决于您的非 AlloyDB 发行版和版本。 - 请检查以下参数: - max_worker_processes:每个提供方数据库一个,每个订阅方节点至少一个。此参数的标准值至少为 10。
- max_replication_slots:在提供方节点中每个节点一个。
- max_wal_senders:在提供方节点中每个节点一个。
- track_commit_timestamp:如果需要使用最后一次更新优先或第一次更新优先冲突解决方案,则设置为- on。
- listen_addresses:必须包含 AlloyDB Omni IP 地址,或通过覆盖 CIDR 地址块进行提及。
 
- (可选)如果您的非 AlloyDB 提供方是 Amazon RDS 或 Aurora,则必须启用 pglogical 扩展程序,并通过 - cluster parameter group调整来调整所需的参数。- 在现有或新的集群参数组中,设置以下参数: - rds.logical_replication至- 1
- max_replication_slots至- 50
- max_wal_senders至- 50
- max_worker_processes至- 64
- shared_preload_libraries至- pg_stat_statements, pglogical
 
- 重启 Amazon RDS 或 Aurora 集群,以使集群参数组调整生效。 
 
- 确认所有参数值都相关: - 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。
- 在 - DATA_DIR/pg_hba.conf文件中为本地服务器添加特定于新- pglogical_replication用户的信任身份验证条目。- 此外,订阅方节点必须能够针对提供方节点进行身份验证。将每个订阅方节点的 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 地址。
- 验证条目是否正确: - tail -3 DATA_DIR/pg_hba.conf
- 重启非 AlloyDB 集群,以使参数更改生效。 
调整 AlloyDB Omni 订阅方集群的参数
pglogical 也需要对 AlloyDB Omni 订阅方集群进行一组最基本的参数调整。您必须将 pglogical 附加到 DATA_DIR/postgresql.conf 文件中的 shared_preload_libraries 参数。如果集群中的任何数据库充当提供方数据库,请进行提供方数据库所需的参数更改。
- 调整参数: - sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
- 验证参数是否已正确设置: - grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
- 重启 AlloyDB Omni 以使参数更改生效: - Docker- docker container restart CONTAINER_NAME- 将 - CONTAINER_NAME替换为您在启动 AlloyDB Omni 容器时为其分配的名称。- Podman- podman container restart CONTAINER_NAME- 将 - CONTAINER_NAME替换为您在启动 AlloyDB Omni 容器时为其分配的名称。
- 为其他提供方数据库参数设置 AlloyDB Omni 默认值: - max_worker_processes:每个提供方数据库一个,每个订阅方节点一个。
- track_commit_timestamp:如果需要使用最后一次/第一次更新优先冲突解决方案,则设置为- on。
 
- 确认所有参数值都相关: - 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 文件中。
- 在 - DATA_DIR/pg_hba.conf文件中为本地服务器添加特定于新- pglogical_replication用户的信任身份验证条目:- echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
- 验证条目是否正确: - tail -2 DATA_DIR/pg_hba.conf
- 重启 AlloyDB Omni 以使身份验证更改生效: - docker container restart CONTAINER_NAME
在提供方集群和订阅方集群中都创建 pglogical 用户
您必须在提供方集群和订阅方集群中都创建新用户。pglogical 要求用户同时具有 superuser 和 replication 属性。
- 在 AlloyDB for PostgreSQL 提供方集群中,创建用户角色: - CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
- (可选)如果您的非 AlloyDB 提供方是 Amazon RDS 或 Aurora,则必须授予以下角色: - GRANT rds_superuser TO replication_user;
将 pglogical 和节点添加到非 AlloyDB 提供方数据库
- 授予所需权限。 - 您必须在每个数据库中都安装 - pglogical扩展程序,并向 pglogical 数据库用户授予- usage权限。- 例如,如果您的数据库为 - my_test_db,请运行以下命令:- CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication;
- 为提供方数据库创建 - 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 提供方数据库上的默认复制集。
- 在提供方数据库中创建一个名为 - test_table_1的测试表:- CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
- 将测试表手动添加到默认复制集中。您可以创建自定义 pglogical 复制集,也可以使用默认的复制集。在您创建扩展程序时,系统创建了一些默认复制集,例如 - default、- default_insert_only和- ddl_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;
- (可选)添加指定架构(例如 - 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;
- 从 - default复制集中移除表。如果架构中存在任何没有主键或副本标识的表,则只能复制- 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 订阅方集群
- 使用 - pg_dump实用程序创建源数据库的仅限架构的备份。
- 使用非 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
- 将备份导入到订阅方 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 订阅方数据库中创建节点和订阅
- 在 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'); "
- 在订阅方数据库中创建订阅,指向 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'); "
- 几秒或几分钟内,初始数据应已从提供方复制到订阅方: - 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 扩展程序具有许多本文档未介绍的高级功能。其中许多功能适用于您的实现。您可以考虑使用以下高级功能:
- 冲突解决
- 多主实例和双向复制
- 包含序列
- 切换和故障切换过程