本页介绍了如何在 Kubernetes 中创建和使用次要数据库集群,以使用跨数据中心复制。
如需了解跨数据中心复制的概念概览,请参阅跨数据中心复制简介。
准备工作
- 安装 AlloyDB Omni Operator 1.1.0 或更高版本,以便在主数据中心的 Kubernetes 集群和次要数据中心的 Kubernetes 集群上部署 AlloyDB Omni。
- 在主数据中心的 Kubernetes 集群上创建 AlloyDB Omni 数据库集群。
创建次要数据库集群
如需创建 AlloyDB Omni 次要数据库集群并启用从主数据库集群复制数据的功能,请按以下步骤操作:
Kubernetes
确保在 AlloyDB Omni 主数据库集群上启用了外部连接。如果未启用外部连接,请在数据库集群清单的规范部分添加以下内容:
kind: DBCluster spec: allowExternalIncomingTraffic: true
如需在主数据库集群上启用复制,请将类似于以下内容的清单应用到主数据中心的 Kubernetes 集群:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-DB_CLUSTER_NAME type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: REPLICATION_NAME spec: dbcluster: name: DB_CLUSTER_NAME upstream: password: name: ha-rep-pw-DB_CLUSTER_NAME
替换以下内容:
DB_CLUSTER_NAME
:数据库集群的名称,例如dbc-1
。ENCODED_PASSWORD
:要从次要数据库复制数据时要使用的用户的密码,编码为 base64 字符串,例如Q2hhbmdlTWUxMjM= for ChangeMe123
。默认值为alloydbreplica
。REPLICATION_NAME
:复制的名称,例如replication-1
。
等待复制状态变为“就绪”。
如需获取用于在辅助数据库集群上配置复制的上游连接信息,请运行以下命令:
kubectl get replication REPLICATION_NAME
kubectl get replication REPLICATION_NAME -o json | jq .status.upstream
示例输出类似于以下内容:
{ "host": "35.230.32.36", "password": { "name": "ha-rep-pw-dbc-1" }, "port": 5432, "replicationSlotName": "dbc_1_replication_1", "username": "alloydbreplica" }
记下输出,因为您需要在下一步中在次要数据库集群上启用复制功能。
在次要数据中心的 Kubernetes 集群上创建 AlloyDB Omni 集群,其配置与主数据库集群相同。
确保已在 AlloyDB Omni 次要数据库集群上启用外部连接。
如果未启用外部连接,请将以下内容添加到其清单的规范部分:
allowExternalIncomingTraffic: true
如需在次要数据库集群上启用复制功能,请将类似于以下内容的清单应用到次要数据中心的 Kubernetes 集群:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: SECONDARY_REPLICATION_NAME spec: dbcluster: name: SECONDARY_DB_CLUSTER_NAME downstream: host: PRIMARY_HOST port: PRIMARY_PORT username: alloydbreplica password: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME replicationSlotName: PRIMARY_REPLICATION_SLOT control: setup
替换以下内容:
SECONDARY_DB_CLUSTER_NAME
:辅助数据库集群的名称,例如dbc-2
。ENCODED_PASSWORD
:要用于复制主数据库集群的数据库用户的密码,编码为 base64 字符串,例如Q2hhbmdlTWUxMjM= for ChangeMe123
。默认值为alloydbreplica
。SECONDARY_REPLICATION_NAME
:复制的名称,例如replication-2
。PRIMARY_HOST
:第 3 步输出中主数据库集群的连接端点,辅助数据库可以访问该端点以进行复制。PRIMARY_PORT
:第 3 步输出中主数据库集群的连接端口,辅助数据库可以访问该端口以进行复制。PRIMARY_REPLICATION_SLOT
:第 3 步输出中主数据库集群上的复制槽的名称,辅助数据库可以使用该槽进行复制。
查看次要数据库集群上的复制
如需查看 AlloyDB Omni 辅助数据库集群及其复制状态的详细信息,请运行以下命令:
Kubernetes
kubectl get dbcluster SECONDARY_DB_CLUSTER_NAME
kubectl get replication SECONDARY_REPLICATION_NAME
当次要数据库集群成功设置且从主数据库集群进行流式复制时,复制状态为“准备就绪”且处于正常状态。
提升次要数据库集群
在提升次要数据库集群之前,请执行以下步骤,验证次要数据库集群是否已应用从主数据库集群收到的所有事务:
Kubernetes
检查辅助数据库集群的复制状态,确保其已就绪且运行正常。
kubectl get replication SECONDARY_REPLICATION_NAME
停止对主数据库集群的所有写入操作。在主数据库集群上运行以下查询,以检查辅助数据库的复制延迟时间。确认结果显示的延迟时间非常短。
理想情况下,延迟值应为 0。如果延迟时间大于 0,您仍然可以提升次要数据库集群,但可能会丢失已在主数据库集群上提交的一些近期事务。
psql -h PRIMARY_HOST -U postgres -d postgres -c 'SELECT application_name, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag FROM pg_stat_replication;'
如需将次要数据库集群提升为主要数据库集群,请将次要数据库集群的复制清单的 control 字段更新为 promote
,并将其应用于次要数据中心的 Kubernetes 集群。
Kubernetes
apiVersion: v1
kind: Secret
metadata:
name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
type: Opaque
data:
rep-user-pw: "ENCODED_PASSWORD"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: SECONDARY_REPLICATION_NAME
spec:
dbcluster:
name: SECONDARY_DB_CLUSTER_NAME
downstream:
host: PRIMARY_HOST
port: PRIMARY_PORT
username: alloydbreplica
password:
name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
replicationSlotName: PRIMARY_REPLICATION_SLOT
control: promote
执行切换
在执行切换之前,请验证两个数据中心的主数据库集群和次要数据库集群是否均处于在线状态,以及数据库集群是否处于健康状态。
为确保主数据库集群和次要数据库集群在切换期间的数据一致性,请按以下步骤验证次要数据库集群是否已应用从主数据库集群收到的所有事务:
Kubernetes
检查辅助数据库集群的复制状态,确保其已就绪且运行正常。
kubectl get replication SECONDARY_REPLICATION_NAME
停止对主数据库集群的所有写入操作。在主数据库集群上运行以下查询,以检查辅助数据库的复制延迟时间。确认结果显示的延迟值为
0
。psql -h PRIMARY_HOST -U postgres -d postgres -c 'SELECT application_name, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag FROM pg_stat_replication;'
如需执行切换,请完成以下步骤:
Kubernetes
如需将 AlloyDB Omni 次要数据库集群转换为主数据库集群,请按照以下步骤在次要数据中心的 Kubernetes 集群上更新其复制清单:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: SECONDARY_REPLICATION_NAME spec: dbcluster: name: SECONDARY_DB_CLUSTER_NAME upstream: password: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
等待复制状态变为“就绪”。
如需获取复制操作的上游连接信息,请运行以下命令:
kubectl get replication SECONDARY_REPLICATION_NAME
kubectl get replication SECONDARY_REPLICATION_NAME -o json | jq .status.upstream
示例输出类似于以下内容:
{ "host": "34.23.207.137", "password": { "name": "ha-rep-pw-dbc-2" }, "port": 5432, "replicationSlotName": "dbc_2_replication_2", "username": "alloydbreplica" }
如需将 AlloyDB Omni 主数据库集群转换为次要数据库集群,请在主数据中心的 Kubernetes 集群上更新其复制清单,类似如下所示:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-DB_CLUSTER_NAME type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: REPLICATION_NAME spec: dbcluster: name: DB_CLUSTER_NAME downstream: host: SECONDARY_HOST port: SECONDARY_PORT username: alloydbreplica password: name: ha-rep-pw-DB_CLUSTER_NAME replicationSlotName: SECONDARY_REPLICATION_SLOT control: rewind
等待复制状态变为“就绪”且正常运行。
如需验证复制状态,请使用以下命令:
kubectl get replication REPLICATION_NAME