AlloyDB Omni での論理レプリケーション

1. はじめに

この Codelab では、独立した AlloyDB Omni インスタンス間で論理レプリケーションを構成する方法について説明します。単一の Compute Engine VM に複数の AlloyDB Omni インスタンスをデプロイし、pglogical 拡張機能を使用してインスタンス間のレプリケーションを設定します。

単一ノードで複数のインスタンスを実行することは、開発、テスト、レプリケーション環境のシミュレーションに役立ちます。この Codelab を終了すると、1 つのインスタンスがプロバイダとして機能し、もう 1 つのインスタンスがサブスクライバーとして機能する、動作するレプリケーション設定が完成します。

前提条件

  • Google Cloud コンソールから Google Cloud プロジェクトと Cloud Shell にアクセスする。
  • Google Cloud SDK(gcloud)のインストールと構成。gcloud のインストールの詳細については、gcloud-install をご覧ください。

学習内容

  • gcloud を使用して複数の AlloyDB Omni インスタンス用に Compute Engine VM を作成して準備する方法。
  • AlloyDB Omni RPM をインストールする方法。
  • systemd テンプレートを使用して複数の AlloyDB Omni インスタンスを構成して初期化する方法。
  • pglogical を使用して AlloyDB Omni インスタンス間の論理レプリケーションを構成する方法。
  • プロバイダからサブスクライバーにデータを複製して、レプリケーションを検証する方法。

必要なもの

  • AlloyDB Omni RPM の URL リンクを取得します。リポジトリ URL サーバーへのリンクを含むリンクがメールで送信されます。次の環境変数を初期化して、Codelab で使用する URL を準備します。
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    
  • Google Cloud にアクセスできるターミナル。この目的には Cloud Shell を使用できます。

2. 設定と要件

プロジェクトの設定

Google Cloud プロジェクトを作成する

  1. Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、クラウドで実行されるコマンドライン環境である Google Cloud Shell を使用します。

Cloud Shell をアクティブにするアイコン

  1. Google Cloud コンソールを開き、右上のツールバーにある Cloud Shell アイコンをクリックします。次のいずれかの方法で Cloud Shell を開くこともできます。

通常、Cloud Shell のプロビジョニングと環境への接続には数分かかります。このオペレーションが完了すると、次のような出力が表示されます。

環境が接続されたことを示す Google Cloud Shell ターミナル

3. Compute Engine VM を作成する

このセクションでは、gcloud コマンドライン ツールを使用して単一の Compute Engine 仮想マシン(VM)を作成します。AlloyDB Omni RPM と完全に互換性のある Rocky Linux 9 イメージを使用します。

  1. プロジェクト ID、VM 名、ゾーン、リージョンの環境変数を定義します。
    export PROJECT="your-project-id"
    export INSTANCE_NAME="alloydb-omni-multi-vm"
    export ZONE="us-central1-c"
    export REGION="us-central1"
    
  2. Google Cloud アカウントを使用してログインし、デフォルト プロジェクトを構成します。
    gcloud auth login
    gcloud config set project $PROJECT
    
  3. Identity-Aware Proxy(IAP)を使用して VM への SSH 接続を許可するには、ファイアウォール ルールを作成します。
    gcloud compute firewall-rules create allow-ssh-alloydb-omni \
        --project=$PROJECT \
        --direction=INGRESS \
        --action=allow \
        --rules=tcp:22 \
        --source-ranges="0.0.0.0/0"
    
  4. VM はパブリック IP アドレスなしで作成されるため、VM が外部パッケージ リポジトリにアクセスして必要なソフトウェアをダウンロードできるように、Cloud Router と Cloud NAT ゲートウェイを構成します。
    gcloud compute routers create alloydb-omni-router \
        --project=$PROJECT \
        --network=default \
        --region=$REGION
    
    gcloud compute routers nats create alloydb-omni-nat \
        --project=$PROJECT \
        --router=alloydb-omni-router \
        --region=$REGION \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips
    
  5. Virtual Private Cloud(VPC)ネットワークに有効なデフォルトのインターネット ゲートウェイ ルートがあることを確認します。このルートは、Cloud NAT がアウトバウンド トラフィックをインターネットに転送するために必要です。
    gcloud compute routes create default-internet-route \
        --project=$PROJECT \
        --network=default \
        --destination-range=0.0.0.0/0 \
        --next-hop-gateway=default-internet-gateway
    
  6. 必要な仕様(16 個の vCPU、20 GB のバランス永続ディスク、Rocky Linux 9)で Compute Engine VM インスタンスを作成します。セキュリティを強化するには、--no-address フラグを使用して、VM にパブリック IP アドレスが割り当てられないようにします。
    gcloud compute instances create $INSTANCE_NAME \
        --project=$PROJECT \
        --zone=$ZONE \
        --machine-type=n2-highmem-16 \
        --image-family=rocky-linux-9 \
        --image-project=rocky-linux-cloud \
        --boot-disk-size=20GB \
        --boot-disk-type=pd-balanced \
        --no-address
    
  7. VM を作成したら、VM のステータスを確認します。
    gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
    

4. VM を準備する

このセクションでは、新しく作成した VM に接続して、オペレーティング システム環境を準備します。

  1. IAP を使用して SSH 経由で VM に接続します。VM にパブリック IP アドレスがないため、gcloud は IAP を介して SSH 接続を自動的にトンネリングします。
    gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap
    
  2. ベース データ ディレクトリの環境変数を定義します。
    export BASE_PGDATA="/var/lib/alloydbomni"
    
  3. ベース データ ディレクトリを作成します。
    sudo mkdir -p $BASE_PGDATA
    
  4. SELinux ポリシーを構成できるように、policycoreutils-python-utils パッケージをインストールします。
    sudo dnf install -y policycoreutils-python-utils
    

5. AlloyDB Omni をインストールする

VM の準備ができたら、パッケージ リポジトリを構成して AlloyDB Omni RPM パッケージをインストールできます。

  1. リポジトリ構成ファイルを作成して、VM で YUM リポジトリを構成します。$ALLOYDB_OMNI_REPOSITORY_URL は、受け取った URL に置き換えます。
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF
    [alloydbomni]
    name=alloydbomni
    baseurl=$ALLOYDB_OMNI_REPOSITORY_URL
    enabled=1
    repo_gpgcheck=0
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    EOF
    
  2. YUM キャッシュを更新します。
    sudo yum makecache
    
  3. AlloyDB Omni RPM パッケージのバージョン 18 をインストールします。
    sudo dnf install -y alloydbomni18
    

6. 複数のインスタンスを構成する

このセクションでは、inst1 と inst2 の 2 つのインスタンスを構成します。

  1. 複数のインスタンスをサポートするには、systemd テンプレート サービス ファイル alloydbomni18@.service を作成します。
    sudo tee /etc/systemd/system/alloydbomni18@.service << EOF
    [Unit]
    Description=AlloyDB Omni Database server instance %I
    After=syslog.target
    After=network-online.target
    
    [Service]
    SyslogIdentifier=alloydbomni-%I
    Type=notify
    
    User=postgres
    Group=postgres
    
    # Load configuration for the instance
    EnvironmentFile=/etc/alloydbomni/%I.conf
    
    OOMScoreAdjust=-1000
    Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
    Environment=PG_OOM_ADJUST_VALUE=0
    
    ExecStartPre=/usr/lib/postgresql/18/bin/alloydbomni18-check-db-dir \${PGDATA}
    ExecStart=/usr/lib/postgresql/18/bin/postgres -D \${PGDATA}
    ExecReload=/bin/kill -HUP \$MAINPID
    
    KillMode=mixed
    KillSignal=SIGINT
    
    TimeoutSec=0
    TimeoutStartSec=0
    TimeoutStopSec=1h
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
  2. systemd マネージャー構成を再読み込みして、新しいテンプレート サービスを認識します。
    sudo systemctl daemon-reload
    
  3. AlloyDB Omni インスタンスの構成ディレクトリを作成します。
    sudo mkdir -p /etc/alloydbomni
    
  4. inst1 のデータ ディレクトリを構成します。
    sudo tee /etc/alloydbomni/inst1.conf << EOF
    PGDATA=/var/lib/alloydbomni/inst1
    EOF
    
  5. inst2 のデータ ディレクトリを構成します。
    sudo tee /etc/alloydbomni/inst2.conf << EOF
    PGDATA=/var/lib/alloydbomni/inst2
    EOF
    
  6. 構成ファイルに適切な権限を設定します。
    sudo chmod 640 /etc/alloydbomni/*.conf
    sudo chown postgres:postgres /etc/alloydbomni/*.conf
    
  7. 両方のインスタンスのデータ ディレクトリを作成し、正しい所有権を設定します。
    sudo mkdir -p /var/lib/alloydbomni/inst1
    sudo mkdir -p /var/lib/alloydbomni/inst2
    sudo chown -R postgres:postgres /var/lib/alloydbomni
    sudo chmod 750 /var/lib/alloydbomni/inst1 /var/lib/alloydbomni/inst2
    
  8. 省略可: 各インスタンスのリソース上限を設定します。これにより、1 つのインスタンスがすべての VM リソースを消費することを防ぐことができます。両方のインスタンスの systemd オーバーライド ディレクトリとファイルを作成します。注: 次の構成で使用されているリソース上限(40%)は、値の例です。特定のワークロードと VM 容量に基づいて上限を調整します。inst1 の場合:
    sudo mkdir -p /etc/systemd/system/alloydbomni18@inst1.service.d
    sudo tee /etc/systemd/system/alloydbomni18@inst1.service.d/override.conf << EOF
    [Service]
    CPUQuota=40%
    MemoryMax=40%
    EOF
    
    inst2 の場合:
    sudo mkdir -p /etc/systemd/system/alloydbomni18@inst2.service.d
    sudo tee /etc/systemd/system/alloydbomni18@inst2.service.d/override.conf << EOF
    [Service]
    CPUQuota=40%
    MemoryMax=40%
    EOF
    

7. データベースを初期化して準備する

各データベース インスタンスを個別に初期化して準備します。

  1. セットアップ用に SELinux を制限なしモードに構成します。
    sudo setenforce 0
    
    注意: SELinux を permissive モードに設定すると、適用が無効になるため、慎重に使用する必要があります。この Codelab では、インストールを簡素化するために使用します。本番環境では、AlloyDB Omni が enforcing モードで実行されるように、適切な SELinux ポリシーを構成します。セットアップ後に sudo setenforce 1 を実行して、適用を再度有効にできます。
  2. PostgreSQL postgres 管理者ユーザーの安全なパスワードを定義します。このパスワードは、この Codelab の両方のインスタンスで使用されます。
    export PGPASSWORD="YourStrongPassword123!"
    
    注: この Codelab では、コマンドラインで環境変数を使用してパスワードを渡す(PGPASSWORD=$PGPASSWORD など)方法を簡略化のために使用していますが、この方法ではプロセス リストにパスワードが公開される可能性があります。本番環境では、.pgpass ファイルやシークレット マネージャーなどのより安全な方法を使用します。

inst1 を設定する

  1. inst1 のデータベース ディレクトリを初期化します。
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst1 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  2. postgresql.conf ファイルを更新して、ポート 5433 でリッスンするようにインスタンスを構成します。
    sudo sed -i \
      "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5433/" \
      /var/lib/alloydbomni/inst1/postgresql.conf
    
  3. AlloyDB Omni 用にデータベース インスタンスを準備します。
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst1 \
      PGPORT=5433 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    

inst2 をセットアップする

  1. inst2 のデータベース ディレクトリを初期化します。
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst2 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  2. ポート 5434 でリッスンするようにインスタンスを構成します。
    sudo sed -i \
      "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5434/" \
      /var/lib/alloydbomni/inst2/postgresql.conf
    
  3. データベース インスタンスを準備します。
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst2 \
      PGPORT=5434 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    

8. AlloyDB Omni サービスを開始する

これで、両方のインスタンスの systemd サービスを開始できます。

  1. 新しい構成とオーバーライドを認識するには、systemd マネージャー構成を再読み込みします。
    sudo systemctl daemon-reload
    
  2. inst1 のサービスを有効にして開始します。
    sudo systemctl enable alloydbomni18@inst1
    sudo systemctl start alloydbomni18@inst1
    
  3. inst2 のサービスを有効にして開始します。
    sudo systemctl enable alloydbomni18@inst2
    sudo systemctl start alloydbomni18@inst2
    
  4. 両方のサービスが有効で実行されていることを確認します。
    sudo systemctl status alloydbomni18@inst1
    sudo systemctl status alloydbomni18@inst2
    
    両方の出力に Active: active (running) が示されていることを確認します。

9. AlloyDB Omni インスタンスを確認する

両方のインスタンスが正しく機能し、独立していることを確認します。

  1. inst1(ポート 5433)に接続します。データベースを初期化して準備するで構成したパスワードの入力を求められます。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 -U postgres -W
    
  2. クエリを実行して接続を確認します。
    postgres=# SELECT version();
    
  3. インスタンスから切断します。
    postgres=# \q
    
  4. inst2(ポート 5434)に接続します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 -U postgres -W
    
  5. クエリを実行して接続を確認します。
    postgres=# SELECT version();
    
  6. インスタンスから切断します。
    postgres=# \q
    

10. pglogical レプリケーション用に構成する

pglogical 拡張機能を使用して、2 つのインスタンス間の論理レプリケーションを構成します。このシナリオでは、inst1 はプロバイダとして機能し、inst2 はサブスクライバーとして機能します。

注: この Codelab では、レプリケーション接続に postgres スーパーユーザーを使用します。本番環境では、REPLICATION 権限を持つ専用のレプリケーション ユーザーを作成し、レプリケートされるテーブルへのアクセス権のみを付与します。

pglogical 用にインスタンスを構成する

  1. shared_preload_libraries で pglogical を有効にし、postgresql.conf で inst1 の他のレプリケーション パラメータを構成します。
    # Append pglogical to shared_preload_libraries
    sudo sed -i \
      "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \
      /var/lib/alloydbomni/inst1/postgresql.conf
    
    # Append replication settings
    sudo tee -a /var/lib/alloydbomni/inst1/postgresql.conf << EOF
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    max_worker_processes = 20
    track_commit_timestamp = on
    alloydb.enable_pglogical = on
    alloydb.logical_decoding = on
    EOF
    
  2. inst1 で構成した inst2 の設定を構成します。
    # Append pglogical to shared_preload_libraries
    sudo sed -i \
      "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \
      /var/lib/alloydbomni/inst2/postgresql.conf
    
    # Append replication settings
    sudo tee -a /var/lib/alloydbomni/inst2/postgresql.conf << EOF
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    max_worker_processes = 20
    track_commit_timestamp = on
    alloydb.enable_pglogical = on
    alloydb.logical_decoding = on
    EOF
    
  3. 構成の変更を適用するには、両方のインスタンスを再起動します。
    sudo systemctl restart alloydbomni18@inst1
    sudo systemctl restart alloydbomni18@inst2
    

レプリケーションのロールとテーブルを設定する

  1. inst1(プロバイダ、ポート 5433)で、レプリケーション ロールとレプリケートするテーブルを作成します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      DO \$\$
      BEGIN
        IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN
          CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123';
        END IF;
      END
      \$\$;
      GRANT ALL ON SCHEMA public TO app_owner;
      CREATE TABLE IF NOT EXISTS replication_test (
          id SERIAL PRIMARY KEY,
          data TEXT,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      ALTER TABLE replication_test OWNER TO app_owner;
    "
    
  2. inst2(サブスクライバー、ポート 5434)で、同じロールとテーブル構造を作成します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "
      DO \$\$
      BEGIN
        IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN
          CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123';
        END IF;
      END
      \$\$;
      GRANT ALL ON SCHEMA public TO app_owner;
      CREATE TABLE IF NOT EXISTS replication_test (
          id SERIAL PRIMARY KEY,
          data TEXT,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      ALTER TABLE replication_test OWNER TO app_owner;
    "
    

pglogical ノードとサブスクリプションを構成する

  1. inst1 で pglogical プロバイダ ノードを初期化します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      CREATE EXTENSION IF NOT EXISTS pglogical;
      SELECT pglogical.create_node(
          node_name := 'provider',
          dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
      SELECT pglogical.replication_set_add_table('default', 'replication_test');
    "
    
  2. pglogical サブスクライバー ノードを初期化し、inst2 にサブスクリプションを作成します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "
      CREATE EXTENSION IF NOT EXISTS pglogical;
      SELECT pglogical.create_node(
          node_name := 'subscriber',
          dsn := 'host=127.0.0.1 port=5434 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
      SELECT pglogical.create_subscription(
          subscription_name := 'test_subscription',
          provider_dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
    "
    
    注: サブスクリプションを作成した後、最初の同期が完了するまでに時間がかかることがあります。

11. pglogical レプリケーションを検証する

プロバイダにデータを挿入し、サブスクライバーでクエリを実行して、レプリケーションが想定どおりに機能していることを確認します。

  1. サブスクリプションが有効であることを確認します。replicating に切り替わるまでに数秒かかることがあります。
    /usr/lib/postgresql/18/bin/psql -t -A -h localhost -p 5434 \
      -U postgres -d postgres -c "
      SELECT status FROM pglogical.show_subscription_status() WHERE subscription_name = 'test_subscription';
      "
    
  2. 続行する前に、出力に replicating が表示されていることを確認します。
  3. プロバイダ(inst1)にテスト行を挿入します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      INSERT INTO replication_test (data) VALUES ('Hello from replication provider!');
    "
    
  4. データが複製されたことを確認するには、inst2 のテーブルにクエリを実行します。
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "SELECT * FROM replication_test;"
    
    inst1 に挿入された行が表示されることを確認します。

12. クリーンアップ

リソースをクリーンアップします。まず、VM 上の AlloyDB Omni インスタンスを破棄してから、Google Cloud リソースを削除します。

AlloyDB Omni インスタンスを破棄する

VM を削除する前に、サービスを停止して無効にし、構成とデータを削除して AlloyDB Omni インスタンスをクリーンアップできます。

  1. inst1 のサービスを停止して無効にし、データと構成を削除します。
    sudo systemctl stop alloydbomni18@inst1
    sudo systemctl disable alloydbomni18@inst1
    sudo rm -rf /var/lib/alloydbomni/inst1
    sudo rm -f /etc/alloydbomni/inst1.conf
    
  2. inst2 のサービスを停止して無効にし、データと構成を削除します。
    sudo systemctl stop alloydbomni18@inst2
    sudo systemctl disable alloydbomni18@inst2
    sudo rm -rf /var/lib/alloydbomni/inst2
    sudo rm -f /etc/alloydbomni/inst2.conf
    
  3. systemd マネージャー構成を再読み込みし、失敗したユニットをリセットします。
    sudo systemctl daemon-reload
    sudo systemctl reset-failed
    

Google Cloud リソースをクリーンアップする

インスタンスをクリーンアップしたら、Compute Engine VM とその他のリソースを削除します。

  1. SSH セッションから切断します。
    exit
    
  2. Compute Engine VM インスタンスを削除します。
    gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet
    
  3. ファイアウォール ルールを削除します。
    gcloud compute firewall-rules delete allow-ssh-alloydb-omni --project=$PROJECT --quiet
    
  4. Cloud NAT とルーターを削除します。
    gcloud compute routers nats delete alloydb-omni-nat --router=alloydb-omni-router --region=$REGION --project=$PROJECT --quiet
    gcloud compute routers delete alloydb-omni-router --region=$REGION --project=$PROJECT --quiet
    
  5. デフォルトのインターネット ルートを削除します。
    gcloud compute routes delete default-internet-route --project=$PROJECT --quiet
    

13. 完了

これで、単一の Compute Engine VM に複数の AlloyDB Omni インスタンスをデプロイして構成できました。

学習した内容

  • Compute Engine VM をプロビジョニングして準備する方法。
  • AlloyDB Omni RPM をインストールする方法。
  • 複数のインスタンスに対して systemd テンプレートを構成する方法。
  • 異なるポートで複数の独立したサービスを初期化、構成、起動する方法。
  • 各インスタンスの独立性を確認する方法。

詳細