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 專案
- 在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
啟動 Cloud Shell
雖然您可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是雲端執行的指令列環境。

- 開啟 Google Cloud 控制台,然後點選右上角工具列中的 Cloud Shell 圖示。您也可以透過下列任一方式開啟 Cloud Shell:
- 如果您使用 Google Cloud 控制台,請依序按下 G 和 S 鍵。
- 按一下這個連結。
Cloud Shell 通常需要一些時間才能完成佈建作業並連線至環境。這項作業完成後,您會看到類似以下的輸出內容:

3. 建立 Compute Engine VM
在本節中,請使用 gcloud 指令列工具建立單一 Compute Engine 虛擬機器 (VM)。使用與 AlloyDB Omni RPM 完全相容的 Rocky Linux 9 映像檔。
- 為專案 ID、VM 名稱、可用區和區域定義環境變數。
export PROJECT="your-project-id" export INSTANCE_NAME="alloydb-omni-multi-vm" export ZONE="us-central1-c" export REGION="us-central1" - 使用 Google Cloud 帳戶登入,並設定預設專案。
gcloud auth login gcloud config set project $PROJECT - 如要允許使用 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" - 由於 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 - 確認虛擬私有雲 (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 - 建立符合規格的 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 - 建立 VM 後,請確認 VM 的狀態。
gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
4. 準備 VM
在本節中,您將連線至新建立的 VM,並準備作業系統環境。
- 使用 IAP 透過 SSH 連線至 VM。由於 VM 沒有公開 IP 位址,
gcloud會自動透過 IAP 建立 SSH 連線通道。gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap - 定義基本資料目錄的環境變數。
export BASE_PGDATA="/var/lib/alloydbomni" - 建立基本資料目錄。
sudo mkdir -p $BASE_PGDATA - 安裝
policycoreutils-python-utils套件,以便設定 SELinux 政策。sudo dnf install -y policycoreutils-python-utils
5. 安裝 AlloyDB Omni
準備好 VM 後,您現在可以設定套件存放區,並安裝 AlloyDB Omni RPM 套件。
- 建立存放區設定檔,在 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 - 更新 YUM 快取。
sudo yum makecache - 安裝 AlloyDB Omni RPM 套件 18 版。
sudo dnf install -y alloydbomni18
6. 設定多個執行個體
在本節中,請設定兩個執行個體:inst1 和 inst2。
- 如要支援多個執行個體,請建立
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 - 重新載入
systemd管理員設定,以識別新的範本服務。sudo systemctl daemon-reload - 為 AlloyDB Omni 執行個體建立設定目錄。
sudo mkdir -p /etc/alloydbomni - 設定
inst1的資料目錄。sudo tee /etc/alloydbomni/inst1.conf << EOF PGDATA=/var/lib/alloydbomni/inst1 EOF - 設定
inst2的資料目錄。sudo tee /etc/alloydbomni/inst2.conf << EOF PGDATA=/var/lib/alloydbomni/inst2 EOF - 設定設定檔的適當權限。
sudo chmod 640 /etc/alloydbomni/*.conf sudo chown postgres:postgres /etc/alloydbomni/*.conf - 為兩個執行個體建立資料目錄,並設定正確的擁有權。
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 - 選用:為每個執行個體設定資源限制。這樣可避免單一執行個體耗用所有 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% EOFinst2: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. 初始化及準備資料庫
分別初始化及準備每個資料庫執行個體。
- 將 SELinux 設定為寬鬆模式。
注意:將 SELinux 設為寬鬆模式會停用強制執行功能,請謹慎使用。本程式碼研究室會使用這個工具簡化安裝程序。在實際工作環境中,請為 AlloyDB Omni 設定適當的 SELinux 政策,以便在強制執行模式下執行。設定完成後,您可以執行sudo setenforce 0sudo setenforce 1重新啟用強制執行功能。 - 為 PostgreSQL
postgres管理員使用者定義高強度密碼。在本程式碼研究室中,這兩個執行個體都使用這個密碼。 注意:本程式碼研究室為了簡化程序,使用指令列上的環境變數傳遞密碼 (例如export PGPASSWORD="YourStrongPassword123!"PGPASSWORD=$PGPASSWORD),但這可能會在程序清單中公開密碼。在實際工作環境中,請使用更安全的方法,例如.pgpass檔案或密鑰管理工具。
設定 inst1
- 初始化
inst1的資料庫目錄。sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst1 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb - 更新執行個體的
postgresql.conf檔案,將執行個體設定為監聽通訊埠5433。sudo sed -i \ "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5433/" \ /var/lib/alloydbomni/inst1/postgresql.conf - 準備 AlloyDB Omni 適用的資料庫執行個體。
sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst1 \ PGPORT=5433 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
設定 inst2
- 初始化
inst2的資料庫目錄。sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst2 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb - 將執行個體設定為監聽通訊埠
5434。sudo sed -i \ "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5434/" \ /var/lib/alloydbomni/inst2/postgresql.conf - 準備資料庫執行個體。
sudo PGPASSWORD=$PGPASSWORD \ PGDATA=/var/lib/alloydbomni/inst2 \ PGPORT=5434 \ /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
8. 啟動 AlloyDB Omni 服務
現在可以啟動這兩個執行個體的 systemd 服務。
- 如要辨識新設定和覆寫項目,請重新載入
systemd管理員設定。sudo systemctl daemon-reload - 啟用並啟動
inst1服務。sudo systemctl enable alloydbomni18@inst1 sudo systemctl start alloydbomni18@inst1 - 啟用並啟動
inst2服務。sudo systemctl enable alloydbomni18@inst2 sudo systemctl start alloydbomni18@inst2 - 確認這兩項服務都已啟用並正在執行。
確認兩者的輸出內容都顯示sudo systemctl status alloydbomni18@inst1 sudo systemctl status alloydbomni18@inst2Active: active (running)。
9. 驗證 AlloyDB Omni 執行個體
確認兩個執行個體都能正常運作,且彼此獨立。
- 連線至「
inst1」(通訊埠 5433)。系統會提示您輸入在「初始化及準備資料庫」中設定的密碼。/usr/lib/postgresql/18/bin/psql -h localhost -p 5433 -U postgres -W - 執行查詢來驗證連線。
postgres=# SELECT version(); - 中斷與執行個體的連線。
postgres=# \q - 連線至「
inst2」(連接埠 5434)。/usr/lib/postgresql/18/bin/psql -h localhost -p 5434 -U postgres -W - 執行查詢來驗證連線。
postgres=# SELECT version(); - 中斷與執行個體的連線。
postgres=# \q
10. 設定 pglogical 複製功能
使用 pglogical 擴充功能,在兩個執行個體之間設定邏輯複製。在這個情境中,inst1 會做為供應者,inst2 則會做為訂閱者。
注意:本程式碼研究室使用 postgres 超級使用者進行複製連線。在實際工作環境中,請建立具備 REPLICATION 權限的專屬複製使用者,並只授予該使用者要複製的資料表存取權。
設定 pglogical 執行個體
- 在
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 - 為
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 - 如要套用設定變更,請重新啟動這兩個執行個體。
sudo systemctl restart alloydbomni18@inst1 sudo systemctl restart alloydbomni18@inst2
設定複製角色和資料表
- 在
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; " - 在
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 節點和訂閱項目
- 在
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'); " - 初始化 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 複寫
在供應商上插入資料,並在訂閱者上查詢資料,確認複製作業是否正常運作。
- 確認訂閱方案有效。系統可能需要幾秒鐘才能切換至
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'; " - 請先確認輸出內容顯示
replicating,再繼續操作。 - 在供應器 (
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!'); " - 如要確認資料是否已複製,請在
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 執行個體。
- 停止並停用
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 - 停止並停用
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 - 重新載入 systemd 管理員設定,並重設失敗的單元。
sudo systemctl daemon-reload sudo systemctl reset-failed
清理 Google Cloud 資源
清除執行個體後,請刪除 Compute Engine VM 和其他資源。
- 中斷與 SSH 工作階段的連線。
exit - 刪除 Compute Engine VM 執行個體。
gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet - 刪除防火牆規則。
gcloud compute firewall-rules delete allow-ssh-alloydb-omni --project=$PROJECT --quiet - 刪除 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 - 刪除預設網際網路路由。
gcloud compute routes delete default-internet-route --project=$PROJECT --quiet
13. 恭喜
您已成功在單一 Compute Engine VM 上部署及設定多個 AlloyDB Omni 執行個體。
涵蓋內容
- 如何佈建及準備 Compute Engine VM。
- 如何安裝 AlloyDB Omni RPM。
- 如何為多個執行個體設定
systemd範本。 - 如何在不同通訊埠上初始化、設定及啟動多個獨立服務。
- 如何驗證每個執行個體的獨立性。
瞭解詳情
- 如要進一步瞭解安裝和設定,請參閱 AlloyDB Omni 說明文件。
- 如要進一步瞭解本程式碼研究室使用的複製擴充功能,請參閱 pglogical 說明文件。