本文档介绍了如何在 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 编码密码。如果设置了应用用户,则必须指定该字段。
向复制用户授予权限
如需向发布商集群中的复制用户授予复制和发布权限,请按以下步骤操作:
使用
psql
连接到发布商集群的主 pod:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
替换以下内容:
- IP_ADDRESS:发布商集群的主 pod 的 IP 地址。
- USERNAME:数据库的 postgres 用户。
- DATABASE_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;
创建发布和订阅
创建出版物
如需在发布商集群中创建发布,请按以下步骤操作:
使用
psql
连接到发布商集群的主 pod:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
替换以下内容:
- IP_ADDRESS:发布商集群的主 pod 的 IP 地址。
- USERNAME:数据库的 postgres 用户。
- DATABASE_NAME:订阅方要订阅的数据库。
运行以下命令创建发布版本:
CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
替换以下内容:
- PUBLICATION_NAME:订阅者将用于订阅的出版物名称。
- TABLE_NAME:订阅方要订阅的表。
创建订阅
如需在订阅方集群中创建订阅,请按以下步骤操作:
使用
psql
连接到订阅方集群的主 Pod:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
替换以下内容:
- IP_ADDRESS:订阅方集群的主 pod 的 IP 地址。
- USERNAME:数据库的 postgres 用户。
- DATABASE_NAME:订阅方要订阅的数据库。
运行以下命令以创建订阅:
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
您只能在发布商数据库上配置逻辑复制槽。不支持订阅方配置。
如果复制对象引用的数据库集群配置为高可用性,则在故障切换后,系统会在升级的待机服务器上重新创建逻辑复制槽。重新创建复制槽后,数据流在槽中的位置将不再可用,并且订阅该数据流的任何应用都必须重新连接并重放该数据流。