使用 AlloyDB Omni Kubernetes operator 配置复制槽

本文档介绍了如何在 AlloyDB Omni 中创建逻辑复制槽。AlloyDB Omni 中的逻辑复制用于将特定数据更改从源数据库(发布方)持续流式传输到其他数据库或应用(订阅方)。流式传输的更改可以是单个行的更新、插入或删除。订阅者通过唯一的复制槽连接到发布者,以确保持久连接。永久连接会维持数据流式传输状态,因此如果发生中断,流式传输会从上次中断的位置继续。

如需详细了解 PostgreSQL 中的逻辑复制,请参阅逻辑复制

配置发布方和订阅方集群

在创建复制槽之前,您必须先创建启用了逻辑复制的发布方集群和订阅方集群。必须在相应的清单中将 wal_level 参数设置为 logical

如需创建启用了逻辑复制的发布商数据库集群,请创建并应用 DBCluster 清单。

以下是发布商清单示例:

apiVersion: v1
kind: Secret
metadata:
  name: db-pw-mydbc
type: Opaque
data:
  mydbc: "Q2hhbmdlTWUxMjM="
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: mydbc
spec:
  databaseVersion: "15.7.0"
  spec:
  availability:
    numberOfStandbys: 1
  primarySpec:
    parameters:
      wal_level: "logical"
    adminUser:
      passwordRef:
        name: db-pw-mydbc
    resources:
      cpu: 1
      memory: 8Gi
      disks:
      - name: DataDisk
        size: 10Gi

如需创建启用了逻辑复制的订阅方数据库集群,请创建并应用 DBCluster 清单。

以下是订阅方清单示例:

apiVersion: v1
kind: Secret
metadata:
  name: db-pw-subscriber
type: Opaque
data:
  subscriber: "Q2hhbmdlTWUxMjM=" #ChangeMe123
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: subscriber
spec:
  databaseVersion: "15.7.0"
  primarySpec:
    parameters:
      wal_level: "logical"
    adminUser:
      passwordRef:
        name: db-pw-subscriber
    resources:
      memory: 10Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 40Gi
—

创建复制槽

创建发布方集群和订阅方集群后,您可以在发布方集群中使用 Replication 资源创建逻辑复制槽。每个 Replication 资源都与相应的数据库集群资源相关联。一个数据库集群可以有多个逻辑复制资源与其相关联。

如需在发布商集群中配置复制槽,请应用以下清单:

apiVersion: v1
kind: Secret
metadata:
  name: USER_PASSWORD_SECRET_NAME
  namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
data:
  rep-user-pw: BASE64_ENCODED_PASSWORD
---
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

替换以下内容:

  • 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:将要创建并由订阅方使用的复制槽的名称。
  • REPLICATION_USER(可选):连接到复制槽的用户的名称。如果您设置了复制用户,则必须设置密钥名称、命名空间和密码。
  • USER_PASSWORD_SECRET_NAME(可选):应用用户的 Kubernetes Secret 名称。如果设置了应用用户,则必须指定该字段。
  • USER_PASSWORD_SECRET_NAMESPACE(可选):应用用户的 Kubernetes Secret 所在的命名空间。如果设置了应用用户,则必须指定该字段。
  • BASE64_ENCODED_PASSWORD(可选):应用用户的 base64 编码密码。如果设置了应用用户,则必须指定该字段。

向复制用户授予权限

如需向发布商集群中的复制用户授予复制和发布权限,请按以下步骤操作:

  1. 使用 psql 连接到发布商集群的主 pod:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    替换以下内容:

    • IP_ADDRESS:发布商集群的主 pod 的 IP 地址。
    • USERNAME:数据库的 postgres 用户。
    • DATABASE_NAME:订阅方要订阅的数据库。
  2. 授予权限:

    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;
    

创建发布和订阅

创建出版物

如需在发布商集群中创建发布,请按以下步骤操作:

  1. 使用 psql 连接到发布商集群的主 pod:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    替换以下内容:

    • IP_ADDRESS:发布商集群的主 pod 的 IP 地址。
    • USERNAME:数据库的 postgres 用户。
    • DATABASE_NAME:订阅方要订阅的数据库。
  2. 运行以下命令创建发布版本:

    CREATE PUBLICATION PUBLICATION_NAME;
    ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
    

    替换以下内容:

    • PUBLICATION_NAME:订阅者将用于订阅的出版物名称。
    • TABLE_NAME:订阅方要订阅的表。

创建订阅

如需在订阅方集群中创建订阅,请按以下步骤操作:

  1. 使用 psql 连接到订阅方集群的主 Pod:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    替换以下内容:

    • IP_ADDRESS:订阅方集群的主 pod 的 IP 地址。
    • USERNAME:数据库的 postgres 用户。
    • DATABASE_NAME:订阅方要订阅的数据库。
  2. 运行以下命令以创建订阅:

    CREATE SUBSCRIPTION SUBSCRIPTION_NAME CONNECTION 'host=IP_ADDRESS port=PORT user=REPLICATION_USER dbname=DATABASE_NAME password=PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name=REPLICATION_SLOT_NAME, create_slot=false);
    
    alter subscription SUBSCRIPTION_NAME refresh publication ;
    

    替换以下内容:

    • SUBSCRIPTION_NAME:订阅的名称。
    • IP_ADDRESS:发布商集群的主 pod 的 IP 地址。

发布方集群中对表所做的任何更新都会复制到订阅方集群中的表。

查看复制槽状态

如需查看复制槽的状态,请运行以下命令:

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_USER

DATABASE_ENDPOINT 会显示您用于连接到数据库的 IP 地址。READY 列中的状态 TRUE 表示该槽已准备好进行流式传输。当应用连接到复制槽时,HEALTHY 列中的状态会更改为 TRUE

限制

  • 不支持更新复制槽配置。如需更新配置,请删除复制槽,然后使用更新后的配置重新创建该槽。

    如需删除复制槽,请运行以下命令: kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE

  • 您只能在发布商数据库上配置逻辑复制槽。不支持订阅方配置。

  • 如果复制对象引用的数据库集群配置为高可用性,则在故障切换后,系统会在升级的待机服务器上重新创建逻辑复制槽。重新创建复制槽后,数据流在槽中的位置将不再可用,并且订阅该数据流的任何应用都必须重新连接并重放该数据流。

后续步骤