配置外部副本

本页面介绍了如何使用 pglogical 扩展程序logical decoding 配置复制到 Cloud SQL 外部副本的 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 问题

后续步骤