クロスデータセンター レプリケーションを使用する

このページでは、Kubernetes でセカンダリ データベース クラスタを作成して操作し、クロスデータセンター レプリケーションを使用する方法について説明します。

クロスデータセンター レプリケーションのコンセプトの概要については、クロスデータセンター レプリケーションについてをご覧ください。

始める前に

  • AlloyDB Omni Operator バージョン 1.1.0 以降をインストールして、プライマリ データセンターの Kubernetes クラスタとセカンダリ データセンターの Kubernetes クラスタに AlloyDB Omni をデプロイします。
  • プライマリ データセンターの Kubernetes クラスタに AlloyDB Omni データベース クラスタを作成します。 高可用性(HA)が有効になっているプライマリ データベース クラスタでは、クロスデータセンター レプリケーションはサポートされていません。クロスデータセンター レプリケーションを有効にするには、プライマリ データベース クラスタで HA が無効になっていることを確認します。

セカンダリ データベース クラスタを作成する

AlloyDB Omni セカンダリ データベース クラスタを作成し、プライマリ データベース クラスタからのレプリケーションを有効にするには、次の操作を行います。

Kubernetes

  1. AlloyDB Omni プライマリ データベース クラスタで外部接続が有効になっていることを確認します。外部接続が有効になっていない場合は、データベース クラスタ マニフェストの spec セクションに次の行を追加します。

      kind: DBCluster
      spec:
       allowExternalIncomingTraffic: true
    
  2. HA が有効になっているプライマリ データベース クラスタでクロスデータセンター レプリケーションを使用するには、データベース クラスタ マニフェストの spec セクションを設定して、AlloyDB Omni プライマリ データベース クラスタで HA を無効にする必要があります。

      kind: DBCluster
      spec:
         availability:
           numberOfStandbys: 0
    
  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 より大きい場合でも、セカンダリ データベース クラスタをプロモートできますが、プライマリ データベース クラスタですでに commit されている最近のトランザクションが失われる可能性があります。

     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