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

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

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

始める前に

  • AlloyDB Omni Operator バージョン 1.1.0 以降をインストールして、プライマリ データセンターの Kubernetes クラスタとセカンダリ データセンターの Kubernetes クラスタに AlloyDB Omni をデプロイします。
  • プライマリ データセンターの Kubernetes クラスタに AlloyDB Omni データベース クラスタを作成します。

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

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

Kubernetes

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

      kind: DBCluster
      spec:
       allowExternalIncomingTraffic: true
    
  2. プライマリ データベース クラスタでレプリケーションを有効にするには、プライマリ データセンターの 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)。

    レプリケーション ステータスが「準備完了」になるまで待ちます。

  3. セカンダリ データベース クラスタでレプリケーションを構成するために使用されるアップストリーム接続情報を取得するには、次のコマンドを実行します。

      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"
      }
    
  4. 次のステップでセカンダリ データベース クラスタでレプリケーションを有効にするために、出力をメモしておきます。

  5. プライマリ データベース クラスタと同じ構成で、セカンダリ データセンターの Kubernetes クラスタに AlloyDB Omni クラスタを作成します。

  6. AlloyDB Omni セカンダリ データベース クラスタで外部接続が有効になっていることを確認します。

  7. 外部接続が有効になっていない場合は、マニフェストの spec セクションに次の行を追加します。

     allowExternalIncomingTraffic: true
    
  8. セカンダリ データベース クラスタでレプリケーションを有効にするには、次のようなマニフェストをセカンダリ データセンターの 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