使用跨資料中心複製功能

選取文件版本:

本頁說明如何建立及使用 Kubernetes 中的次要資料庫叢集,藉此進行跨資料中心複製。

如需跨資料中心複製的概念總覽,請參閱「關於跨資料中心複製」。

事前準備

  • 確認主要和次要資料中心之間的網路連線穩定且延遲時間短,這對於跨資料中心複製作業的有效運作至關重要。
  • 安裝最新版 AlloyDB Omni 運算子,在主要資料中心的 Kubernetes 叢集和次要資料中心的 Kubernetes 叢集上部署 AlloyDB Omni。AlloyDB Omni 運算子 1.5.0 以上版本支援跨資料中心複製。
  • 在主要資料中心的 Kubernetes 叢集上建立 AlloyDB Omni 資料庫叢集
  • 請確認主要資料庫叢集中的主要和待命資料庫伺服器,有足夠的預先寫入記錄 (WAL) 空間,可容納複製到次要叢集所需的 WAL 檔案。尚未複製到次要叢集的資料會以 WAL 檔案的形式儲存在主要叢集。視主要和次要叢集之間的連線速度而定,您可能需要額外的磁碟空間。
  • 請注意次要資料庫高可用性待命節點 (預覽版) 的相關資訊: 如果 AlloyDB Omni 運算子版本和控制平面代理程式版本為 1.7.0 以上,次要資料庫叢集就能支援高可用性 (HA) 待命節點。

    與主要資料庫叢集上的高可用性待命資料庫不同,次要資料庫叢集上的高可用性待命資料庫會以非同步方式運作,直到次要資料庫叢集升級為主要資料庫為止。如果資料庫叢集角色在切換期間變更,HA 待命資源會自動變成同步或非同步。

建立次要資料庫叢集

如要建立 AlloyDB Omni 次要資料庫叢集,並啟用主要資料庫叢集的複製功能,請按照下列步驟操作:

  1. 確認 AlloyDB Omni 主要資料庫叢集已啟用外部連線。如果未啟用外部連線,請在資料庫叢集資訊清單的規格部分中新增下列內容:

    ...
    spec:
      ...
      allowExternalIncomingTraffic: true
     
  2. 如要搭配啟用高可用性 (HA) 的主要資料庫叢集使用跨資料中心複製功能,請確認主要資料庫叢集已啟用 replayReplicationSlotsOnStandbys 欄位:

    ...
    spec:
      ...
      availability:
        ...
        replayReplicationSlotsOnStandbys: true
     

    啟用這個欄位,並搭配下一個步驟說明的 logReplicationSlots,即可將次要資料庫叢集使用的複寫位置同步至所有 HA 待命資料庫。這項設定可協助新的高可用性主要資料庫保留任何尚未由次要資料庫叢集使用的預先寫入記錄 (WAL) 檔案,以便在容錯移轉或切換後,次要資料庫叢集能繼續複製資料,不會中斷。

  3. 如要在主要資料庫叢集上啟用複寫功能,請將類似下列的資訊清單套用至主要資料中心 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

    建議您啟用 logReplicationSlot 選項,並搭配啟用高可用性 (HA) 的主要資料庫叢集,確保複製作業在容錯移轉或切換後仍可繼續運作。

    等待複製狀態就緒。

  4. 如要取得用於在次要資料庫叢集上設定複製功能的上游連線資訊,請執行下列指令:

    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"
      }
      
  5. 請記下輸出內容,因為您需要這項資訊,才能在下一個步驟中啟用次要資料庫叢集的複製功能。
  6. 在次要資料中心的 Kubernetes 叢集上建立 AlloyDB Omni 叢集,設定與主要資料庫叢集完全相同。
  7. 確認 AlloyDB Omni 次要資料庫叢集已啟用外部連線
  8. 如果未啟用外部連線,請在資訊清單的規格部分中加入下列內容:

    ...
    spec:
      ...
      allowExternalIncomingTraffic: true
  9. 如要在次要資料庫叢集上啟用複製功能,請將類似下列的資訊清單套用至次要資料中心的 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

成功設定次要資料庫叢集,並從主要資料庫叢集進行串流複製作業後,複製狀態會顯示「就緒」和「正常」。

升級次要資料庫叢集

升級次要資料庫叢集時,請先確認次要資料庫叢集已套用從主要資料庫叢集收到的所有交易。

  1. 如要確認叢集是否已準備就緒且運作正常,請檢查次要資料庫叢集的複製狀態。
    kubectl get replication SECONDARY_REPLICATION_NAME
  2. 停止寫入主要資料庫叢集。在主要資料庫叢集上執行檢查點,然後在主要資料庫叢集上執行下列查詢,檢查次要資料庫的複製延遲。確認結果顯示的延遲時間極短。
    1. 執行檢查點,將記憶體排清至磁碟。
      psql -h PRIMARY_HOST -U postgres -d postgres -c 'CHECKPOINT;'
    2. 檢查複製延遲。最佳延遲值為 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;'

  3. 將次要資料庫叢集的複寫資訊清單 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

執行切換作業

執行切換作業前,請確認兩個資料中心的主要和次要資料庫叢集都已上線,且資料庫叢集處於正常狀態。

如要在切換期間強制執行主要和次要資料庫叢集的資料一致性,請按照下列步驟操作,確認次要資料庫叢集已套用從主要資料庫叢集收到的所有交易:

  1. 檢查次要資料庫叢集的複製狀態,確認叢集已準備就緒且運作正常。
    kubectl get replication SECONDARY_REPLICATION_NAME
  2. 停止寫入主要資料庫叢集。在主要資料庫叢集上執行檢查點,然後在主要資料庫叢集上執行下列查詢,檢查次要資料庫的複製延遲。
    1. 執行檢查點,將記憶體排清至磁碟。
      psql -h PRIMARY_HOST -U postgres -d postgres -c 'CHECKPOINT;'
    2. 確認結果顯示的延遲值為 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;'
  3. 如要將次要叢集升級為主要叢集,請按照下列步驟操作:

    1. 如要將 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

      SECONDARY_DB_CLUSTER_NAME 替換為次要資料庫叢集的名稱,例如 dbc-2

      等待複製狀態就緒。

    2. 如要取得複製的上游連線資訊,請執行下列指令:

      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"
        }
      
    3. 如要將 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

      等待複製狀態變成就緒且正常。

    4. 如要驗證複製狀態,請執行下列指令:

      kubectl get replication REPLICATION_NAME

執行非預期的災難復原

如果發生 DR 容錯移轉,請按照下列步驟操作:

  1. 如要將 AlloyDB Omni 次要資料庫叢集轉換為主要資料庫叢集,請在次要資料中心 Kubernetes 叢集上更新該叢集的複寫資訊清單。詳情請參閱「執行切換作業」一文中的步驟 3a。
  2. 如要將先前的主要資料庫叢集轉換為次要資料庫叢集,從新的主要資料庫複製資料 (角色反轉),請等待原始主要資料庫恢復運作。在下游複製設定中使用 rewind 控制項,判斷轉換是否正常運作。如果遇到問題,請改用 setup 控制項。