1. Pengantar
Dalam codelab ini, Anda akan mencadangkan cluster ketersediaan tinggi (HA) ke penyimpanan objek yang kompatibel dengan S3 untuk AlloyDB Omni menggunakan orchestrator RPM.
Codelab ini menggunakan cluster dari codelab Men-deploy cluster ketersediaan tinggi AlloyDB Omni di VM GCE menggunakan RPM Orchestrator untuk membuat cluster HA di virtual machine (VM) Compute Engine. Dalam codelab ini, Anda akan menambahkan server penyimpanan objek yang kompatibel dengan S3 di salah satu VM. Anda menggunakan server penyimpanan objek untuk cluster HA guna mencadangkan data ke dan memulihkan cluster dari server.

Prasyarat
- Project Google Cloud yang mengaktifkan penagihan.
- Peran IAM yang tercantum dalam codelab HA.
- Pengetahuan dasar tentang perintah Linux dan SQL.
Yang akan Anda pelajari
- Cara menginstal dan menjalankan server penyimpanan objek yang kompatibel dengan S3 untuk pencadangan.
- Cara membuat rencana cadangan yang menulis cadangan ke penyimpanan yang kompatibel dengan S3.
- Cara membuat cadangan on-demand.
- Cara memulihkan cluster dari cadangan dan ke titik waktu.
Yang Anda butuhkan
- URL repositori software AlloyDB Omni dan koleksi Ansible orchestrator. Untuk menerima URL, isi formulir pendaftaran AlloyDB Omni. Untuk mengetahui informasi selengkapnya, lihat Ringkasan AlloyDB Omni menggunakan RPM. Anda menggunakan URL di codelab HA.
- Cluster HA AlloyDB Omni dari codelab Men-deploy cluster ketersediaan tinggi AlloyDB Omni di VM GCE menggunakan Orchestrator RPM.
- Terminal dengan akses ke Google Cloud dan Cloud Shell.
2. Penyiapan dan Persyaratan
- Pada langkah ini, Anda akan membuat cluster HA menggunakan codelab Men-deploy cluster ketersediaan tinggi AlloyDB Omni di VM GCE menggunakan RPM Orchestrator. Selesaikan langkah-langkah berikut. Jika Anda sudah memiliki cluster dari codelab, lanjutkan ke langkah berikutnya.
- Catatan: Jangan jalankan langkah "Bersihkan Resource" pada tahap ini. Anda akan melakukan langkah tersebut di akhir codelab ini.
- Kembali ke codelab ini
3. Hubungkan ke cluster dan tambahkan data sampel
Pada langkah ini, Anda akan memuat setelan cluster di VM kontrol. Kemudian, Anda terhubung ke cluster dan menambahkan tabel dengan data sampel.
- Jika Anda tidak terhubung ke VM kontrol, hubungkan ke VM tersebut dari Cloud Shell:
Variabelgcloud compute ssh "$CLUSTER-control" --zone="$ZONE" --project="$PROJECT"CLUSTER,ZONE, danPROJECTberasal dari langkah Siapkan VM untuk deployment di codelab Men-deploy cluster ketersediaan tinggi AlloyDB Omni di VM GCE menggunakan RPM Orchestrator. Jika Cloud Shell tidak memiliki variabel ini, tetapkan lagi. - Di VM kontrol, pindah ke direktori utama Anda dan muat variabel lingkungan. Kemudian, tambahkan nama cluster dan pengguna SSH ke file lingkungan:
Pastikan output menampilkancd ~ 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, danVIRTUAL_IP. Catatan: Jika Anda terhubung ke VM kontrol lagi nanti, jalankancd ~dansource ~/.codelab.envsebelum melanjutkan. - Tambahkan setelan koneksi ke file lingkungan. Saat perintah
readmeminta sandi, masukkan sandi penggunapostgres. Anda menetapkan sandi ini di langkah Bootstrap AlloyDB Omni Cluster dalam codelab Deploy AlloyDB Omni cluster ketersediaan tinggi di VM GCE menggunakan RPM Orchestratorcat >> ~/.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)=' - Buat tabel dan tambahkan 1.000 baris:
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 - Menghitung baris:
Pastikan output menampilkanpsql -c "SELECT pg_catalog.count(*) FROM public.orders;"1000.
4. Menginstal dan menjalankan penyimpanan objek yang kompatibel dengan S3
Pada langkah ini, Anda akan menulis playbook Ansible yang menginstal server MinIO di VM kontrol. Playbook ini juga membuat bucket dan pengguna untuk cadangan, serta memastikan bahwa VM database dapat terhubung ke MinIO. Jalankan semua perintah dalam langkah ini di VM kontrol.
- Di VM kontrol, tambahkan setelan penyimpanan ke file lingkungan. Perintah
opensslmembuat sandi acak. Pastikan output menampilkan nama dan alamat IP internal VM kontrol, misalnyaMD=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. VM database menggunakan nama host dan alamat IP ini untuk terhubung ke MinIO. Server metadata VM memberikan alamat IP. Untuk mengetahui informasi selengkapnya, lihat dokumentasi metadata VM.NilaiMINIO_URLdanMC_URLadalah URL download server MinIO dan klien MinIO (mc). - Instal koleksi Ansible
community.cryptoyang diperlukan di VM kontrol:ansible-galaxy collection install community.crypto - Buat playbook
s3_server.yaml: Variabelcat > 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_DOMAINmemungkinkan MinIO menerima permintaan gaya virtual host. Pengelola RPM menggunakan penggunaalloydb-backupuntuk menulis cadangan. Kebijakanreadwriteadalah kebijakan bawaan MinIO. - Jalankan playbook:
Verifikasi bahwa outputansible-playbook s3_server.yaml -i deployment_spec.yamlPLAY RECAPmenampilkanfailed=0untuklocalhostdan untuk setiap VM database. - Pastikan bucket ada:
Pastikan output menampilkan bucketmc --insecure ls s3repoalloydb-backups/.
5. Buat rencana cadangan
Rencana pencadangan berisi lokasi penyimpanan, jadwal, dan periode retensi untuk pencadangan cluster. Pada langkah ini, Anda akan membuat rencana pencadangan untuk bucket MinIO.
- Di VM kontrol, buat playbook pencadangan dan playbook status. Anda menggunakan playbook pencadangan untuk resource
Secret,BackupPlan, danBackup. Anda menggunakan playbook status untuk menampilkan status resource.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 - Buat resource
Secretuntuk kredensial S3. Kemudian, terapkan resource: Nama kunci di bagianS3_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.yamldataharus berupaaccess-key-iddanaccess-key. Anda harus menerapkan resourceSecretsebelum menerapkan resourceBackupPlan. - Buat resource
BackupPlan, lalu terapkan resource: Nilaicat > 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.yamlkeyadalah jalur untuk cadangan di bucket. Jalur ini harus dimulai dengan garis miring (/). KolomcaBundleberisi sertifikat CA berenkode PEM yang memvalidasi sertifikat server penyimpanan S3. - Pastikan rencana pencadangan sudah siap:
Pastikan kolomansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=BackupPlan -e resource_name=s3-backup-planphasemenampilkanReady. Jika fase tidakReady, tunggu satu menit, lalu jalankan kembali perintah. - Saat rencana pencadangan dibuat, orkestrator RPM akan memulai pencadangan penuh awal secara otomatis. Pastikan cadangan awal ini selesai sebelum Anda membuat cadangan on-demand:
Pastikan fase pencadangan awal berhasil.ansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Backup
6. Membuat Pencadangan Sesuai Permintaan
Pada langkah ini, Anda akan membuat cadangan on-demand cluster.
- Di VM kontrol, buat resource
Backup. Kemudian, terapkan resource: Kolomcat > 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.yamlbackupPlanRefadalah nama rencana pencadangan. KolomdbclusterRefadalah nama cluster. - Pastikan pencadangan selesai:
Pastikan kolomansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Backup -e resource_name=s3-backup-1phasemenampilkanSucceeded. Jika fase tidakSucceeded, tunggu satu menit, lalu jalankan kembali perintah. - Pastikan file cadangan ada di bucket:
Verifikasi bahwa output menampilkan foldermc --insecure tree "s3repo/$S3_BUCKET"backupyang berisi folderdb.
7. Memulihkan cluster dari cadangan
Pengelola RPM memulihkan cluster di tempatnya. Pada langkah ini, Anda akan menghapus tabel dan memulihkannya dari cadangan. Kemudian, Anda dapat memulihkan cluster ke titik waktu tertentu secara opsional.
Perhatian: Operasi pemulihan akan menimpa semua data dalam cluster database.
Memulihkan dari cadangan
- Di VM kontrol, hapus tabel
orders. Kemudian, hitung baris: Pastikan perintah kedua gagal dengan error. Pesan error menunjukkan bahwa relasi tidak ada. Misalnya, 'ERROR: table "orders" does not exist' (ERROR: tabel "orders" tidak ada)psql -c "DROP TABLE public.orders;" psql -c "SELECT pg_catalog.count(*) FROM public.orders;" - Buat playbook pemulihan:
cat > restore.yaml <<EOF - name: Restore AlloyDB Omni cluster hosts: localhost roles: - role: google.alloydbomni_orchestrator.restore EOF - Buat resource
Restoreuntuk cadangans3-backup-1. Kemudian, terapkan resource: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 - Verifikasi bahwa operasi pemulihan telah selesai:
Pastikan kolomansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Restore -e resource_name=s3-restore-1phasemenampilkanProvisionSucceeded. Jika fase tidakProvisionSucceeded, tunggu satu menit, lalu jalankan kembali perintah. - Hitung baris dalam tabel yang dipulihkan:
Pastikan output menampilkanpsql -c "SELECT pg_catalog.count(*) FROM public.orders;"1000.
(Opsional) Memulihkan ke titik waktu
Pemulihan point-in-time menggunakan cadangan dan write-ahead log (WAL) yang diarsipkan. Anda dapat memulihkan cluster ke waktu kapan saja dalam periode pemulihan rencana pencadangan.
Aturan untuk waktu target
Anda harus mengikuti semua aturan untuk memilih nilai dan format waktu target:
- Gunakan format RFC 3339 dalam UTC:
YYYY-MM-DDThh:mm:ssZ. Misalnya,2026-06-19T14:30:00Zadalah 14.30.00 UTC pada 19 Juni 2026. HurufTmemisahkan tanggal dan waktu. HurufZmenunjukkan UTC. - Gunakan waktu di masa lalu.
- Gunakan waktu setelah nilai
begindari kolomrecoveryWindowCRDBackupPlan.
Untuk menampilkan waktu saat ini dalam format RFC 3339, jalankan perintah ini:
date -u +%Y-%m-%dT%H:%M:%SZ
Untuk mengubah waktu lokal ke format ini, tambahkan selisih UTC waktu lokal ke perintah date. Misalnya, perintah berikut mengubah 16:30:00 di 19 June 2026 pada UTC+02:00:
date -u -d "2026-06-19 16:30:00 +0200" +%Y-%m-%dT%H:%M:%SZ
Perintah akan menampilkan 2026-06-19T14:30:00Z.
Memulihkan ke waktu yang direkam
Dalam prosedur ini, Anda akan menambahkan baris ke tabel dan mencatat waktu. Saat merekam waktu, Anda menandai momen saat database benar-benar utuh (memiliki tepat 1.500 baris). Kemudian,Anda menghapus baris dan memulihkan cluster ke waktu yang direkam.
- Tambahkan 500 baris ke tabel:
psql <<'SQL' INSERT INTO public.orders (id, item) SELECT g, 'item-' || g FROM pg_catalog.generate_series(1001, 1500) AS g; SQL - Mencatat waktu. Saat ini,tabel memiliki 1.500 baris.
Pastikan output menampilkan waktu dalam formatsleep 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, misalnya2026-10-05T11:16:02Z. - Hapus baris dari tabel untuk menyimulasikan penghapusan data yang tidak disengaja. Kemudian, mulai file WAL baru:
Pastikan kueripsql -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();"countmenampilkan1000. Fungsipg_switch_walmembuat server memulai file WAL baru. Kemudian, server dapat mengarsipkan file WAL yang berisi perubahan Anda. - Pastikan periode pemulihan paket pencadangan berisi waktu yang direkam:
Verifikasi bahwa nilaitest -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_TIMEberada setelah nilaibeginkolomrecoveryWindow. - Buat resource
Restoreuntuk waktu yang direkam. Kemudian, terapkan resource: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 - Verifikasi bahwa operasi pemulihan telah selesai:
Pastikan kolomansible-playbook status.yaml -i deployment_spec.yaml \ -e resource_type=Restore -e resource_name=s3-restore-pitrphasemenampilkanProvisionSucceeded. Jika fase tidakProvisionSucceeded, tunggu satu menit, lalu jalankan kembali perintah. - Menghitung baris:
Pastikan output menampilkanpsql -c "SELECT pg_catalog.count(*) FROM public.orders;"1500.
8. Pembersihan
Untuk mencegah tagihan ke akun Google Cloud Anda, hapus resource codelab ini dan codelab Deploy AlloyDB Omni cluster ketersediaan tinggi di VM GCE menggunakan RPM Orchestrator. Pertama, hapus resource cadangan, lalu hapus cluster dan lingkungan komputasi.
- Di VM kontrol, buat playbook penghapusan:
cat > delete.yaml <<EOF - name: Delete AlloyDB Omni resources hosts: localhost roles: - role: google.alloydbomni_orchestrator.delete EOF - Mencantumkan cadangan:
Verifikasi bahwa output menampilkan cadanganansible-playbook status.yaml -i deployment_spec.yaml -e resource_type=Backups3-backup-1. - Menghapus cadangan
s3-backup-1:ansible-playbook delete.yaml -i deployment_spec.yaml \ -e resource_type=Backup -e resource_name=s3-backup-1 - Menghapus paket pencadangan:
ansible-playbook delete.yaml -i deployment_spec.yaml \ -e resource_type=BackupPlan -e resource_name=s3-backup-plan - Hapus cluster dan lingkungan komputasi menggunakan langkah Clean up Resources dari codelab Deploy AlloyDB Omni cluster ketersediaan tinggi di GCE VM menggunakan RPM Orchestrator. Server MinIO dan cadangan di dalamnya ada di VM kontrol. Jika Anda menghapus lingkungan komputasi, Anda akan menghapus server dan cadangannya.
9. Selamat
Selamat. Anda mencadangkan cluster ketersediaan tinggi (HA) ke penyimpanan objek yang kompatibel dengan S3 untuk AlloyDB Omni menggunakan orchestrator RPM. Kemudian, Anda memulihkan cluster dari cadangan.
Yang telah kita bahas
- Cara menginstal dan menjalankan MinIO sebagai penyimpanan objek yang kompatibel dengan S3.
- Cara membuat rencana pencadangan dan pencadangan on-demand.
- Cara memulihkan cluster dari cadangan dan ke titik waktu.
Untuk informasi lebih lanjut, lihat halaman berikut: