このページのコード スニペットは、モデルとして使用できる例です。値は、AlloyDB Omni リソースの値に置き換えてください。
始める前に
- Kubernetes に Omni Operator をインストールしてください。
- レプリケーション スロット、パブリッシャー クラスタ、パブリケーションを作成してください。詳細については、レプリケーション スロットとパブリケーションを作成するをご覧ください。
サブスクライバー クラスタを作成して構成する
サブスクライバー クラスタを作成します。
$ cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: db-pw-DB_CLUSTER_NAME type: Opaque data: DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: subscriber spec: databaseVersion: "15.7.0" primarySpec: adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: memory: MEMORY_SIZE cpu: CPU_COUNT disks: - name: DataDisk size: DISK_SIZE EOF
次のように置き換えます。
DB_CLUSTER_NAME
: このデータベース クラスタの名前。例:subscriber-cluster
ENCODED_PASSWORD
: デフォルトのpostgres
ユーザーロールのデータベース ログイン パスワード。base64 文字列としてエンコードされます。例:ChangeMe123
の場合はQ2hhbmdlTWUxMjM=
CPU_COUNT
: このデータベース クラスタ内の各データベース インスタンスで使用できる CPU の数。MEMORY_SIZE
: このデータベース クラスタのデータベース インスタンスあたりのメモリ量。CPU ごとに 8 GB に設定することをおすすめします。たとえば、このマニフェストの前半でcpu
を2
に設定した場合は、memory
を16Gi
に設定することをおすすめします。DISK_SIZE
: データベース インスタンスあたりのディスクサイズ(例:10Gi
)。
必要な Pod を見つけます。
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
サブスクライバー クラスタ データベース Pod にログインします。
$ kubectl get pod NAME READY STATUS RESTARTS AGE al-2bce-publisher-0 3/3 Running 0 20h $ kubectl exec -ti SUBSCRIBER_POD_NAME -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-3513-subscriber-0:/$
SUBSCRIBER_POD_NAME
は、サブスクライバー Pod の名前に置き換えます。パブリッシャー DBCluster のロードバランサの IP アドレスを確認します(例:
10.116.14.190
)。$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE al-publisher-rw-ilb ClusterIP 10.116.14.190 <none> 5432/TCP 21h
パブリッシャー データベースに公開されたデータの初期コピーとして、パブリッシャーからスキーマ バックアップを取得します。論理レプリケーションは DDL レプリケーションをサポートしていません。論理レプリケーションの開始前に、複製するスキーマまたはテーブルが宛先(サブスクライバー クラスタ)に存在している必要があります。
postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
PUBLISHER_IP_ADDRESS
は、パブリッシャー DBCluster のロードバランサの IP アドレスに置き換えます。サブスクライバー データベースにバックアップを適用します。
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
省略可: テーブルにデータがないことを確認します。
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
データベースのサブスクリプションを作成します。パブリッシャー DBCluster にパブリケーションがすでに作成されていることを確認します。
postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
次のように置き換えます。
- REPLICATION_USER: レプリケーション スロットに接続するユーザーの名前。
- DATABASE_NAME: レプリケーション スロットから変更をストリーミングするデータベースの名前に設定します。
- PUBLISHER_CLUSTER_PASSWORD: パブリッシャー DBCluster の
postgres
ユーザーのデータベース ログイン パスワード。 - PUBLICATION_NAME: サブスクライバーが登録しているパブリケーションの名前。
- REPLICATION_SLOT_NAME: パブリッシャー DBCluster に作成されたレプリケーション スロットの名前。
省略可: サブスクライバー クラスタでレプリケーションを確認します。
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from public.company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
パブリッシャー クラスタで、テーブルに行を追加します。
# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
TABLE_NAME は、サブスクライバーが登録しているパブリッシャー DBCluster 内のテーブルの名前に置き換えます。
サブスクライバー クラスタで、パブリッシャー クラスタのテーブルに追加された行が、サブスクライバー クラスタのテーブルに複製されていることを確認します。
# On the subscriber database, data is synced. postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 6 | Alex | 39 | 100000 (6 rows)
追加のテーブルを手動で作成する
論理レプリケーションでは、pglogical
の replicate_ddl_command
とは異なり、DDL の変更は自動的に同期されません。オープンソース ツール pgl_ddl_deploy
にはソリューションが用意されていますが、サブスクライバーで DDL コマンドを手動で実行することもできます。
試しに、パブリッシャー クラスタの
customer
データベースにfinance
という新しいテーブルを作成します。# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# insert into finance values ('critical data'); INSERT 0 1 customer=# ALTER PUBLICATION pub_customer ADD TABLE finance; ALTER PUBLICATION
新しいテーブルがパブリッシャー クラスタに追加されたら、サブスクライバーで DDL(テーブルの作成)を手動で適用し、サブスクライバー クラスタで次のコマンドを実行してレプリケーションを確認します。
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION; ALTER SUBSCRIPTION customer=# select * from finance; row --------------- critical data (1 row)