本文說明如何在 AlloyDB Omni 中建立邏輯複寫位置。在 PostgreSQL 中,邏輯複製是將資料變更從發布端資料庫複製到一或多個訂閱端的方法,訂閱端可以是資料庫或其他應用程式。您可以在使用 AlloyDB Omni Kubernetes Operator 建立的叢集上,啟用及設定邏輯複寫。
串流變更可以是個別列的更新、插入或刪除。 訂閱者會透過專屬的複製時段連線至發布者,確保連線保持不中斷。持續性連線會維護資料串流狀態,因此如果發生中斷,串流作業會從中斷處繼續。
如要進一步瞭解 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 GB。舉例來說,如果您先前在這個資訊清單中將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 (選用):連線至複製運算單元的使用者名稱。如果設定了複寫使用者,就必須設定密鑰名稱、命名空間和密碼。
- 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_USER
DATABASE_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 或應用程式。
如果複寫物件參照的資料庫叢集已設定高可用性,則在容錯移轉後,升級的待命資料庫會重新建立邏輯複寫位置。重新建立複製運算單元後,運算單元中的串流位置將無法再使用,訂閱串流的任何應用程式都必須重新連線並重播串流。