使用 AlloyDB Omni 進行邏輯複製

1. 簡介

本程式碼實驗室將說明如何設定獨立 AlloyDB Omni 執行個體之間的邏輯複寫。您將在單一 Compute Engine VM 上部署多個 AlloyDB Omni 執行個體,並使用 pglogical 擴充功能設定執行個體之間的複寫。

在單一節點上執行多個執行個體,有助於開發、測試或模擬複製環境。完成本程式碼研究室後,您將擁有可運作的複寫設定,其中一個執行個體做為供應商,另一個執行個體做為訂閱者。

必要條件

  • 透過 Google Cloud 控制台存取 Google Cloud 專案和 Cloud Shell。
  • 已安裝並設定 Google Cloud SDK (gcloud)。如要瞭解如何安裝 gcloud,請參閱 gcloud-install

課程內容

  • 說明如何使用 gcloud 建立及準備 Compute Engine VM,以供多個 AlloyDB Omni 執行個體使用。
  • 如何安裝 AlloyDB Omni RPM。
  • 如何使用 systemd 範本設定及初始化多個 AlloyDB Omni 執行個體。
  • 如何使用 pglogical 在 AlloyDB Omni 執行個體之間設定邏輯複寫。
  • 如何透過將資料從供應商複製到訂閱者來驗證複製作業。

軟硬體需求

  • 取得 AlloyDB Omni RPM 的網址連結。系統會將連結傳送至您的電子郵件地址,包括存放區網址伺服器的連結。初始化下列環境變數,讓網址在程式碼研究室中隨時可用。
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    
  • 可存取 Google Cloud 的終端機。您可以使用 Cloud Shell 達成這個目的。

2. 設定和需求條件

專案設定

建立 Google Cloud 專案

  1. 在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。

啟動 Cloud Shell

雖然您可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 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 位址的情況下建立,請設定 Cloud Router 和 Cloud NAT 閘道,讓 VM 存取外部套件存放區並下載必要軟體。
    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. 確認虛擬私有雲 (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. 建立符合規格的 Compute Engine VM 執行個體 (16 個 vCPU、20 GB 的平衡型永久磁碟、Rocky Linux 9)。為提升安全性,請使用 --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. 安裝 policycoreutils-python-utils 套件,以便設定 SELinux 政策。
    sudo dnf install -y policycoreutils-python-utils
    

5. 安裝 AlloyDB Omni

準備好 VM 後,您現在可以設定套件存放區,並安裝 AlloyDB Omni RPM 套件。

  1. 建立存放區設定檔,在 VM 上設定 YUM 存放區。將 $ALLOYDB_OMNI_REPOSITORY_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。

  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. 選用:為每個執行個體設定資源限制。這樣可避免單一執行個體耗用所有 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 設為寬鬆模式會停用強制執行功能,請謹慎使用。本程式碼研究室會使用這個工具簡化安裝程序。在實際工作環境中,請為 AlloyDB Omni 設定適當的 SELinux 政策,以便在強制執行模式下執行。設定完成後,您可以執行 sudo setenforce 1 重新啟用強制執行功能。
  2. 為 PostgreSQL postgres 管理員使用者定義高強度密碼。在本程式碼研究室中,這兩個執行個體都使用這個密碼。
    export PGPASSWORD="YourStrongPassword123!"
    
    注意:本程式碼研究室為了簡化程序,使用指令列上的環境變數傳遞密碼 (例如 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 擴充功能,在兩個執行個體之間設定邏輯複製。在這個情境中,inst1 會做為供應者,inst2 則會做為訂閱者。

注意:本程式碼研究室使用 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. 為 inst2 設定您為 inst1 設定的設定。
    # 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 範本。
  • 如何在不同通訊埠上初始化、設定及啟動多個獨立服務。
  • 如何驗證每個執行個體的獨立性。

瞭解詳情