logical decoding
配置复制到 Cloud SQL 外部副本的 Cloud SQL 实例。如需详细了解外部副本配置,请参阅关于外部复制。
设置外部副本配置
准备工作
在开始此任务之前,您必须有一个 Cloud SQL 实例和一个符合外部副本要求的外部 PostgreSQL 实例。
配置主实例
- 转到 Google Cloud 控制台中的“Cloud SQL 实例”页面。
- 为外部副本的 IP 地址启用对主实例的访问权限。
如需了解如何启用 IP 访问权限,请参阅为 IP 连接配置访问权限。
- 记录主实例的公共 IP 地址和公共传出 IP 地址以备后用。您可以在实例的概览页面上找到这些值。
- 点击右上角的 Cloud Shell 图标 ()。
- 在 Cloud Shell 提示符处,使用内置的 PostgreSQL 客户端连接到您的主实例:
gcloud sql connect PRIMARY_INSTANCE_NAME \ --user=postgres
- 输入您的根密码。 您随后应该会看到 postgres 提示符。
- 使用
REPLICATION
特性创建 PostgreSQL 用户。CREATE USER REPLICATION_USER WITH REPLICATION IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
- 安装并配置 pglogical 扩展程序:
修改 Cloud SQL 实例以添加和设置以下标志:
cloudsql.enable_pglogical
cloudsql.logical_decoding
max_replication_slots
max_worker_processes
max_wal_senders
-
如需详细了解这些标志,请参阅 PostgreSQL 资源页面。
重启数据库,然后登录并更改为 Replication_user,然后创建
pglogical
扩展程序:CREATE EXTENSION pglogical;
- 创建 pglogical 节点:
pglogical _node_ 表示物理 PostgreSQL 实例,并存储该实例的连接详细信息。
SELECT pglogical.create_node( node_name := 'provider', dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD' );
- 如果要开始使用新数据库,请在主实例和副本实例上创建相同的数据库和表。例如:
CREATE DATABASE test; \connect test; CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text); INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry'); CREATE EXTENSION pglogical;
- 如果主实例上已有数据库,您必须在副本上创建该数据库。为此,请将主实例中的数据库导出到一个 Cloud Storage 存储桶,并将其导入副本。详细了解如何将 Cloud SQL 中的数据导出到 Cloud Storage 中的 SQL 转储文件。
-
为了支持将不同的数据集复制到不同的目标位置,pglogical 提供了复制集的概念。例如,如需将表添加到默认复制集,请执行以下操作:
SELECT pglogical.replication_set_add_table('default', 'replica_test', true);
配置外部副本
- 创建一个特殊用户以用于实现复制功能并授予复制权限:
CREATE USER REPLICATION_USER WITH REPLICATION SUPERUSER LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
- 如果要开始使用新数据库,请使用 REPLICATION_USER 在主实例和副本实例上创建相同的数据库和表。例如:
CREATE DATABASE test; \connect test; CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text); INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
- 如果您要使用从主实例导出的文件作为外部副本实例的种子,请从 Cloud Storage 下载导出的文件。如果外部副本位于 Compute Engine 实例上,您可以使用
gcloud storage
命令下载文件:gcloud storage cp gs://BUCKET_NAME/DUMP_FILE_NAME .
- 将文件导入您的数据库。
psql --user=postgres --password < DUMP_FILE_NAME.
- 根据您的操作系统安装
pglogical
。例如,在运行 PostgreSQL 版本 13 的 Debian 系统上,sudo apt-get install postgresql-13-pglogical
。 - 以 Replication_user 身份登录数据库并设置以下参数:
ALTER SYSTEM SET shared_preload_libraries = 'pglogical'; ALTER SYSTEM SET max_replication_slots = #; (where # is the same as you set on the primary). ALTER SYSTEM SET max_worker_processes = #; (where # is the same as you set on the primary). # Logout of the database and restart it. For example, #
sudo /etc/init.d/postgresql restart
# Log back in the database as the replication_user. # Since the pglogical extension is created local to each database, you need to # executeCREATE EXTENSION pglogical
in each database you create, so if you # haven't already done that: CREATE EXTENSION pglogical;For more information about these flags, see the PostgreSQL resources page.
- 创建 pglogical 节点:
SELECT pglogical.create_node( node_name := 'subscriber', dsn := 'host=REPLICA_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD' );
- 创建 pglogical 订阅:
SELECT pglogical.create_subscription( subscription_name := 'SUBSCRIPTION_NAME', provider_dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD' );
- 查看订阅的状态:
SELECT * FROM pglogical.show_subscription_status('SUBSCRIPTION_NAME');
- 如果状态显示为
replicating
,则表示设置成功。 - 将一些数据插入主实例并检查副本,以确保数据也出现在主实例中。
问题排查
请参阅排查 pglogical 问题后续步骤
- 了解如何管理副本。
- 了解外部副本配置的要求和最佳做法。
- 详细了解 PostgreSQL 复制。
- 详细了解复制配置设置。
- 详细了解从外部服务器复制。