このページでは、Kubernetes でセカンダリ データベース クラスタを作成して操作し、クロスデータセンター レプリケーションを使用する方法について説明します。
クロスデータセンター レプリケーションのコンセプトの概要については、クロスデータセンター レプリケーションについてをご覧ください。
始める前に
- 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_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
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