Как развернуть кластер высокой доступности AlloyDB Omni на виртуальных машинах GCE с помощью RPM Orchestrator

1. Введение

В этой практической работе рассказывается о том, как развернуть кластер высокой доступности AlloyDB Omni на виртуальных машинах Google Compute Engine (GCE). В конце этой практической работы вы создадите эталонную архитектуру с высокой доступностью, состоящую из трех узлов базы данных и двух узлов HAProxy, а также управляющего узла для операций управления.

Требования

  • Доступ к проекту Google Cloud и Cloud Shell из Cloud Console.
  • Google Cloud SDK (gcloud) установлена и настроена. Инструкции по установке gcloud приведены на странице gcloud-install.
  • Установлена версия Terraform v1.9.8.

Что вы узнаете

  • Как создать и подготовить ВМ GCE для AlloyDB Omni.
  • Как установить и запустить оркестратор AlloyDB Omni RPM.
  • Как установить и настроить пакеты RPM AlloyDB Omni для архитектуры высокой доступности.

Что вам понадобится

  • Получите URL для RPM-пакетов AlloyDB Omni и оркестратора RPM. Для этого заполните форму регистрации AlloyDB Omni. Ссылки отправляются на адрес электронной почты, связанный с сервером URL репозитория. Инициализируйте следующие переменные среды, чтобы URL, которые будут использоваться в лабораторной работе, были под рукой.
    export ORCHESTRATOR_ANSIBLE_COLLECTION_PATH="..."
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    export ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL="..."
    export ALLOYDB_OMNI_COMMON_REPOSITORY_URL="..."
    export ETCD_REPOSITORY_URL="..."
    
  • Рабочий терминал с доступом к стеку развертывания AlloyDB Omni. Для этого можно использовать Cloud Shell.

2. Настройка и требования

Настройка проекта

Как создать проект Google Cloud

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

Запустить Cloud Shell

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

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

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

Вы также можете нажать G, а затем S. Эта последовательность действий активирует Cloud Shell, если вы находитесь в консоли Google Cloud или используете эту ссылку.

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

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

Эта виртуальная машина загружена всеми необходимыми инструментами разработчика. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Все действия в этой практической работе можно выполнить в браузере. Устанавливать ничего не нужно.

3. Как создать виртуальные машины Google Cloud Compute Engine

Как подготовить скрипты Terraform

  1. Определите переменные среды для идентификатора проекта и нужного имени кластера. Они понадобятся вам в ходе работы с лабораторией.
    export PROJECT="your-project-id"
    export CLUSTER="your-cluster-name"
    
    Примечание. Идентификатор проекта Google Cloud должен содержать от 6 до 30 символов. Дополнительную информацию можно найти на странице https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin.
  2. Убедитесь, что вы вошли в аккаунт пользователя Google Cloud.
    gcloud auth login
    
  3. Создайте рабочий каталог для развертывания и скопируйте необходимые файлы конфигурации Terraform из источника репозитория.
    mkdir -p ~/alloydb-omni/$PROJECT/$CLUSTER
    cd ~/alloydb-omni/$PROJECT/$CLUSTER
    gcloud storage cp gs://alloydb-omni-install/rpm-orchestrator/gce/terraform/*.tf .
    
  4. Создайте файл terraform.tfvars, чтобы указать необходимые параметры в соответствии с архитектурой, приведенной ниже.
    cat > terraform.tfvars <<EOF
    # Required instance counts for reference architecture
    db_instance_count      = 3
    haproxy_instance_count = 2
    control_instance_count = 1
    
    # Optional: Customize if needed with the below variables
    # os_image             = "rocky-linux-cloud/rocky-linux-9"
    # zone                 = "us-west4-c"
    # region_1             = "us-west4"
    # db_instance_type     = "c4-highmem-4"
    # db_disk_type         = "hyperdisk-balanced"
    # db_data_size         =  "50" # GB
    # data_dir             =  "/data"
    EOF
    

Выполнение скриптов Terraform и проверка

  1. Теперь вы можете инициализировать виртуальные машины.
    terraform init
    
  2. Прежде чем создавать ВМ, убедитесь, что у вас есть необходимые разрешения на создание ВМ и других ресурсов. Вам понадобятся следующие разрешения:
    roles/compute.admin
    roles/iam.roleAdmin
    roles/compute.osAdminLogin
    roles/iam.serviceAccountCreator
    roles/iam.serviceAccountUser
    roles/artifactregistry.repoAdmin
    roles/storage.objectUser
    roles/resourcemanager.projectIamAdmin
    roles/serviceusage.serviceUsageAdmin
    
  3. Проверьте конфигурацию и примените ее, чтобы подготовить ресурсы.
    terraform validate
    terraform apply --auto-approve
    
    Примечание. Убедитесь, что вы используете Terraform v1.9.8, как и предполагается в конфигурации развертывания.
  4. После завершения работы Terraform убедитесь, что виртуальные машины созданы успешно. Для этого перечислите созданные экземпляры с помощью команды gcloud.
    gcloud compute instances list --filter="name~$CLUSTER" --project=$PROJECT
    
    Вы увидите экземпляры, соответствующие трем узлам БД, двум узлам HAProxy, а также контрольной ВМ и соответствующим зонам. Запишите зону для управляющего узла. Он понадобится вам позже в этой практической работе.
    export ZONE=$(gcloud compute instances list \
      --filter="name=$CLUSTER-control"          \
      --format="value(zone)" --project=$PROJECT)
    

4. Подготовьте ВМ к развертыванию

Вам нужно создать сеанс SSH для узла управления и выполнить действия, чтобы включить доступ по SSH ко всем виртуальным машинам (также называемым узлами).

  1. Убедитесь, что определены переменные среды для проекта и кластера.
    export PROJECT="your-project-id"
    export CLUSTER="your-cluster-name"
    
  2. Создайте SSH-ключ и добавьте его для входа в управляющую ВМ.
    # Replace values with your specific GCP project, cluster and zone details
    ssh-keygen -t ed25519 -f $HOME/.ssh/google_compute_engine
    gcloud compute os-login ssh-keys add --key-file=$HOME/.ssh/google_compute_engine.pub --project=$PROJECT
    
  3. Создайте правило брандмауэра, чтобы разрешить SSH-подключения и трафик VRRP.
    gcloud compute config-ssh --project=$PROJECT
    gcloud compute firewall-rules create $CLUSTER-allow-ssh --network=$CLUSTER --project=$PROJECT --direction=INGRESS --action=allow --rules=tcp:22 --source-ranges="0.0.0.0/0"
    gcloud compute firewall-rules create $CLUSTER-allow-vrrp --network=$CLUSTER --project=$PROJECT --allow=112 --source-ranges="0.0.0.0/0"
    
  4. Подключитесь к управляющей ВМ по SSH:
    gcloud compute ssh "$CLUSTER-control" --zone=$ZONE --project=$PROJECT
    
  5. Создайте в управляющем узле группу Linux с тем же названием, что и имя пользователя:
    sudo groupadd -f $(id -un)
    sudo usermod -aG $(id -un) $(id -un)
    
  6. При настройке Terraform создается несколько скриптов конфигурации, которые размещаются в каталоге /tmp/ управляющей виртуальной машины. В этих скриптах содержатся такие данные, как название кластера, сервисный аккаунт, название проекта и т. д. Создайте доступ по SSH без пароля от управляющих узлов ко всем узлам кластера, используя скрипты настройки на управляющем узле.
    /tmp/setup-ssh-for-cluster.sh
    
    Важно! Запишите пользователя service_account. Мы будем использовать его как SSH_USER в дальнейшем.
  7. В этой практической работе мы можем отключить SELinux на всех узлах. Скрипт Terraform добавляет файл /tmp/run-all.sh, который можно использовать для этой цели.
    /tmp/run-all.sh sudo setenforce 0
    
  8. Если вы зарегистрировались в AlloyDB Omni и получили ссылки, добавьте их в переменные среды.
    cat >> ~/.codelab.env <<EOF
    export ORCHESTRATOR_ANSIBLE_COLLECTION_PATH="..."
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    export ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL="..."
    export ALLOYDB_OMNI_COMMON_REPOSITORY_URL="..."
    export ETCD_REPOSITORY_URL="..."
    EOF
    
    Выберите виртуальный IP-адрес для своей среды из входной переменной cidr_range в файле terraform/variables.tf, чтобы он не конфликтовал с другими узлами, как показано в следующем примере:
    cat >> ~/.codelab.env <<EOF
    export VIRTUAL_IP="10.1.0.50"
    EOF
    

5. Установите необходимые компоненты ПО на все ВМ

Следующий шаг – установка необходимых компонентов ПО на виртуальные машины. Это можно сделать на управляющем узле. Все перечисленные ниже команды нужно выполнить на управляющем узле.

  1. Подключитесь к управляющей ВМ по протоколу SSH, если вы ещё не на управляющем узле.
    gcloud compute ssh "$CLUSTER-control" --zone=$ZONE --project=$PROJECT
    
    Когда вы увидите приглашение SSH на управляющей виртуальной машине, укажите исходный файл среды.
    source ~/.codelab.env
    
  2. На управляющем узле установите Ansible и необходимые библиотеки Python.
    sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y
    sudo dnf install -y ansible
    sudo dnf install -y python3-grpcio python3-protobuf python3-googleapis-common-protos python3-grpcio-status
    
  3. Затем скачайте TAR-файл коллекции Ansible Orchestrator RPM и установите его.
    gcloud storage cp "gs://${ORCHESTRATOR_ANSIBLE_COLLECTION_PATH#https://storage.googleapis.com/}google-alloydbomni_orchestrator-*.tar.gz" .
    COLLECTION_FILE=$(ls -1 google-alloydbomni_orchestrator-*.tar.gz \
      | sort -V | tail -n 1)
    ansible-galaxy collection install "$COLLECTION_FILE"
    ansible-galaxy collection list | grep alloydbomni_orchestrator
    
    Команды sort -V и tail -n 1 выбирают файл с последней версией. Примечание. Убедитесь, что переменная ORCHESTRATOR_ANSIBLE_COLLECTION_PATH заканчивается символом "/".
  4. Оркестратор использует файл спецификации развертывания в формате инвентаря Ansible, чтобы понять топологию кластера. Создайте файл deployment_spec.yaml с информацией об узле на управляющем узле.
    cat > deployment_spec.yaml <<EOF
    alloydbomni:
      vars:
        cluster_manager:
          name: "$CLUSTER"
        etcd:
          setup: true
          config_forcewrite: true
        alloydbomni:
          major_version: "18"
          repo_url: $ALLOYDB_OMNI_REPOSITORY_URL
        alloydbomni_monitor:
          repo_url: $ALLOYDB_OMNI_COMMON_REPOSITORY_URL
        alloydbomni_cluster_manager:
          repo_url: $ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL
        alloydbomni_node_manager:
          repo_url: $ALLOYDB_OMNI_ORCHESTRATOR_REPOSITORY_URL
        pgbouncer:
          repo_url: $ALLOYDB_OMNI_COMMON_REPOSITORY_URL
        pgbackrest:
          repo_url: $ALLOYDB_OMNI_COMMON_REPOSITORY_URL
    
      children:
        primary_instance_nodes:
          hosts:
            $CLUSTER-db1:
            $CLUSTER-db2:
            $CLUSTER-db3:
        load_balancer_nodes:
          hosts:
            $CLUSTER-haproxy1:
            $CLUSTER-haproxy2:
    EOF
    
    Примечание. Проверьте сгенерированный файл, чтобы убедиться, что в нем указаны действительные значения.
  5. Создайте файл плейбука install.yaml, который ссылается на роль install из коллекции orchestrator.
    cat > install.yaml <<EOF
    - name: Install AlloyDB Omni cluster components
      hosts: all
      vars:
        ansible_become: true
        ansible_user: $SSH_USER
        ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa
      roles:
        - role: google.alloydbomni_orchestrator.install
    EOF
    
    Примечание. Проверьте сгенерированный файл, чтобы убедиться, что в нем указаны действительные значения.
  6. Выполните плейбук, используя файл инвентаря, чтобы скачать и установить RPM на всех указанных узлах.
    ansible-playbook -i deployment_spec.yaml install.yaml
    

6. Как запустить кластер AlloyDB Omni

На этом этапе мы установили все необходимые компоненты на все узлы. Мы готовы запустить кластер AlloyDB Omni.

  1. Подключитесь к управляющей ВМ по протоколу SSH, если вы ещё не на управляющем узле.
    gcloud compute ssh "$CLUSTER-control" --zone=$ZONE --project=$PROJECT
    
    Когда вы увидите приглашение SSH на управляющей виртуальной машине, укажите исходный файл среды.
    source ~/.codelab.env
    
  2. Сгенерируйте хеш для пароля и получите установленную версию базы данных AlloyDB Omni:
    encoded_password=$(echo -n "your unique password" | base64)
    DB_VERSION=$(/tmp/run-all.sh -t db 'rpm -q --qf "%{VERSION}\n" alloydbomni18' | tail -n 1)
    echo "$DB_VERSION"
    
  3. Чтобы создать кластер, AlloyDB Omni должен знать, как его настроить. Создайте файл dbcluster.yaml со спецификациями кластера БД.
    cat > dbcluster.yaml <<EOF
    Secret:
      metadata:
        name: db-pw-$CLUSTER
      spec:
        type: Opaque
        data:
          $CLUSTER: $encoded_password
    ---
    DBCluster:
      metadata:
        name: $CLUSTER
      spec:
        databaseVersion: $DB_VERSION
        mode: ""
        availability:
          numberOfStandbys: 2
          enableAutoFailover: true
          enableAutoHeal: true
          autoFailoverTriggerThreshold: 2
          autoHealTriggerThreshold: 2
          healthcheckPeriodSeconds: 5
          replayReplicationSlotsOnStandbys: false
        primarySpec:
          adminUser:
            passwordRef:
              name: db-pw-$CLUSTER
          resources:
            cpu: 4
            memory: 32Gi
            disks:
            - name: DataDisk
              path: $PGDATA
          dbLoadBalancerOptions:
            gcp:
              loadBalancerIP: "$VIRTUAL_IP"
              loadBalancerType: "internal"
              loadBalancerInterface: "eth0"
    EOF
    
  4. Создайте файл плейбука с названием bootstrap.yaml, который будет ссылаться на роль Ansible для создания кластера AlloyDB Omni.
    cat > bootstrap.yaml <<EOF
    - name: Create DBCluster
      hosts: localhost
      roles:
      - role: google.alloydbomni_orchestrator.bootstrap
    EOF
    
  5. Запустите playbook, чтобы создать кластер
    ansible-playbook bootstrap.yaml -i deployment_spec.yaml -e resource_spec=dbcluster.yaml
    

7. Как настроить PgBouncer Connection Pooler (необязательно)

AlloyDB Omni поддерживает легкое объединение подключений с помощью PgBouncer. Вы можете настроить и запустить PgBouncer сразу после инициализации кластера.

  1. Создайте файл спецификации ресурса с именем pgbouncer.yaml, который связывает пул подключений с кластером базы данных:
    cat > pgbouncer.yaml <<EOF
    PgBouncer:
      metadata:
        name: pgbouncer-pooler
      spec:
        dbclusterRef: $CLUSTER
        allowSuperUserAccess: true
        accessMode: "rw"
        port: 6432
    EOF
    
  2. Загрузите пул PgBouncer, используя тот же плейбук bootstrap.yaml, созданный ранее, и передав новый файл спецификации:
    ansible-playbook bootstrap.yaml -i deployment_spec.yaml -e resource_spec=pgbouncer.yaml
    

8. Как проверить кластер AlloyDB Omni

Чтобы убедиться, что кластер работает правильно и доступен через балансировщик нагрузки, вы можете подключиться к нему с помощью стандартного клиента PostgreSQL из узла управления.

  1. Установите репозиторий клиента и пакет PostgreSQL 18 на управляющем узле:
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf install -y postgresql18
    
  2. Подключитесь к кластеру, используя зарезервированный ранее виртуальный IP-адрес. Вам будет предложено ввести пароль, закодированный в файле dbcluster.yaml:
    /usr/pgsql-18/bin/psql -h $VIRTUAL_IP -U postgres -W
    
  3. После подключения вы можете выполнять базовые SQL-запросы, чтобы проверить состояние кластера, например версию базы данных:
    postgres=# SELECT version();
    
    Вы увидите выходные данные, указывающие на то, что PostgreSQL 18 работает с AlloyDB Omni. Чтобы закрыть подсказку, введите \q.

9. Как создать резервную копию данных с помощью pgBackRest (необязательно)

AlloyDB Omni интегрируется с pgBackRest для управления резервными копиями непосредственно в Cloud Storage. Вы можете настроить план резервного копирования и запустить резервное копирование по запросу в сегмент GCS, созданный с помощью Terraform.

  1. Создайте файл спецификации плана резервного копирования с именем backup_plan.yaml, указывающий на подготовленный сегмент GCS:
    cat > backup_plan.yaml <<EOF
    BackupPlan:
      metadata:
        name: pgb-plan
      spec:
        dbclusterRef: $CLUSTER
        backupLocation:
          type: GCS
          gcsOptions:
            bucket: $CLUSTER-gcs-backups
            key: /backups
    EOF
    
  2. Создайте сценарий Ansible с именем backup.yaml, который ссылается на роль управления резервным копированием:
    cat > backup.yaml <<EOF
    - name: Manage AlloyDB Omni Backups
      hosts: localhost
      roles:
        - role: google.alloydbomni_orchestrator.backup
    EOF
    
  3. Примените план резервного копирования, используя плейбук backup.yaml:
    ansible-playbook backup.yaml -i deployment_spec.yaml -e resource_spec=backup_plan.yaml
    
  4. После того как план будет успешно создан, создайте файл ресурса резервной копии по запросу с именем create_backup.yaml.
    cat > create_backup.yaml <<EOF
    Backup:
      metadata:
        name: on-demand-backup
      spec:
        backupPlanRef: pgb-plan
        dbclusterRef: $CLUSTER
    EOF
    
  5. Выполните пособие, чтобы запустить резервное копирование:
    ansible-playbook backup.yaml -i deployment_spec.yaml -e resource_spec=create_backup.yaml
    
  6. Чтобы проверить статус резервной копии, создайте плейбук status.yaml:
cat > status.yaml <<EOF
- name: Fetch AlloyDB Omni Resource Status
  hosts: localhost
  roles:
    - role: google.alloydbomni_orchestrator.status
EOF
  1. Чтобы посмотреть список всех резервных копий, запустите плейбук:
ansible-playbook status.yaml -i deployment_spec.yaml -e resource_type=Backup
  1. Также, чтобы получить подробную информацию о определенной резервной копии, созданной ранее, передайте -e resource_name=on-demand-backup:
ansible-playbook status.yaml -i deployment_spec.yaml \
  -e resource_type=Backup \
  -e resource_name=on-demand-backup

10. Как удалить ресурсы

После завершения развертывания вы можете удалить подготовленные ресурсы, чтобы избежать расходов.

  1. Создайте сценарий с именем teardown.yaml:
    cat > teardown.yaml <<EOF
    - name: Tear down AlloyDB Omni cluster
      hosts: localhost
      roles:
      - role: google.alloydbomni_orchestrator.delete
    EOF
    
  2. Выполните сценарий с помощью ansible-playbook. Если вы настроили резервное копирование, сначала удалите ресурсы Backup и BackupPlan:
    ansible-playbook teardown.yaml -i deployment_spec.yaml  -e "resource_type=Backup" -e "resource_name=on-demand-backup"
    ansible-playbook teardown.yaml -i deployment_spec.yaml  -e "resource_type=BackupPlan" -e "resource_name=pgb-plan"
    
    Если вы настроили PgBouncer, удалите ресурс пула подключений:
    ansible-playbook teardown.yaml -i deployment_spec.yaml  -e "resource_type=PgBouncer" -e "resource_name=pgbouncer-pooler"
    
    Затем укажите DBCluster в качестве resource_type и удалите кластер базы данных:
    ansible-playbook teardown.yaml -i deployment_spec.yaml  -e "resource_type=DBCluster" -e "resource_name=$CLUSTER"
    
  3. После удаления кластера выйдите из узла управления, вернитесь в терминал и перейдите в рабочий каталог Terraform.
    Примечание. Если вы только что вошли в Cloud Shell, не забудьте задать следующие значения:
    export PROJECT="your-project-id"
    export CLUSTER="your-cluster-name"
    
  4. Удалите правило брандмауэра VRRP и уничтожьте ресурсы, управляемые Terraform:
    gcloud compute firewall-rules delete -q "$CLUSTER-allow-vrrp" --project="$PROJECT"
    gcloud compute firewall-rules delete -q "$CLUSTER-allow-ssh" --project="$PROJECT"
    terraform destroy
    
  5. Подтвердите уничтожение. Поскольку оставшиеся сетевые ресурсы или маршруты иногда могут помешать полному удалению, выполните следующие безопасные команды очистки, чтобы убедиться, что все связанные правила брандмауэра, шлюзы NAT, маршрутизаторы, маршруты, подсети и сети полностью удалены. Замените REGION на регион развертывания, например us-central1:
    # Delete any remaining firewall rules associated with the cluster
    gcloud compute firewall-rules list --project=$PROJECT 2> /dev/null | grep ^$CLUSTER- | cut -f1 -d' ' | \
      while read rule; do gcloud compute firewall-rules delete --project=$PROJECT --quiet $rule; done
    
    # Delete the Cloud NAT gateway and router if they still exist
    gcloud compute routers nats describe $CLUSTER-nat-gw --router=$CLUSTER-router --region=REGION --project=$PROJECT 2>/dev/null \
      && gcloud compute routers nats delete $CLUSTER-nat-gw --router=$CLUSTER-router --region=REGION --project=$PROJECT --quiet
    
    gcloud compute routers describe $CLUSTER-router --region=REGION --project=$PROJECT 2>/dev/null \
      && gcloud compute routers delete $CLUSTER-router --region=REGION --project=$PROJECT --quiet
    
    # Delete any remaining custom routes
    gcloud compute routes list --project=$PROJECT --filter="network:$CLUSTER" --format="value(name)" 2>/dev/null | \
      while read route; do gcloud compute routes delete --project=$PROJECT --quiet $route 2>/dev/null || true; done
    
    # Delete the subnet and network if they still exist
    gcloud compute networks subnets describe $CLUSTER --region=REGION --project=$PROJECT 2>/dev/null \
      && gcloud compute networks subnets delete $CLUSTER --region=REGION --project=$PROJECT --quiet
    
    gcloud compute networks describe $CLUSTER --project $PROJECT 2> /dev/null \
      && gcloud compute networks delete $CLUSTER --project $PROJECT --quiet
    

11. Поздравляю!

Поздравляем с завершением практической работы!

Что мы обсудили

  • Как создать и подготовить ВМ GCE для AlloyDB Omni.
  • Как установить и запустить оркестратор AlloyDB Omni RPM.
  • Как установить и настроить пакеты RPM AlloyDB Omni для архитектуры высокой доступности.

Подробнее об AlloyDB Omni можно узнать из документации.

12. Опрос

Как вы будете использовать это руководство?

Просто прочитайте Прочитайте и выполните упражнения