クロスデータセンター レプリケーションのコンセプトの概要については、クロスデータセンター レプリケーションについてをご覧ください。
始める前に
- プライマリ データセンターとセカンダリ データセンターの間に、信頼性が高く低レイテンシなネットワーク接続性が確保されていることを確認してください。これは、クロスデータセンター レプリケーションを効果的に機能させるために不可欠です。
- AlloyDB Omni Operator の最新バージョンをインストールして、プライマリ データセンターの Kubernetes クラスタとセカンダリ データセンターの Kubernetes クラスタに AlloyDB Omni をデプロイします。クロスデータセンター レプリケーションは、AlloyDB Omni Operator バージョン 1.5.0 以降でサポートされています。
- プライマリ データセンターの Kubernetes クラスタに AlloyDB Omni データベース クラスタを作成します。
- プライマリ データベース クラスタ内のプライマリ サーバーとスタンバイ サーバーに、セカンダリ クラスタへのレプリケーションに必要な WAL ファイルを格納できる十分な Write-Ahead Logging(WAL)領域が確保されていることを確認してください。セカンダリ クラスタにまだ複製されていないデータは、プライマリ クラスタ内に WAL ファイルとして保存されます。そのため、プライマリ クラスタとセカンダリ クラスタ間の接続速度によっては、この目的のために追加のディスク容量が必要になることがあります。
セカンダリ データベース クラスタを作成する
AlloyDB Omni セカンダリ データベース クラスタを作成し、プライマリ データベース クラスタからのレプリケーションを有効にするには、次の操作を行います。
- AlloyDB Omni プライマリ データベース クラスタで外部接続が有効になっていることを確認します。外部接続が有効になっていない場合は、データベース クラスタ マニフェストの spec セクションに次の行を追加します。 - ... spec: ... allowExternalIncomingTraffic: true 
- 高可用性(HA)が有効になっているプライマリ データベース クラスタでクロスデータセンター レプリケーションを使用するには、プライマリ データベース クラスタで - replayReplicationSlotsOnStandbysフィールドが有効になっていることを確認します。- ... spec: ... availability: ... replayReplicationSlotsOnStandbys: true - このフィールドと、次の手順で説明する - logReplicationSlotsを有効にすると、セカンダリ データベース クラスタで使用されるレプリケーション スロットがすべての HA スタンバイに同期されます。この構成により、フェイルオーバーまたはスイッチオーバーの後、新しい HA プライマリが、セカンダリ データベース クラスタでまだ使用されていない write-ahead log 書き込みWAL ファイルを保持できるようになり、レプリケーションを停止なく再開できます。
- プライマリ データベース クラスタでレプリケーションを有効にするには、プライマリ データセンターの 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です。
 - フェイルオーバーまたはスイッチオーバーの後にレプリケーションが引き続き動作するよう、高可能性(HA)が有効になっているプライマリ データベース クラスタでは - logReplicationSlotオプションを有効にすることをおすすめします。- レプリケーション ステータスが準備完了になるまで待ちます。 
- セカンダリ データベース クラスタでレプリケーションを構成するために使用されるアップストリーム接続情報を取得するには、次のコマンドを実行します。 - 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 セクションに次の行を追加します。 - ... spec: ... allowExternalIncomingTraffic: true 
- セカンダリ データベース クラスタでレプリケーションを有効にするには、次のようなマニフェストをセカンダリ データセンターの 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: 手順 3 の出力から取得したプライマリ データベース クラスタの接続エンドポイント。セカンダリ データベースがこのエンドポイントからレプリケーションにアクセスします。
- PRIMARY_PORT: 手順 3 の出力から取得したプライマリ データベース クラスタの接続ポート。セカンダリ データベースは、このポートを介してレプリケーションにアクセスします。
- PRIMARY_REPLICATION_SLOT: 手順 3 の出力にあるプライマリ データベース クラスタのレプリケーション スロットの名前。セカンダリ データベースはこのスロットをレプリケーションに使用します。
 
セカンダリ データベース クラスタのレプリケーションを表示する
AlloyDB Omni セカンダリ データベース クラスタとそのレプリケーション ステータスの詳細を表示するには、次のコマンドを実行します。
kubectl get dbcluster SECONDARY_DB_CLUSTER_NAME kubectl get replication SECONDARY_REPLICATION_NAME
セカンダリ データベース クラスタが正常に設定され、プライマリ データベース クラスタからのストリーミング レプリケーションが設定されている場合、レプリケーション ステータスは「準備完了」と「正常」の両方になります。
セカンダリ データベース クラスタをプロモートする
セカンダリ データベース クラスタをプロモートする前に、次の手順で、セカンダリ データベース クラスタがプライマリ データベース クラスタから受け取ったすべてのトランザクションを適用していることを確認します。
- セカンダリ データベース クラスタのレプリケーション ステータスを確認して、準備完了で正常な状態であることを確認します。 - 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 クラスタに適用します。
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
切り替えを行う
スイッチオーバーを実行する前に、両方のデータセンターに属するプライマリ データベース クラスタとセカンダリ データベース クラスタがオンラインであり、データベース クラスタが正常な状態であることを確認します。
カットオーバー中にプライマリ データベース クラスタとセカンダリ データベース クラスタのデータ整合性を確保するには、次の手順で、セカンダリ データベース クラスタがプライマリ データベース クラスタから受け取ったすべてのトランザクションを適用していることを確認します。
- セカンダリ データベース クラスタのレプリケーション ステータスを確認して、準備完了で正常な状態であることを確認します。 - 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;' 
スイッチオーバーの手順は次のとおりです。
- 
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 レプリケーション ステータスが準備完了になるまで待ちます。 
- レプリケーションのアップストリーム接続情報を取得するには、次のコマンドを実行します。 - 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