Логическая репликация с помощью AlloyDB Omni

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.

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud .
  2. Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .

Запустить Cloud Shell

Хотя вы можете управлять Google Cloud удаленно со своего ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

Значок для активации Cloud Shell

  1. Откройте консоль Google Cloud и нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу. Вы также можете открыть Cloud Shell одним из следующих способов:

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

Терминал Google Cloud Shell показывает, что среда подключена.

3. Создайте виртуальную машину Compute Engine.

В этом разделе создайте одну виртуальную машину Compute Engine (VM) с помощью инструмента командной строки gcloud . Используйте образ Rocky Linux 9, который полностью совместим с RPM-пакетами AlloyDB Omni.

  1. Определите переменные среды для идентификатора вашего проекта, имени виртуальной машины, зоны и региона.
    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. Чтобы разрешить 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"
    
  4. Поскольку виртуальная машина создается без публичного 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
    
  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 с необходимыми характеристиками (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
    
  7. После создания виртуальной машины проверьте её статус.
    gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
    

4. Подготовка виртуальной машины

В этом разделе вы подключаетесь к созданной виртуальной машине и подготавливаете среду операционной системы.

  1. Подключитесь к виртуальной машине по SSH, используя IAP. Поскольку у виртуальной машины нет публичного IP-адреса, gcloud автоматически туннелирует SSH-соединение через IAP.
    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

После подготовки виртуальной машины вы можете настроить репозиторий пакетов и установить пакет AlloyDB Omni RPM.

  1. Настройте репозиторий 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. Установите RPM-пакет AlloyDB Omni версии 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. Необязательно: установите ограничения на ресурсы для каждого экземпляра. Это предотвратит потребление всех ресурсов виртуальной машины одним экземпляром. Создайте каталоги и файлы переопределения 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%
    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 в разрешающий режим отключает принудительное применение правил и должен использоваться с осторожностью. В этом практическом задании он используется для упрощения установки. В производственной среде настройте соответствующие политики SELinux для AlloyDB Omni, чтобы он работал в режиме принудительного применения правил. Вы можете повторно включить принудительное применение правил после настройки, выполнив команду 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. Настройте экземпляр для прослушивания порта 5433 , обновив файл postgresql.conf .
    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. Включите 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
    
  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. Инициализируйте узел поставщика 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');
    "
    
  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. Проверьте генетическую репликацию.

Убедитесь, что репликация работает должным образом, вставив данные в провайдера и выполнив запрос к ним в подписчике.

  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. Уборка

Очистите ресурсы. Сначала уничтожьте экземпляры AlloyDB Omni на виртуальной машине, а затем удалите ресурсы Google Cloud.

Уничтожить экземпляры AlloyDB Omni

Перед удалением виртуальной машины можно очистить экземпляры 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 и другие ресурсы.

  1. Отключитесь от SSH-сессии.
    exit
    
  2. Удалите экземпляр виртуальной машины Compute Engine.
    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 и 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
    
  5. Удалите стандартный интернет-маршрут.
    gcloud compute routes delete default-internet-route --project=$PROJECT --quiet
    

13. Поздравляем!

Вы успешно развернули и настроили несколько экземпляров AlloyDB Omni на одной виртуальной машине Compute Engine.

Что мы рассмотрели

  • Как подготовить и развернуть виртуальную машину Compute Engine.
  • Как установить RPM-пакеты AlloyDB Omni.
  • Как настроить шаблоны systemd для нескольких экземпляров.
  • Как инициализировать, настроить и запустить несколько независимых служб на разных портах.
  • Как проверить независимость каждого отдельного случая.

Узнать больше

  • Для получения дополнительной информации об установке и настройке обратитесь к документации AlloyDB Omni .
  • Подробную информацию об используемом в этом практическом занятии расширении для репликации см. в документации pglogical .