このページでは、Kubernetes でセカンダリ データベース クラスタを作成して操作し、クロスデータセンター レプリケーションを使用する方法について説明します。
クロスデータセンター レプリケーションのコンセプトの概要については、クロスデータセンター レプリケーションについてをご覧ください。
始める前に
- AlloyDB Omni Operator バージョン 1.1.0 以降をインストールして、プライマリ データセンターの Kubernetes クラスタとセカンダリ データセンターの Kubernetes クラスタに AlloyDB Omni をデプロイします。
- プライマリ データセンターの Kubernetes クラスタに AlloyDB Omni データベース クラスタを作成します。 高可用性(HA)が有効になっているプライマリ データベース クラスタでは、クロスデータセンター レプリケーションはサポートされていません。クロスデータセンター レプリケーションを有効にするには、プライマリ データベース クラスタで HA が無効になっていることを確認します。
セカンダリ データベース クラスタを作成する
AlloyDB Omni セカンダリ データベース クラスタを作成し、プライマリ データベース クラスタからのレプリケーションを有効にするには、次の操作を行います。
Kubernetes
AlloyDB Omni プライマリ データベース クラスタで外部接続が有効になっていることを確認します。外部接続が有効になっていない場合は、データベース クラスタ マニフェストの spec セクションに次の行を追加します。
kind: DBCluster spec: allowExternalIncomingTraffic: true
HA が有効になっているプライマリ データベース クラスタでクロスデータセンター レプリケーションを使用するには、データベース クラスタ マニフェストの spec セクションを設定して、AlloyDB Omni プライマリ データベース クラスタで HA を無効にする必要があります。
kind: DBCluster spec: availability: numberOfStandbys: 0
プライマリ データベース クラスタでレプリケーションを有効にするには、プライマリ データセンターの 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