logical decoding 配置复制到 Cloud SQL 外部副本的 Cloud SQL 实例。
如需详细了解复制,请参阅 Cloud SQL 中的复制简介。
设置外部副本配置
准备工作
在开始此任务之前,您必须有一个 Cloud SQL 实例和一个符合外部副本要求的外部 PostgreSQL 实例。
源实例要求
外部读取副本的源实例必须是主实例或独立实例。您无法将 Cloud SQL 读取副本用作外部读取副本的源实例。有时,读取副本会根据其主实例的磁盘克隆重新创建,并且读取副本无法维护其到外部读取副本的复制状态。
配置主实例
- 在 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_pglogicalcloudsql.logical_decodingmax_replication_slotsmax_worker_processesmax_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'