確認 AlloyDB Omni 主要資料庫叢集已啟用外部連線。如果未啟用外部連線,請在資料庫叢集資訊清單的規格部分中新增下列內容:
... spec: ... allowExternalIncomingTraffic: true
如要搭配啟用高可用性 (HA) 的主要資料庫叢集使用跨資料中心複製功能,請確認主要資料庫叢集已啟用
replayReplicationSlotsOnStandbys欄位:... spec: ... availability: ... replayReplicationSlotsOnStandbys: true
啟用這個欄位,並搭配下一個步驟說明的
logReplicationSlots,即可將次要資料庫叢集使用的複寫位置同步至所有 HA 待命資料庫。這項設定可協助新的高可用性主要資料庫保留容錯移轉或切換後,次要資料庫叢集尚未使用的任何預先寫入記錄 (WAL) 檔案,以便在不中斷的情況下繼續複製。如要在主要資料庫叢集上啟用複寫功能,請將類似下列的資訊清單套用至主要資料中心 Kubernetes 叢集:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-DB_CLUSTER_NAME namespace: DB_CLUSTER_NAMESPACE type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: REPLICATION_NAME namespace: DB_CLUSTER_NAMESPACE spec: dbcluster: name: DB_CLUSTER_NAME upstream: password: name: ha-rep-pw-DB_CLUSTER_NAME logReplicationSlot: true
更改下列內容:
DB_CLUSTER_NAME:資料庫叢集的名稱,例如dbc-1。ENCODED_PASSWORD:用於從次要資料庫複製資料的資料庫使用者密碼,以 Base64 字串編碼,例如Q2hhbmdlTWUxMjM= for ChangeMe123。預設值為alloydbreplica。REPLICATION_NAME:複寫的名稱,例如replication-1。LOG_REPLICATION_SLOT:將複製時段資料記錄到 WAL 檔案。如要啟用這個選項,請將值設為true。預設值為false。
建議您為已啟用高可用性 (HA) 的主要資料庫叢集啟用
logReplicationSlot選項,確保在容錯移轉或切換後,複寫作業仍可繼續運作。等待複製狀態就緒。
如要取得用於在次要資料庫叢集上設定複製功能的上游連線資訊,請執行下列指令:
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 次要資料庫叢集已啟用外部連線
如果未啟用外部連線,請在資訊清單的規格部分中加入下列內容:
... spec: ... allowExternalIncomingTraffic: true
- 如要在次要資料庫叢集上啟用複製功能,請將類似下列的資訊清單套用至次要資料中心的 Kubernetes 叢集:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME namespace: SECONDARY_DB_CLUSTER_NAMESPACE type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: SECONDARY_REPLICATION_NAME namespace: SECONDARY_DB_CLUSTER_NAMESPACE 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:主要資料庫叢集的連線端點,可從步驟 4 的輸出內容取得,次要資料庫可存取該端點以進行複製。PRIMARY_PORT:主要資料庫叢集的連線埠,可從步驟 4 的輸出內容中取得,次要資料庫可存取此連線埠以進行複製。PRIMARY_REPLICATION_SLOT:主要資料庫叢集上的複寫時段名稱 (來自步驟 4 的輸出內容),次要資料庫可將此名稱用於複寫。
查看次要資料庫叢集的複製作業
如要查看 AlloyDB Omni 次要資料庫叢集的詳細資訊和複製狀態,請執行下列指令:
kubectl get dbcluster SECONDARY_DB_CLUSTER_NAME kubectl get replication SECONDARY_REPLICATION_NAME
升級次要資料庫叢集
升級次要資料庫叢集時,請先確認次要資料庫叢集已套用從主要資料庫叢集收到的所有交易。- 如要確認叢集是否已準備就緒且運作正常,請檢查次要資料庫叢集的複製狀態。
kubectl get replication SECONDARY_REPLICATION_NAME
- 停止寫入主要資料庫叢集。在主要資料庫叢集上執行檢查點,然後在主要資料庫叢集上執行下列查詢,檢查次要資料庫的複製延遲。確認結果顯示的延遲時間極短。
-
執行檢查點,將記憶體排清至磁碟。
psql -h PRIMARY_HOST -U postgres -d postgres -c 'CHECKPOINT;'
- 檢查複製延遲。最佳延遲值為
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 叢集上套用更新後的複寫資訊清單。
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME namespace: SECONDARY_DB_CLUSTER_NAMESPACE type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: SECONDARY_REPLICATION_NAME namespace: SECONDARY_DB_CLUSTER_NAMESPACE 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
執行切換作業
執行切換作業前,請確認兩個資料中心的主要和次要資料庫叢集都已上線,且資料庫叢集處於正常狀態。 為確保主要和次要資料庫叢集在切換期間的資料一致性,請按照下列步驟操作,確認次要資料庫叢集已套用主要資料庫叢集提供的所有交易:- 檢查次要資料庫叢集的複製狀態,確保叢集已準備就緒且運作正常。
kubectl get replication SECONDARY_REPLICATION_NAME
- 停止寫入主要資料庫叢集。在主要資料庫叢集上執行檢查點,然後在主要資料庫叢集上執行下列查詢,檢查次要資料庫的複製延遲。
-
執行檢查點,將記憶體排清至磁碟。
psql -h PRIMARY_HOST -U postgres -d postgres -c 'CHECKPOINT;'
-
確認結果顯示的延遲值為 `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;'
-
執行檢查點,將記憶體排清至磁碟。
-
如要將 AlloyDB Omni 次要資料庫叢集轉換為主要資料庫叢集,請在次要資料中心,按照下列步驟更新 Kubernetes 叢集上的複製資訊清單:
apiVersion: v1 kind: Secret metadata: name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME namespace: SECONDARY_DB_CLUSTER_NAMESPACE type: Opaque data: rep-user-pw: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: Replication metadata: name: SECONDARY_REPLICATION_NAME namespace: SECONDARY_DB_CLUSTER_NAMESPACE 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