配置外部副本

本页面介绍了如何使用 pglogical 扩展程序logical decoding 配置复制到 Cloud SQL 外部副本的 Cloud SQL 实例。

如需详细了解外部副本配置,请参阅关于外部复制

设置外部副本配置

准备工作

在开始此任务之前,您必须有一个 Cloud SQL 实例和一个符合外部副本要求的外部 PostgreSQL 实例。

配置主实例

  1. 转到 Google Cloud 控制台中的“Cloud SQL 实例”页面
  2. 为外部副本的 IP 地址启用对主实例的访问权限。

    如需了解如何启用 IP 访问权限,请参阅为 IP 连接配置访问权限

  3. 记录主实例的公共 IP 地址和公共传出 IP 地址以备后用。您可以在实例的概览页面上找到这些值。
  4. 点击右上角的 Cloud Shell 图标 ()。
  5. 在 Cloud Shell 提示符处,使用内置的 PostgreSQL 客户端连接到您的主实例:
       
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=postgres
       
       
  6. 输入您的根密码。 您随后应该会看到 postgres 提示符。
  7. 使用 REPLICATION 特性创建 PostgreSQL 用户。
    CREATE USER REPLICATION_USER WITH REPLICATION IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
       
  8. 安装并配置 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;
       
  9. 创建 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'
       );
       
  10. 如果要开始使用新数据库,请在主实例和副本实例上创建相同的数据库和表。例如:
    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;
  11. 如果主实例上已有数据库,您必须在副本上创建该数据库。为此,请将主实例中的数据库导出到一个 Cloud Storage 存储桶,并将其导入副本。详细了解如何将 Cloud SQL 中的数据导出到 Cloud Storage 中的 SQL 转储文件
  12. 为了支持将不同的数据集复制到不同的目标位置,pglogical 提供了复制集的概念。例如,如需将表添加到默认复制集,请执行以下操作:
    SELECT pglogical.replication_set_add_table('default', 'replica_test', true);
       

配置外部副本

  1. 创建一个特殊用户以用于实现复制功能并授予复制权限:
    CREATE USER REPLICATION_USER WITH REPLICATION SUPERUSER LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
       
  2. 如果要开始使用新数据库,请使用 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');
      
  3. 如果您要使用从主实例导出的文件作为外部副本实例的种子,请从 Cloud Storage 下载导出的文件。如果外部副本位于 Compute Engine 实例上,您可以使用 gcloud storage 命令下载文件:
    gcloud storage cp gs://BUCKET_NAME/DUMP_FILE_NAME .
        
  4. 将文件导入您的数据库。
    psql --user=postgres --password < DUMP_FILE_NAME.
    
  5. 根据您的操作系统安装 pglogical。例如,在运行 PostgreSQL 版本 13 的 Debian 系统上,sudo apt-get install postgresql-13-pglogical
  6. 以 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
    # execute CREATE 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.

  7. 创建 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'
      );
      
  8. 创建 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'
    );
      
  9. 查看订阅的状态:
    SELECT * FROM pglogical.show_subscription_status('SUBSCRIPTION_NAME');
       
  10. 如果状态显示为 replicating,则表示设置成功。
  11. 将一些数据插入主实例并检查副本,以确保数据也出现在主实例中。

问题排查

请参阅排查 pglogical 问题

后续步骤