クロスデータセンター レプリケーションのコンセプトの概要については、クロスデータセンター レプリケーションについてをご覧ください。
始める前に
- AlloyDB Omni Operator バージョン 1.1.0 以降をインストールして、プライマリ データセンターの Kubernetes クラスタとセカンダリ データセンターの Kubernetes クラスタに AlloyDB Omni をデプロイします。
- プライマリ データセンターの Kubernetes クラスタに AlloyDB Omni データベース クラスタを作成します。
セカンダリ データベース クラスタを作成する
AlloyDB Omni セカンダリ データベース クラスタを作成し、プライマリ データベース クラスタからのレプリケーションを有効にするには、次の操作を行います。
Kubernetes
- AlloyDB Omni プライマリ データベース クラスタで外部接続が有効になっていることを確認します。外部接続が有効になっていない場合は、データベース クラスタ マニフェストの spec セクションに次の行を追加します。 - kind: DBCluster spec: allowExternalIncomingTraffic: true
- プライマリ データベース クラスタでレプリケーションを有効にするには、プライマリ データセンターの 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
 - レプリケーション ステータスが準備完了になるまで待ちます。 
- セカンダリ データベース クラスタでレプリケーションを構成するために使用されるアップストリーム接続情報を取得するには、次のコマンドを実行します。 - 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 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_NAMEkubectl 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
- 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- レプリケーション ステータスが準備完了になるまで待ちます。 
- レプリケーションのアップストリーム接続情報を取得するには、次のコマンドを実行します。 - 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