创建只读副本

如需提高读取吞吐量和可用性,您可以为现有 AlloyDB Omni 服务器创建 AlloyDB Omni 副本服务器。副本服务器提供主数据库服务器的只读克隆。它会持续更新自己的数据,以反映主服务器数据的更改。

以下部分介绍了配置 AlloyDB Omni 主服务器以进行复制、配置副本服务器以及验证主服务器上的复制状态的步骤。

如需了解详情,请参阅在 Kubernetes 上安装 AlloyDB Omni

配置主服务器以进行复制

  1. 更新主服务器主机的网络或防火墙设置,以允许从副本服务器主机通过主服务器的 Postgres 端口传入流量。

  2. 创建复制用户:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -c "create user REPLICA_USER with replication password 'PASSWORD'"

    替换以下内容:

    • REPLICA_USER:副本用户的名称。
    • PASSWORD:副本用户的密码。
    • CONTAINER_NAME:您在安装 AlloyDB Omni 容器时为其分配的名称。

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -c "create user REPLICA_USER with replication password 'PASSWORD'"

    替换以下内容:

    • REPLICA_USER:副本用户的名称。
    • PASSWORD:副本用户的密码。
    • CONTAINER_NAME:您在安装 AlloyDB Omni 容器时为其分配的名称。
  3. /DATA_DIR/pg_hba.conf 文件中,在文件中存在的 host all all all scram-sha-256 之前添加以下代码行:

    host alloydbmetadata    alloydbmetadata   IP_RANGE trust
    host replication        REPLICA_USER    IP_RANGE scram-sha-256
    

    替换以下内容:

    • IP_RANGE:副本机所在子网的 IP 地址范围(采用 CIDR 表示法)。例如 203.0.113.0/24
    • DATA_DIR:您希望此副本用于其数据目录的文件系统路径。
  4. 重启主服务器:

    Docker

    docker restart CONTAINER_NAME

    Podman

    podman restart CONTAINER_NAME

创建和配置副本服务器

如需创建和配置 AlloyDB Omni 副本服务器,请完成以下步骤:

  1. 确保副本与主服务器之间有网络连接:

    ping SOURCE_IP

    SOURCE_IP 替换为要从中复制的主 AlloyDB Omni 实例的 IP 地址。

  2. 确保副本可以连接到主服务器:

    Docker

    docker run -it --rm google/alloydbomni psql "host=SOURCE_IP user=REPLICA_USER replication=1" -c "IDENTIFY_SYSTEM;"

    Podman

    podman run -it --rm google/alloydbomni psql "host=SOURCE_IP user=REPLICA_USER replication=1" -c "IDENTIFY_SYSTEM;"

    输出应类似如下所示:

           systemid       | timeline |  xlogpos  | dbname
     ---------------------+----------+-----------+--------
      7376500460465963036 |        1 | 0/454B670 |
      (1 row)
    
  3. 副本必须在磁盘上具有永久性存储位置:

    Docker

     mkdir alloydb && docker run --rm -it \
       -e PGDATA=/var/lib/postgresql/data/pgdata \
       -v "$PWD/alloydb":/var/lib/postgresql/data \
       -p 5432:5432 \
       --user $(id -u):$(id -g) \
       google/alloydbomni \
       /usr/lib/postgresql/15/bin/pg_basebackup \
         --pgdata=/var/lib/postgresql/data/pgdata \
         --checkpoint=fast \
         --host="SOURCE_IP" \
         --port="SOURCE_PORT" \
         --username=REPLICA_USER \
         --create-slot \
         --write-recovery-conf \
         --slot="SLOT_NAME"

    替换以下内容:

    • SOURCE_PORT:要从中复制的主 AlloyDB Omni 实例的 TCP 端口。如果您未提供此值,AlloyDB Omni 会应用默认值 5432
    • SLOT_NAME:复制槽名称的标签。

    Podman

     mkdir alloydb && podman run --rm -it \
       -e PGDATA=/var/lib/postgresql/data/pgdata \
       -v "$PWD/alloydb":/var/lib/postgresql/data \
       -p 5432:5432 \
       --user $(id -u):$(id -g) \
       google/alloydbomni \
       /usr/lib/postgresql/15/bin/pg_basebackup \
         --pgdata=/var/lib/postgresql/data/pgdata \
         --checkpoint=fast \
         --host="SOURCE_IP" \
         --port="SOURCE_PORT" \
         --username=REPLICA_USER \
         --create-slot \
         --write-recovery-conf \
         --slot="SLOT_NAME"

    替换以下内容:

    • SOURCE_PORT:要从中复制的主 AlloyDB Omni 实例的 TCP 端口。如果您未提供此值,AlloyDB Omni 会应用默认值 5432
    • SLOT_NAME:复制槽名称的标签。
  4. 启动副本实例:

    Docker

    docker run --detach \
      --name pg-service \
      -e POSTGRES_PASSWORD=a \
      -e PGDATA=/var/lib/postgresql/data/pgdata \
      -v "$PWD/alloydb":/var/lib/postgresql/data \
      -v /dev/shm:/dev/shm \
      -p 5432:5432 \
      --user $(id -u):$(id -g) \
      google/alloydbomni

    Podman

    podman run --detach \
      --name pg-service \
      -e POSTGRES_PASSWORD=a \
      -e PGDATA=/var/lib/postgresql/data/pgdata \
      -v "$PWD/alloydb":/var/lib/postgresql/data \
      -v /dev/shm:/dev/shm \
      -p 5432:5432 \
      --user $(id -u):$(id -g) \
      google/alloydbomni

验证主服务器上的复制状态

如需验证复制是否配置正确,请在主服务器的主机上运行以下命令:

Docker

  docker exec -it CONTAINER_NAME psql -h localhost -U postgres -c "select * from pg_stat_replication"

Podman

  podman exec -it CONTAINER_NAME psql -h localhost -U postgres -c "select * from pg_stat_replication"

输出表中,每个连接到主数据库服务器的副本都占一行。

设置复制后,对主数据库服务器中行执行的所有插入、更新和删除操作都会在几秒钟内在副本上变为可读。

后续步骤