本页介绍了使用 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
。
将针对新
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 地址。验证条目是否正确:
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
文件中。
将针对新
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
验证条目是否正确:
tail -2 DATA_DIR/pg_hba.conf
重启 AlloyDB Omni 以使身份验证更改生效:
docker container restart CONTAINER_NAME
在提供方集群和订阅方集群中创建 pglogical
用户
您必须在提供方集群和订阅方集群中都创建新用户。pglogical
要求用户同时具有 superuser
和 replication
属性。
在 Google Cloud AlloyDB 提供程序集群中,创建用户角色:
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
复制集中移除该表。如果架构中存在没有主键或副本 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 订阅方集群
使用
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
扩展程序具有许多本文档未介绍的高级功能。其中许多功能都适用于您的实现。您可以考虑使用以下高级功能:
- 冲突解决
- 多主和双向复制
- 包含序列
- 切换和故障切换过程