1. Введение
В этом практическом занятии показано, как настроить логическую репликацию между независимыми экземплярами AlloyDB Omni. Вы развернете несколько экземпляров AlloyDB Omni на одной виртуальной машине Compute Engine и настроите репликацию между ними с помощью расширения pglogical .
Запуск нескольких экземпляров на одном узле полезен для разработки, тестирования или моделирования сред репликации. По завершении этого практического занятия у вас будет рабочая конфигурация репликации, где один экземпляр будет выступать в роли поставщика, а другой — в роли подписчика.
Предварительные требования
- Доступ к проекту Google Cloud и Cloud Shell из консоли Google Cloud.
- Google Cloud SDK (
gcloud) установлен и настроен. Подробную информацию об установке gcloud см. в инструкции по установке gcloud.
Что вы узнаете
- Как создать и подготовить виртуальную машину Compute Engine для нескольких экземпляров AlloyDB Omni с помощью
gcloud. - Как установить RPM-пакеты AlloyDB Omni.
- Как настроить и инициализировать несколько экземпляров AlloyDB Omni с помощью шаблонов
systemd. - Как настроить логическую репликацию между экземплярами AlloyDB Omni с помощью
pglogical. - Как проверить репликацию, реплицируя данные от поставщика к подписчику.
Что вам понадобится
- Получите URL-ссылку на RPM-пакеты AlloyDB Omni . Ссылки будут отправлены на вашу электронную почту, включая ссылку на сервер репозитория. Инициализируйте следующую переменную среды, чтобы URL-адрес оставался доступным для использования во время выполнения практического задания.
export ALLOYDB_OMNI_REPOSITORY_URL="..." - Рабочий терминал с доступом к Google Cloud. Для этой цели можно использовать Cloud Shell.
2. Настройка и требования
Настройка проекта
Создайте проект в Google Cloud.
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud .
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
Запустить Cloud Shell
Хотя вы можете управлять Google Cloud удаленно со своего ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

- Откройте консоль Google Cloud и нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу. Вы также можете открыть Cloud Shell одним из следующих способов:
- Если вы используете консоль Google Cloud, нажмите G, а затем S.
- Нажмите на эту ссылку .
Обычно Cloud Shell требуется несколько минут для подготовки среды и подключения к ней. После завершения этой операции вы увидите вывод, похожий на следующий:

3. Создайте виртуальную машину Compute Engine.
В этом разделе создайте одну виртуальную машину Compute Engine (VM) с помощью инструмента командной строки gcloud . Используйте образ Rocky Linux 9, который полностью совместим с RPM-пакетами AlloyDB Omni.
- Определите переменные среды для идентификатора вашего проекта, имени виртуальной машины, зоны и региона.
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 - Чтобы разрешить SSH-подключения к вашей виртуальной машине с использованием Identity-Aware Proxy (IAP), создайте правило брандмауэра.
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" - Поскольку виртуальная машина создается без публичного IP-адреса, настройте облачный маршрутизатор и шлюз 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 - Убедитесь, что в вашей виртуальной частной сети (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 с необходимыми характеристиками (16 виртуальных процессоров, 20 ГБ сбалансированного постоянного диска, Rocky Linux 9). Для повышения безопасности используйте флаг
--no-address, чтобы гарантировать, что виртуальной машине не будет назначен публичный 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 - После создания виртуальной машины проверьте её статус.
gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
4. Подготовка виртуальной машины
В этом разделе вы подключаетесь к созданной виртуальной машине и подготавливаете среду операционной системы.
- Подключитесь к виртуальной машине по SSH, используя IAP. Поскольку у виртуальной машины нет публичного IP-адреса,
gcloudавтоматически туннелирует SSH-соединение через IAP.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
После подготовки виртуальной машины вы можете настроить репозиторий пакетов и установить пакет AlloyDB Omni RPM.
- Настройте репозиторий 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 - Обновите кэш YUM.
sudo yum makecache - Установите RPM-пакет AlloyDB Omni версии 18.
sudo dnf install -y alloydbomni18
6. Настройка нескольких экземпляров
В этом разделе настройте два экземпляра: inst1 и inst2 .
- Для поддержки нескольких экземпляров создайте файл шаблона службы
systemdalloydbomni18@.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 - Необязательно: установите ограничения на ресурсы для каждого экземпляра. Это предотвратит потребление всех ресурсов виртуальной машины одним экземпляром. Создайте каталоги и файлы переопределения
systemdдля обоих экземпляров. Примечание: используемые в следующих конфигурациях ограничения на ресурсы (40%) являются примерными значениями. Настройте ограничения в зависимости от вашей конкретной рабочей нагрузки и мощности виртуальной машины.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 в разрешающий режим отключает принудительное применение правил и должен использоваться с осторожностью. В этом практическом задании он используется для упрощения установки. В производственной среде настройте соответствующие политики SELinux для AlloyDB Omni, чтобы он работал в режиме принудительного применения правил. Вы можете повторно включить принудительное применение правил после настройки, выполнив команду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 - Настройте экземпляр для прослушивания порта
5433, обновив файлpostgresql.conf.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
- Включите
pglogicalвshared_preload_librariesи настройте другие параметры репликации в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 и подписки.
- Инициализируйте узел поставщика pglogical на
inst1./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. Проверьте генетическую репликацию.
Убедитесь, что репликация работает должным образом, вставив данные в провайдера и выполнив запрос к ним в подписчике.
- Убедитесь, что подписка активна. Переход к
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. Уборка
Очистите ресурсы. Сначала уничтожьте экземпляры AlloyDB Omni на виртуальной машине, а затем удалите ресурсы Google Cloud.
Уничтожить экземпляры AlloyDB Omni
Перед удалением виртуальной машины можно очистить экземпляры 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 и другие ресурсы.
- Отключитесь от SSH-сессии.
exit - Удалите экземпляр виртуальной машины Compute Engine.
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 и Router.
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. Поздравляем!
Вы успешно развернули и настроили несколько экземпляров AlloyDB Omni на одной виртуальной машине Compute Engine.
Что мы рассмотрели
- Как подготовить и развернуть виртуальную машину Compute Engine.
- Как установить RPM-пакеты AlloyDB Omni.
- Как настроить шаблоны
systemdдля нескольких экземпляров. - Как инициализировать, настроить и запустить несколько независимых служб на разных портах.
- Как проверить независимость каждого отдельного случая.
Узнать больше
- Для получения дополнительной информации об установке и настройке обратитесь к документации AlloyDB Omni .
- Подробную информацию об используемом в этом практическом занятии расширении для репликации см. в документации pglogical .