1. Введение
В этой практической работе рассказывается, как создать резервную копию кластера с высокой доступностью в совместимом с S3 хранилище объектов для AlloyDB Omni с помощью оркестратора RPM.
В этой практической работе используется кластер из практической работы Развертывание кластера высокой доступности AlloyDB Omni на виртуальных машинах GCE с помощью оркестратора RPM для создания кластера высокой доступности на виртуальных машинах Compute Engine. В этой практической работе вы добавите на одну из ВМ сервер хранения объектов, совместимый с S3. Сервер хранения объектов используется для резервного копирования данных кластера высокой доступности и восстановления кластера с сервера.

Требования
- Проект Google Cloud с включенной оплатой.
- Роли IAM, указанные в практической работе по обеспечению высокой доступности.
- Базовые знания команд Linux и SQL.
Что вы узнаете
- Как установить и запустить сервер объектного хранилища, совместимый с S3, для резервных копий.
- Как создать план резервного копирования, который записывает резервные копии в хранилище, совместимое с S3.
- Как создать резервную копию по запросу.
- Как восстановить кластер из резервной копии на определенный момент времени.
Что вам понадобится
- URL репозиториев ПО AlloyDB Omni и коллекции оркестратора Ansible. Чтобы получить URL, заполните форму регистрации AlloyDB Omni. Подробнее об использовании AlloyDB Omni с RPM… URL используются в практической работе по высокой доступности.
- Кластер AlloyDB Omni HA из практической работы Развертывание кластера высокой доступности AlloyDB Omni на виртуальных машинах GCE с помощью оркестратора RPM.
- Терминал с доступом к Google Cloud и Cloud Shell.
2. Настройка и требования
- На этом шаге вы создадите кластер с высокой доступностью, используя практическую работу Deploy AlloyDB Omni high availability cluster on GCE VMs using RPM Orchestrator (Развертывание кластера с высокой доступностью AlloyDB Omni на виртуальных машинах GCE с помощью оркестратора RPM). Выполните следующие действия: Если у вас уже есть кластер из лаборатории, перейдите к следующему шагу.
- Примечание. Не выполняйте очистку ресурсов на этом этапе. Вы выполните этот шаг в конце практической работы.
- Вернуться к этой практической работе
3. Как подключиться к кластеру и добавить примеры данных
На этом шаге вы загрузите настройки кластера на управляющую виртуальную машину. Затем вы подключаетесь к кластеру и добавляете таблицу с образцами данных.
- Если вы не подключены к управляющей ВМ, подключитесь к ней из Cloud Shell:
Переменныеgcloud compute ssh "$CLUSTER-control" --zone="$ZONE" --project="$PROJECT"CLUSTER,ZONEиPROJECTвзяты из шага Подготовьте виртуальные машины к развертыванию практической работы Развертывание кластера AlloyDB Omni с высокой доступностью на виртуальных машинах GCE с помощью оркестратора RPM. Если в Cloud Shell нет этих переменных, задайте их снова. - На управляющей виртуальной машине перейдите в домашний каталог и загрузите переменные среды. Затем добавьте название кластера и пользователя SSH в файл среды:
Убедитесь, что в выходных данных указаны значенияcd ~ source /tmp/cluster.conf cat >> ~/.codelab.env <<EOF export CLUSTER="$cluster" export SSH_USER="$service_account" EOF source ~/.codelab.env env | grep -E '^(CLUSTER|SSH_USER|VIRTUAL_IP)='CLUSTER,SSH_USERиVIRTUAL_IP. Примечание. Если вы позже снова подключитесь к управляющей виртуальной машине, перед продолжением выполните командыcd ~иsource ~/.codelab.env. - Добавьте настройки подключения в файл среды. Когда команда
readзапросит пароль, введите пароль пользователяpostgres. Вы задаете этот пароль на шаге Bootstrap AlloyDB Omni Cluster (Загрузка кластера AlloyDB Omni) в практической работе Deploy AlloyDB Omni high availability cluster on GCE VMs using RPM Orchestrator (Развертывание кластера AlloyDB Omni с высокой доступностью на виртуальных машинах GCE с помощью оркестратора RPM).cat >> ~/.codelab.env <<'EOF' export PATH="/usr/pgsql-18/bin:$PATH" export PGHOST="$VIRTUAL_IP" export PGUSER="postgres" EOF read -rsp "Password of the postgres user: " PGPASSWORD; echo printf 'export PGPASSWORD=%q\n' "$PGPASSWORD" >> ~/.codelab.env source ~/.codelab.env env | grep -E '^(PGHOST|PGUSER|PGPASSWORD)=' - Создайте таблицу и добавьте 1000 строк:
psql <<'SQL' CREATE TABLE public.orders ( id integer PRIMARY KEY, item text NOT NULL, created_at timestamptz NOT NULL DEFAULT pg_catalog.now() ); INSERT INTO public.orders (id, item) SELECT g, 'item-' || g FROM pg_catalog.generate_series(1, 1000) AS g; SQL - Посчитайте строки:
Убедитесь, что в выходных данных возвращается значениеpsql -c "SELECT pg_catalog.count(*) FROM public.orders;"1000.
4. Как установить и запустить хранилище объектов, совместимое с S3
На этом шаге вы напишете плейбук Ansible, который установит сервер MinIO на управляющей виртуальной машине. Плейбук также создает сегмент и пользователя для резервных копий и обеспечивает подключение ВМ базы данных к MinIO. Выполните все команды на управляющей виртуальной машине.
- На управляющей виртуальной машине добавьте настройки хранилища в файл среды. Команды
opensslпозволяют создавать случайные пароли. Убедитесь, что в выходных данных указаны имя и внутренний IP-адрес управляющей виртуальной машины, напримерMD=http://metadata.google.internal/computeMetadata/v1/instance S3_IP=$(curl -s -H "Metadata-Flavor: Google" "$MD/network-interfaces/0/ip") cat >> ~/.codelab.env <<EOF export S3_IP="$S3_IP" export S3_HOST="$CLUSTER-control" export S3_BUCKET="alloydb-backups" export S3_REGION="us-east-1" export MINIO_ROOT_USER="s3admin" export MINIO_ROOT_PASSWORD="$(openssl rand -hex 16)" export S3_ACCESS_KEY_ID="alloydb-backup" export S3_SECRET_ACCESS_KEY="$(openssl rand -hex 16)" export MINIO_URL="https://github.com/minio/minio/releases/download/RELEASE.2024-05-10T01-41-38Z/minio.linux-amd64.RELEASE.2024-05-10T01-41-38Z" export MC_URL="https://github.com/minio/mc/releases/download/RELEASE.2024-05-09T17-04-24Z/mc.linux-amd64.RELEASE.2024-05-09T17-04-24Z" EOF source ~/.codelab.env echo "$S3_HOST $S3_IP"my-cluster-control 10.1.0.2. Виртуальные машины базы данных используют это имя хоста и IP-адрес для подключения к MinIO. IP-адрес предоставляет сервер метаданных виртуальной машины. Дополнительную информацию можно найти в документации по метаданным ВМ.ЗначенияMINIO_URLиMC_URL– это URL для скачивания сервера MinIO и клиента MinIO (mc). - Установите на управляющей ВМ необходимую коллекцию Ansible
community.crypto:ansible-galaxy collection install community.crypto - Создайте руководство по
s3_server.yaml: Переменнаяcat > s3_server.yaml <<EOF - name: Install and run MinIO on the control VM hosts: localhost connection: local become: true gather_facts: false tasks: - name: Create MinIO directories ansible.builtin.file: path: "{{ item }}" state: directory mode: "0755" loop: - /var/lib/minio/data - /var/lib/minio/certs - name: Download MinIO server and client ansible.builtin.get_url: url: "{{ item.url }}" dest: "{{ item.dest }}" mode: "0755" loop: - url: "$MINIO_URL" dest: /usr/local/bin/minio - url: "$MC_URL" dest: /usr/local/bin/mc - name: Generate MinIO TLS private key community.crypto.openssl_privatekey: path: /var/lib/minio/certs/private.key size: 2048 mode: "0600" - name: Generate MinIO certificate signing request community.crypto.openssl_csr_pipe: privatekey_path: /var/lib/minio/certs/private.key common_name: "$S3_HOST" subject_alt_name: - "DNS:$S3_HOST" - "DNS:$S3_BUCKET.$S3_HOST" - "DNS:localhost" - "IP:127.0.0.1" - "IP:$S3_IP" register: minio_csr - name: Generate self-signed MinIO TLS certificate community.crypto.x509_certificate: path: /var/lib/minio/certs/public.crt csr_content: "{{ minio_csr.csr }}" privatekey_path: /var/lib/minio/certs/private.key provider: selfsigned selfsigned_not_after: "+365d" mode: "0644" - name: Create MinIO systemd service unit ansible.builtin.copy: dest: /etc/systemd/system/minio.service mode: "0600" content: | [Unit] Description=MinIO Object Storage After=network.target [Service] Environment="MINIO_ROOT_USER=$MINIO_ROOT_USER" Environment="MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD" Environment="MINIO_DOMAIN=$S3_HOST" ExecStart=/usr/local/bin/minio server /var/lib/minio/data --certs-dir /var/lib/minio/certs Restart=on-failure [Install] WantedBy=multi-user.target - name: Start and enable MinIO service ansible.builtin.systemd_service: name: minio daemon_reload: true state: started enabled: true - name: Add storage host names to /etc/hosts on the control VM ansible.builtin.lineinfile: path: /etc/hosts line: "$S3_IP $S3_HOST $S3_BUCKET.$S3_HOST" state: present - name: Wait for MinIO health endpoint ansible.builtin.uri: url: "https://$S3_HOST:9000/minio/health/live" ca_path: /var/lib/minio/certs/public.crt status_code: 200 register: minio_health until: minio_health.status == 200 retries: 6 delay: 5 - name: Create backup bucket and user in MinIO ansible.builtin.command: argv: "{{ item }}" loop: - - /usr/local/bin/mc - --insecure - alias - set - s3repo - "https://$S3_HOST:9000" - "$MINIO_ROOT_USER" - "$MINIO_ROOT_PASSWORD" - - /usr/local/bin/mc - --insecure - mb - --ignore-existing - "s3repo/$S3_BUCKET" - - /usr/local/bin/mc - --insecure - admin - user - add - s3repo - "$S3_ACCESS_KEY_ID" - "$S3_SECRET_ACCESS_KEY" - - /usr/local/bin/mc - --insecure - admin - policy - attach - s3repo - readwrite - --user - "$S3_ACCESS_KEY_ID" become: false no_log: true - name: Configure database VMs for MinIO hosts: primary_instance_nodes become: true gather_facts: false vars: ansible_user: $SSH_USER ansible_ssh_private_key_file: $HOME/ssh-key-cluster-sa tasks: - name: Set SELinux to permissive mode ansible.builtin.command: cmd: setenforce 0 - name: Add storage host names to /etc/hosts ansible.builtin.lineinfile: path: /etc/hosts line: "$S3_IP $S3_HOST $S3_BUCKET.$S3_HOST" state: present - name: Verify storage host resolution ansible.builtin.getent: database: hosts key: "$S3_BUCKET.$S3_HOST" - name: Verify connection to MinIO ansible.builtin.uri: url: "https://$S3_HOST:9000/minio/health/live" validate_certs: false status_code: 200 EOFMINIO_DOMAINпозволяет MinIO принимать запросы в стиле виртуального хоста. Оркестратор RPM использует пользователяalloydb-backupдля записи резервных копий. Правилоreadwrite– это встроенное правило MinIO. - Запустите сценарий:
Убедитесь, что в выходных данных командыansible-playbook s3_server.yaml -i deployment_spec.yamlPLAY RECAPдляlocalhostи каждой виртуальной машины базы данных указано значениеfailed=0. - Убедитесь, что сегмент существует:
Убедитесь, что в выходных данных указана корзинаmc --insecure ls s3repoalloydb-backups/.
5. Как создать план резервного копирования
План резервного копирования содержит информацию о месте хранения, расписании и периоде хранения резервных копий кластера. На этом этапе вы создадите план резервного копирования для сегмента MinIO.
- На управляющей ВМ создайте плейбук резервного копирования и плейбук статуса. Вы используете резервный план для ресурсов
Secret,BackupPlanиBackup. Статус ресурса можно посмотреть в плейбуке статуса.cat > backup.yaml <<EOF - name: Manage AlloyDB Omni backups hosts: localhost roles: - role: google.alloydbomni_orchestrator.backup EOF cat > status.yaml <<EOF - name: Get resource status hosts: localhost roles: - role: google.alloydbomni_orchestrator.status EOF - Создайте ресурс
Secretдля учетных данных S3. Затем примените ресурс: Названия ключей в разделеS3_KEY_ID_B64=$(printf '%s' "$S3_ACCESS_KEY_ID" | base64 -w 0) S3_KEY_B64=$(printf '%s' "$S3_SECRET_ACCESS_KEY" | base64 -w 0) cat > s3_secret.yaml <<EOF Secret: metadata: name: s3-backup-secret spec: type: Opaque data: access-key-id: "$S3_KEY_ID_B64" access-key: "$S3_KEY_B64" EOF ansible-playbook backup.yaml -i deployment_spec.yaml \ -e resource_spec=s3_secret.yamldataдолжны бытьaccess-key-idиaccess-key. РесурсSecretнеобходимо применить до ресурсаBackupPlan. - Создайте ресурс
BackupPlan, а затем примените его: Значениеcat > backup_plan.yaml <<EOF BackupPlan: metadata: name: s3-backup-plan spec: dbclusterRef: $CLUSTER backupLocation: type: S3 s3Options: bucket: $S3_BUCKET key: /backups endpoint: https://$S3_HOST:9000 region: $S3_REGION secretRef: name: s3-backup-secret caBundle: - | $(sed 's/^/ /' /var/lib/minio/certs/public.crt) EOF ansible-playbook backup.yaml -i deployment_spec.yaml \ -e resource_spec=backup_plan.yamlkey– это путь к резервным копиям в сегменте. Путь должен начинаться с косой черты (/). В полеcaBundleсодержится сертификат ЦС в кодировке PEM, который проверяет сертификат сервера хранилища S3. - Убедитесь, что план резервного копирования готов:
Убедитесь, что в полеansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=BackupPlan -e resource_name=s3-backup-planphaseуказано значениеReady. Если фаза неReady, подождите минуту и снова выполните команду. - После создания резервного плана оркестратор RPM автоматически запускает первоначальное полное резервное копирование. Убедитесь, что первоначальное копирование в облако завершено, прежде чем создавать резервную копию по запросу:
Убедитесь, что начальный этап резервного копирования выполнен успешно.ansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Backup
6. Как создать резервную копию по запросу
На этом этапе вы создадите резервную копию кластера по запросу.
- На управляющей ВМ создайте ресурс
Backup. Затем примените ресурс: Полеcat > create_backup.yaml <<EOF Backup: metadata: name: s3-backup-1 spec: backupPlanRef: s3-backup-plan dbclusterRef: $CLUSTER EOF ansible-playbook backup.yaml -i deployment_spec.yaml \ -e resource_spec=create_backup.yamlbackupPlanRef– это название плана резервного копирования. ПолеdbclusterRef– это название кластера. - Убедитесь, что копирование в облако завершено:
Убедитесь, что в полеansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Backup -e resource_name=s3-backup-1phaseуказано значениеSucceeded. Если фаза неSucceeded, подождите минуту и снова выполните команду. - Убедитесь, что файлы резервных копий находятся в сегменте:
Убедитесь, что в выходных данных есть папкаmc --insecure tree "s3repo/$S3_BUCKET"backup, в которой находится папкаdb.
7. Как восстановить кластер из резервной копии
Оркестратор RPM восстанавливает кластер на месте. На этом шаге вы удалите таблицу и восстановите ее из резервной копии. Затем при необходимости можно восстановить кластер на определенный момент времени.
Внимание! При восстановлении все данные в кластере базы данных будут перезаписаны.
Восстановить из резервной копии
- На управляющей виртуальной машине удалите таблицу
orders. Затем посчитайте строки: Убедитесь, что вторая команда завершается с ошибкой. В сообщении об ошибке указано, что связь не существует. Пример: "ERROR: table "orders" does not exist' (ОШИБКА: таблица "orders" не существует).psql -c "DROP TABLE public.orders;" psql -c "SELECT pg_catalog.count(*) FROM public.orders;" - Создайте руководство по восстановлению:
cat > restore.yaml <<EOF - name: Restore AlloyDB Omni cluster hosts: localhost roles: - role: google.alloydbomni_orchestrator.restore EOF - Создайте ресурс
Restoreдля резервной копииs3-backup-1. Затем примените ресурс:cat > restore_backup.yaml <<EOF Restore: metadata: name: s3-restore-1 spec: sourceDBCluster: $CLUSTER backup: s3-backup-1 EOF ansible-playbook restore.yaml -i deployment_spec.yaml \ -e resource_spec=restore_backup.yaml - Убедитесь, что восстановление завершено:
Убедитесь, что в полеansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Restore -e resource_name=s3-restore-1phaseуказано значениеProvisionSucceeded. Если фаза неProvisionSucceeded, подождите минуту и снова выполните команду. - Посчитайте строки в восстановленной таблице:
Убедитесь, что в выходных данных указаноpsql -c "SELECT pg_catalog.count(*) FROM public.orders;"1000.
Как восстановить данные на определенный момент времени (необязательно)
При восстановлении на определенный момент времени используются резервная копия и архивный журнал WAL. Вы можете восстановить кластер на любой момент времени в окне восстановления плана резервного копирования.
Правила для целевого времени
Чтобы выбрать значение и формат целевого времени, следуйте всем правилам:
- Используйте формат RFC 3339 в UTC:
YYYY-MM-DDThh:mm:ssZ. Например,2026-06-19T14:30:00Z– это 14:30:00 UTC 19 июня 2026 г. БукваTразделяет дату и время. БукваZобозначает время UTC. - Укажите время в прошлом.
- Используйте время, указанное после значения
beginв полеrecoveryWindowфайла CRDBackupPlan.
Чтобы посмотреть текущее время в формате RFC 3339, выполните следующую команду:
date -u +%Y-%m-%dT%H:%M:%SZ
Чтобы преобразовать местное время в этот формат, добавьте к команде date смещение UTC. Например, следующая команда изменяет значение параметра 16:30:00 на 19 June 2026 в UTC+02:00:
date -u -d "2026-06-19 16:30:00 +0200" +%Y-%m-%dT%H:%M:%SZ
Команда возвращает значение 2026-06-19T14:30:00Z.
Как восстановить данные на определенный момент времени
В этой процедуре вы добавите строки в таблицу и запишете время. Когда вы записываете время, вы добавляете в закладки точный момент,когда база данных полностью исправна (содержит ровно 1500 строк).Затем вы удаляете строки и восстанавливаете кластер до записанного времени.
- Добавьте в таблицу 500 строк:
psql <<'SQL' INSERT INTO public.orders (id, item) SELECT g, 'item-' || g FROM pg_catalog.generate_series(1001, 1500) AS g; SQL - Запишите время. В таблице 1500 строк.
Убедитесь, что в выходных данных указано время в форматеsleep 5 PITR_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ) echo "export PITR_TIME=$PITR_TIME" >> ~/.codelab.env echo "$PITR_TIME" sleep 5YYYY-MM-DDThh:mm:ssZ, например2026-10-05T11:16:02Z. - Удалите строки из таблицы, чтобы имитировать случайное удаление данных. Затем запустите новый файл WAL:
Убедитесь, что запросpsql -c "DELETE FROM public.orders WHERE id > 1000;" psql -c "SELECT pg_catalog.count(*) FROM public.orders;" psql -c "SELECT pg_catalog.pg_switch_wal();"countпоказывает1000. Функцияpg_switch_walзаставляет сервер начать новый файл WAL. После этого сервер может заархивировать файл WAL, содержащий ваши изменения. - Убедитесь, что в окне восстановления плана резервного копирования указано время записи:
Убедитесь, что значениеtest -n "$PITR_TIME" || { echo "PITR_TIME is not set. Run step 2 again."; exit 1; } echo "$PITR_TIME" ansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=BackupPlan -e resource_name=s3-backup-planPITR_TIMEуказано после значенияbeginв полеrecoveryWindow. - Создайте ресурс
Restoreдля записанного времени. Затем примените ресурс:cat > restore_pitr.yaml <<EOF Restore: metadata: name: s3-restore-pitr spec: sourceDBCluster: $CLUSTER pointInTime: "$PITR_TIME" EOF ansible-playbook restore.yaml -i deployment_spec.yaml \ -e resource_spec=restore_pitr.yaml - Убедитесь, что восстановление завершено:
Убедитесь, что в полеansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Restore -e resource_name=s3-restore-pitrphaseуказано значениеProvisionSucceeded. Если фаза неProvisionSucceeded, подождите минуту и снова выполните команду. - Посчитайте строки:
Убедитесь, что в выходных данных указаноpsql -c "SELECT pg_catalog.count(*) FROM public.orders;"1500.
8. Очистка
Чтобы избежать списания средств с аккаунта Google Cloud, удалите ресурсы из этой практической работы и практической работы по развертыванию кластера высокой доступности AlloyDB Omni на виртуальных машинах GCE с помощью оркестратора RPM. Сначала удалите ресурсы резервных копий, а затем кластер и вычислительную среду.
- На виртуальной машине управления создайте сценарий удаления:
cat > delete.yaml <<EOF - name: Delete AlloyDB Omni resources hosts: localhost roles: - role: google.alloydbomni_orchestrator.delete EOF - Чтобы посмотреть список резервных копий:
Убедитесь, что в выходных данных указана резервная копияansible-playbook status.yaml -i deployment_spec.yaml -e resource_type=Backups3-backup-1. - Чтобы удалить резервную копию
s3-backup-1:ansible-playbook delete.yaml -i deployment_spec.yaml \ -e resource_type=Backup -e resource_name=s3-backup-1 - Удалите план резервного копирования:
ansible-playbook delete.yaml -i deployment_spec.yaml \ -e resource_type=BackupPlan -e resource_name=s3-backup-plan - Удалите кластер и вычислительную среду, выполнив шаг Clean up Resources (Удаление ресурсов) из практической работы Deploy AlloyDB Omni high availability cluster on GCE VMs using RPM Orchestrator (Развертывание кластера высокой доступности AlloyDB Omni на виртуальных машинах GCE с помощью оркестратора RPM). Сервер MinIO и его резервные копии находятся на контрольной ВМ. При удалении вычислительной среды удаляются и сервер, и резервные копии.
9. Поздравляю!
Поздравляем! Вы создали резервную копию кластера с высокой доступностью в объектном хранилище, совместимом с S3, для AlloyDB Omni с помощью оркестратора RPM. Затем вы восстановили кластер из резервных копий.
Что мы обсудили
- Как установить и запустить MinIO в качестве хранилища объектов, совместимого с S3.
- Как создать план резервного копирования и выполнить резервное копирование по запросу.
- Как восстановить кластер из резервной копии на определенный момент времени.
Подробную информацию можно найти в следующих статьях: