本文档介绍了如何在 AlloyDB Omni 中创建逻辑复制槽。在 PostgreSQL 中,逻辑复制是一种将数据更改从发布方数据库复制到一个或多个订阅方(可以是数据库或其他应用)的方法。您可以使用 AlloyDB Omni Kubernetes 操作器在您创建的集群上启用和配置逻辑复制。
流式传输的更改可以是单个行更新、插入或删除。订阅方通过可确保持久连接的唯一复制槽连接到发布方。持久连接会维护数据流式传输状态,因此如果发生中断,流式传输会从中断处继续。
如需详细了解 PostgreSQL 中的逻辑复制,请参阅逻辑复制。
本页面上的代码段是您可以用作模型的示例,您可以将其中的值替换为用于 AlloyDB Omni 资源的值。
准备工作
创建发布方集群
在创建复制槽之前,您必须创建启用了逻辑复制的发布方集群。您必须在 DBCluster 清单中将 wal_level 参数设置为 logical。
如需创建启用了逻辑复制的发布方数据库集群,请应用以下清单:
  apiVersion: v1
  kind: Secret
  metadata:
    name: db-pw-DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  type: Opaque
  data:
    DB_CLUSTER_NAME: "ENCODED_PASSWORD"
  ---
  apiVersion: alloydbomni.dbadmin.goog/v1
  kind: DBCluster
  metadata:
    name: DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  spec:
    databaseVersion: "ALLOYDB_OMNI_VERSION"
    spec:
    availability:
      numberOfStandbys: 1
    primarySpec:
      parameters:
        wal_level: "logical"
      adminUser:
        passwordRef:
          name: db-pw-DB_CLUSTER_NAME
      resources:
        cpu: CPU_COUNT
        memory: MEMORY_SIZE
        disks:
        - name: DataDisk
          size: DISK_SIZE替换以下内容:
- DB_CLUSTER_NAME:此数据库集群的名称,例如- publisher。
- DB_CLUSTER_NAMESPACE(可选):要在其中创建数据库集群的命名空间,例如- publisher-namespace。
- ENCODED_PASSWORD:默认- postgres用户角色的数据库登录密码(以 base64 字符串编码),例如- Q2hhbmdlTWUxMjM=表示- ChangeMe123。
- ALLOYDB_OMNI_VERSION:AlloyDB Omni 版本,- 15.7.0或更高版本。
- CPU_COUNT:此数据库集群中的每个数据库实例可用的 CPU 数量。
- MEMORY_SIZE:此数据库集群的每个数据库实例的内存量。建议将此值设置为每个 CPU 8 千兆字节。例如,如果您之前在此清单中将- cpu设置为- 2,则建议将- memory设置为- 16Gi。
- DISK_SIZE:每个数据库实例的磁盘大小,例如- 10Gi。
创建复制槽
创建发布方集群后,您可以使用发布方集群中的 Replication 资源创建逻辑复制槽。每个 Replication 资源都与相应的数据库集群资源相关联。一个数据库集群可以有多个关联的逻辑复制资源。
如需在发布方集群中配置复制槽,请应用以下清单:
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: USER_PASSWORD_SECRET_NAME
  namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
spec:
  dbcluster:
    name: DB_CLUSTER_NAME
  upstream:
    logicalReplication:
      pluginName: DECODER_PLUGIN
      databaseName: DATABASE_NAME
    applicationName: APPLICATION_NAME
    replicationSlotName: REPLICATION_SLOT_NAME
    synchronous: "REPLICATION_MODE"
    username: APPLICATION_USER
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
EOF替换以下内容:
- REPLICATION_NAME:此 Replication资源的名称,例如replication-1。
- NAMESPACE:此 Replication资源的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。
- DB_CLUSTER_NAME:您的数据库集群的名称(您在创建数据库集群时分配该名称)。
- DECODER_PLUGIN:设置为要用于逻辑复制的解码插件,例如 pgoutput。如需详细了解各种解码插件,请参阅输出插件。
- DATABASE_NAME:设置为要将其更改流式传输到复制槽的数据库的名称。确保已在发布方集群中创建该数据库。
- APPLICATION_NAME(可选):设置为将连接到复制槽的应用名称。将流式传输模式设置为同步时,此字段为必填字段。
- REPLICATION_MODE(可选):对于异步复制,将其设置为 false。如果您希望启用同步复制,但需以降低速度为代价,请将此值设置为true。如果未明确设置,默认值为false。
- REPLICATION_SLOT_NAME:将创建并由订阅方使用的复制槽的名称,例如 logicalrepltestslot。
- REPLICATION_USER(可选):连接到复制槽的用户的名称。如果您设置了复制用户,则必须设置 Secret 名称、命名空间和密码。
- USER_PASSWORD_SECRET_NAME(可选):应用用户的 Kubernetes Secret 名称。如果设置了应用用户,则此内容是必需的。
- USER_PASSWORD_SECRET_NAMESPACE(可选):应用用户的 Kubernetes Secret 所在的命名空间。如果设置了应用用户,则此内容是必需的。
查看复制槽状态
如需查看复制槽的状态,请运行以下命令:
kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml
响应中包含 status 字段以及其他详细信息:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
...
...
status:
  conditions:
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Ready for replication
    reason: Ready
    status: "True"
    type: Ready
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Replication slot is not being used
    reason: Unhealthy
    status: "False"
    type: Healthy
  observedGeneration: 2
  upstream:
    host: DATABASE_ENDPOINT
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
    port: DATABASE_PORT
    replicationSlotName: REPLICATION_SLOT_NAME
    username: APPLICATION_USERDATABASE_ENDPOINT 显示您用于连接到数据库的 IP 地址。READY 列中的状态 TRUE 指示相应槽已准备好进行流式传输。当订阅方 DBCluster 或应用连接到复制槽时,HEALTHY 列中的状态会更改为 TRUE。
配置发布方集群
- 找到所需的 Pod。 - $ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
- 使用 - psql连接到发布方集群的主 Pod:- psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME- 替换以下内容: - IP_ADDRESS:发布方集群的主 Pod 的 IP 地址。
- USERNAME:数据库的 postgres 用户。
- DATABASE_NAME:订阅方要订阅的数据库。
 
- 如果复制资源中指定的 - DATABASE_NAME不存在,请创建一个数据库。- CREATE DATABASE DATABASE_NAME;
- 可选:为进行测试,可向数据库添加一个表并插入一些数据。您可以使用此数据来观察从发布方到订阅方的数据复制情况。 - $ psql -h localhost -U postgres DATABASE_NAME customer=# CREATE TABLE TABLE_NAME( customer(# ID INT PRIMARY KEY NOT NULL, customer(# NAME TEXT NOT NULL, customer(# AGE INT NOT NULL, customer(# SALARY REAL customer(# ); CREATE TABLE customer=# INSERT INTO TABLE_NAME (ID,NAME,AGE,SALARY) VALUES customer-# (1, 'Quinn', 25, 65000.00), customer-# (2, 'Kim', 22, 72250.00), customer-# (3, 'Bola', 31, 53000.00), customer-# (4, 'Sasha', 33, 105000.00), customer-# (5, 'Yuri', 27, 85000.00); INSERT 0 5 customer=# \dt List of relations Schema | Name | Type | Owner --------+---------+-------+---------- public | company | table | postgres (1 row) customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)- 将 TABLE_NAME 替换为您要存储数据且订阅方会订阅的表。 
- 授予权限: - GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER; GRANT USAGE ON SCHEMA public TO REPLICATION_USER; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO REPLICATION_USER;
- 通过运行以下命令创建发布内容: - CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;- 替换以下内容: - PUBLICATION_NAME:订阅方将用于订阅的发布内容名称。
 
创建发布内容后,您可以设置订阅方集群以进行逻辑复制,也可以配置应用以开始复制。
限制
- 不支持更新复制槽配置。如需更新配置,请删除复制槽,然后使用更新后的配置重新创建复制槽。 - 如需删除复制槽,请运行以下命令: - kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
- 您只能在发布方数据库上配置逻辑复制槽。复制 API 不支持逻辑复制订阅方 DBCluster 或应用。 
- 如果复制对象引用的数据库集群为实现高可用性进行了配置,则在发生故障切换后,系统会在提升的备用数据库集群上重新创建逻辑复制槽。重新创建复制槽后,数据流在槽中的位置将不再可用,订阅该数据流的所有应用都必须重新连接并重放该数据流。