使用跨資料中心複製功能

選取說明文件版本:

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

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

事前準備

  • 安裝 AlloyDB Omni 運算子 1.1.0 以上版本,在主要資料中心的 Kubernetes 叢集和次要資料中心的 Kubernetes 叢集上部署 AlloyDB Omni。
  • 在主要資料中心的 Kubernetes 叢集上建立 AlloyDB Omni 資料庫叢集

建立次要資料庫叢集

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

Kubernetes

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

      kind: DBCluster
      spec:
       allowExternalIncomingTraffic: true
    
  2. 如要搭配啟用 HA 的主要資料庫叢集使用跨資料中心複製功能,請確保主要資料庫叢集中的主要和待命資料庫伺服器都有足夠的預先寫入記錄 (WAL) 空間,可容納複製到次要叢集所需的 WAL 檔案。設定資料庫叢集資訊清單的規格部分,為 AlloyDB Omni 主要資料庫叢集設定 WAL 大小:

      kind: DBCluster
      spec:
        primarySpec:
          parameters:
            wal_keep_size: WAL_KEEP_SIZE
            max_wal_size: MAX_WAL_SIZE
    

    更改下列內容:

    • WAL_KEEP_SIZE:儲存在 WAL 目錄中的 WAL 檔案大小下限,以防次要伺服器需要擷取這些檔案進行串流複製。如果連線至主要伺服器的次要伺服器落後超過 wal_keep_size MB,主要伺服器可能會移除次要伺服器需要的 WAL 區段。此時,複製連線會終止。因此,下游連線最終也會失敗。根據 WAL 產生率、複製網路特性,以及部署主要和次要資料庫叢集的資料中心之間的複製延遲,將 WAL_KEEP_SIZE 設為符合工作負載需求的值。預設值為 100 MB。
    • MAX_WAL_SIZE:自動資料庫檢查點期間,WAL 成長的上限。預設值為 1504 MB。這個值必須高於 wal_keep_size 值。
  3. 如要在主要資料庫叢集上啟用複寫功能,請將類似下列的資訊清單套用至主要資料中心內的 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

    等待複製狀態就緒。

  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
      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

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

    等待複製狀態就緒。

  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