Sao lưu và khôi phục AlloyDB Omni vào bộ nhớ tương thích với S3 bằng trình điều phối RPM

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ sao lưu một cụm có tính sẵn sàng cao (HA) vào bộ nhớ đối tượng tương thích với S3 cho AlloyDB Omni bằng cách sử dụng trình điều phối RPM.

Lớp học lập trình này sử dụng cụm từ lớp học lập trình Triển khai cụm có tính sẵn sàng cao AlloyDB Omni trên các máy ảo GCE bằng Trình điều phối RPM để tạo một cụm có tính sẵn sàng cao trên các máy ảo Compute Engine. Trong lớp học lập trình này, bạn sẽ thêm một máy chủ lưu trữ đối tượng tương thích với S3 vào một trong các VM. Bạn sử dụng máy chủ lưu trữ đối tượng cho cụm HA để sao lưu dữ liệu và khôi phục cụm từ máy chủ.

Cloud Shell kết nối với VM điều khiển. VM kiểm soát chạy Ansible và MinIO. psql kết nối với cụm thông qua IP ảo của các VM HAProxy. Các VM cơ sở dữ liệu gửi bản sao lưu đến MinIO trên cổng 9000.

Điều kiện tiên quyết

  • Một dự án trên Google Cloud đã bật tính năng thanh toán.
  • Các vai trò IAM mà lớp học lập trình về tính năng HA liệt kê.
  • Có kiến thức cơ bản về các lệnh Linux và SQL.

Kiến thức bạn sẽ học được

  • Cách cài đặt và chạy một máy chủ lưu trữ đối tượng tương thích với S3 để sao lưu.
  • Cách tạo kế hoạch sao lưu để ghi dữ liệu sao lưu vào bộ nhớ tương thích với S3.
  • Cách tạo bản sao lưu theo yêu cầu.
  • Cách khôi phục một cụm từ bản sao lưu và đến một thời điểm.

Bạn cần có

2. Thiết lập và yêu cầu

  1. Ở bước này, bạn sẽ tạo một cụm có tính sẵn sàng cao bằng cách sử dụng lớp học lập trình Triển khai cụm có tính sẵn sàng cao AlloyDB Omni trên các VM GCE bằng Trình điều phối RPM. Hoàn tất các bước sau. Nếu bạn đã có một cụm từ lớp học lập trình, hãy tiếp tục với bước tiếp theo.
  2. Lưu ý: Đừng thực hiện bước "Dọn dẹp tài nguyên" ở giai đoạn này. Bạn sẽ thực hiện bước đó ở cuối lớp học lập trình này.
  3. Quay lại lớp học lập trình này

3. Kết nối với cụm và thêm dữ liệu mẫu

Trong bước này, bạn sẽ tải các chế độ cài đặt cụm trên VM điều khiển. Sau đó, bạn kết nối với cụm và thêm một bảng có dữ liệu mẫu.

  1. Nếu bạn chưa kết nối với VM kiểm soát, hãy kết nối với VM đó từ Cloud Shell:
    gcloud compute ssh "$CLUSTER-control" --zone="$ZONE" --project="$PROJECT"
    
    Các biến CLUSTER, ZONE và PROJECT đến từ bước Chuẩn bị máy ảo để triển khai trong lớp học lập trình Triển khai cụm có tính sẵn sàng cao AlloyDB Omni trên máy ảo GCE bằng Trình điều phối RPM. Nếu Cloud Shell không có các biến này, hãy đặt lại.
  2. Trên VM điều khiển, hãy chuyển sang thư mục chính và tải các biến môi trường. Sau đó, hãy thêm tên cụm và người dùng SSH vào tệp môi trường:
    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)='
    
    Xác minh rằng đầu ra cho thấy CLUSTER, SSH_USER và VIRTUAL_IP. Lưu ý: Nếu sau này bạn kết nối lại với VM điều khiển, hãy chạy cd ~ và source ~/.codelab.env trước khi tiếp tục.
  3. Thêm chế độ cài đặt kết nối vào tệp môi trường. Khi lệnh read yêu cầu mật khẩu, hãy nhập mật khẩu của người dùng postgres. Bạn thiết lập mật khẩu này trong bước Khởi động cụm AlloyDB Omni trong lớp học lập trình Triển khai cụm có tính sẵn sàng cao AlloyDB Omni trên các VM GCE bằng Trình điều phối 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)='
    
  4. Tạo bảng và thêm 1.000 hàng:
    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
    
  5. Đếm số hàng:
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    Xác minh rằng đầu ra trả về 1000.

4. Cài đặt và chạy bộ nhớ đối tượng tương thích với S3

Trong bước này, bạn sẽ viết một sổ tay Ansible để cài đặt máy chủ MinIO trên VM điều khiển. Playbook này cũng tạo vùng chứa và người dùng cho các bản sao lưu, đồng thời đảm bảo rằng các VM cơ sở dữ liệu có thể kết nối với MinIO. Chạy tất cả các lệnh trong bước này trên VM điều khiển.

  1. Trên VM điều khiển, hãy thêm chế độ cài đặt bộ nhớ vào tệp môi trường. Lệnh openssl tạo mật khẩu ngẫu nhiên.
    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"
    
    Đảm bảo rằng đầu ra cho thấy tên và địa chỉ IP nội bộ của VM kiểm soát, ví dụ: my-cluster-control 10.1.0.2. Các VM cơ sở dữ liệu sử dụng tên máy chủ lưu trữ và địa chỉ IP này để kết nối với MinIO. Máy chủ siêu dữ liệu của VM cung cấp địa chỉ IP. Để biết thêm thông tin, hãy xem tài liệu về siêu dữ liệu VM.Các giá trị MINIO_URL và MC_URL là URL tải xuống của máy chủ MinIO và của ứng dụng MinIO (mc).
  2. Cài đặt bộ sưu tập Ansible community.crypto bắt buộc trên máy ảo kiểm soát:
    ansible-galaxy collection install community.crypto
    
  3. Tạo cẩm nang 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
    EOF
    
    Biến MINIO_DOMAIN cho phép MinIO chấp nhận các yêu cầu theo kiểu máy chủ ảo. Trình điều phối RPM sử dụng người dùng alloydb-backup để ghi dữ liệu sao lưu. Chính sách readwrite là một chính sách tích hợp của MinIO.
  4. Chạy Playbook:
    ansible-playbook s3_server.yaml -i deployment_spec.yaml
    
    Xác minh rằng đầu ra PLAY RECAP cho thấy failed=0 cho localhost và cho từng VM cơ sở dữ liệu.
  5. Xác minh rằng vùng chứa tồn tại:
    mc --insecure ls s3repo
    
    Xác minh rằng đầu ra cho thấy nhóm alloydb-backups/.

5. Lập kế hoạch sao lưu

Kế hoạch sao lưu chứa vị trí lưu trữ, lịch biểu và khoảng thời gian lưu giữ cho các bản sao lưu của một cụm. Ở bước này, bạn sẽ tạo một kế hoạch sao lưu cho nhóm MinIO.

  1. Trên VM điều khiển, hãy tạo kịch bản sao lưu và kịch bản trạng thái. Bạn sử dụng cẩm nang sao lưu cho các tài nguyên Secret, BackupPlan và Backup. Bạn sử dụng sổ tay trạng thái để cho biết trạng thái của một tài nguyên.
    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
    
  2. Tạo tài nguyên Secret cho thông tin đăng nhập S3. Sau đó, hãy áp dụng tài nguyên:
    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.yaml
    
    Tên khoá trong phần data phải là access-key-id và access-key. Bạn phải áp dụng tài nguyên Secret trước khi áp dụng tài nguyên BackupPlan.
  3. Tạo tài nguyên BackupPlan rồi áp dụng tài nguyên đó:
    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.yaml
    
    Giá trị key là đường dẫn cho các bản sao lưu trong nhóm. Đường dẫn này phải bắt đầu bằng dấu gạch chéo (/). Trường caBundle chứa chứng chỉ CA được mã hoá PEM để xác thực chứng chỉ của máy chủ lưu trữ S3.
  4. Xác minh rằng kế hoạch sao lưu đã sẵn sàng:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=BackupPlan -e resource_name=s3-backup-plan
    
    Xác minh rằng trường phase cho thấy Ready. Nếu giai đoạn không phải là Ready, hãy đợi một phút rồi chạy lại lệnh.
  5. Khi một kế hoạch sao lưu được tạo, trình điều phối RPM sẽ tự động bắt đầu một quy trình sao lưu toàn bộ ban đầu. Xác minh rằng bản sao lưu ban đầu này đã hoàn tất trước khi bạn tạo bản sao lưu theo yêu cầu:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Backup
    
    Xác minh rằng giai đoạn sao lưu ban đầu thành công.

6. Tạo bản sao lưu theo yêu cầu

Trong bước này, bạn sẽ tạo một bản sao lưu theo yêu cầu của cụm.

  1. Trên VM kiểm soát, hãy tạo tài nguyên Backup. Sau đó, hãy áp dụng tài nguyên:
    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.yaml
    
    Trường backupPlanRef là tên của kế hoạch sao lưu. Trường dbclusterRef là tên của cụm.
  2. Xác minh để đảm bảo quá trình sao lưu đã hoàn tất:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Backup -e resource_name=s3-backup-1
    
    Xác minh rằng trường phase cho thấy Succeeded. Nếu giai đoạn không phải là Succeeded, hãy đợi một phút rồi chạy lại lệnh.
  3. Xác minh rằng các tệp sao lưu nằm trong vùng lưu trữ:
    mc --insecure tree "s3repo/$S3_BUCKET"
    
    Xác minh rằng đầu ra cho thấy một thư mục backup chứa một thư mục db.

7. Khôi phục cụm từ bản sao lưu

Trình điều phối RPM khôi phục một cụm tại chỗ. Trong bước này, bạn sẽ xoá một bảng rồi khôi phục bảng đó từ bản sao lưu. Sau đó, bạn có thể khôi phục cụm về một thời điểm bất kỳ.

Thận trọng: Thao tác khôi phục sẽ ghi đè tất cả dữ liệu trong cụm cơ sở dữ liệu.

Khôi phục từ bản sao lưu

  1. Trên VM điều khiển, hãy xoá bảng orders. Sau đó, hãy đếm số hàng:
    psql -c "DROP TABLE public.orders;"
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    Xác minh rằng lệnh thứ hai không thành công và có lỗi. Thông báo lỗi cho biết mối quan hệ không tồn tại. Ví dụ: "ERROR: table "orders" does not exist" (LỖI: bảng "orders" không tồn tại)
  2. Tạo cẩm nang khôi phục:
    cat > restore.yaml <<EOF
    - name: Restore AlloyDB Omni cluster
      hosts: localhost
      roles:
        - role: google.alloydbomni_orchestrator.restore
    EOF
    
  3. Tạo tài nguyên Restore cho bản sao lưu s3-backup-1. Sau đó, hãy áp dụng tài nguyên:
    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
    
  4. Xác minh rằng quá trình khôi phục đã hoàn tất:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Restore -e resource_name=s3-restore-1
    
    Xác minh rằng trường phase cho thấy ProvisionSucceeded. Nếu giai đoạn không phải là ProvisionSucceeded, hãy đợi một phút rồi chạy lại lệnh.
  5. Đếm số hàng trong bảng được khôi phục:
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    Xác minh rằng đầu ra cho thấy 1000.

(Không bắt buộc) Khôi phục về một thời điểm

Tính năng khôi phục tại một thời điểm sử dụng bản sao lưu và nhật ký ghi trước (WAL) được lưu trữ. Bạn có thể khôi phục cụm về bất kỳ thời điểm nào trong khoảng thời gian khôi phục của kế hoạch sao lưu.

Quy tắc về thời gian mục tiêu

Bạn phải tuân thủ tất cả các quy tắc để chọn giá trị và định dạng cho thời gian mục tiêu:

  • Sử dụng định dạng RFC 3339 theo giờ UTC: YYYY-MM-DDThh:mm:ssZ. Ví dụ: 2026-06-19T14:30:00Z là 14:30:00 ngày 19 tháng 6 năm 2026 (giờ UTC). Chữ cái T phân tách ngày và giờ. Chữ Z cho biết giờ UTC.
  • Sử dụng một thời điểm trong quá khứ.
  • Sử dụng thời gian sau giá trị begin của trường recoveryWindow trong CRD BackupPlan.

Để hiện thời gian hiện tại ở định dạng RFC 3339, hãy chạy lệnh sau:

date -u +%Y-%m-%dT%H:%M:%SZ

Để thay đổi giờ địa phương sang định dạng này, hãy thêm độ lệch UTC của giờ địa phương vào lệnh date. Ví dụ: lệnh sau đây sẽ thay đổi 16:30:00 trên 19 June 2026 tại UTC+02:00:

date -u -d "2026-06-19 16:30:00 +0200" +%Y-%m-%dT%H:%M:%SZ

Lệnh này trả về 2026-06-19T14:30:00Z.

Khôi phục về thời gian đã ghi

Trong quy trình này, bạn sẽ thêm các hàng vào bảng và ghi lại thời gian. Khi ghi lại một thời điểm, bạn sẽ đánh dấu chính xác thời điểm cơ sở dữ liệu hoàn toàn nguyên vẹn (có đúng 1.500 hàng). Sau đó,bạn sẽ xoá các hàng và khôi phục cụm về thời điểm đã ghi.

  1. Thêm 500 hàng vào bảng:
    psql <<'SQL'
    INSERT INTO public.orders (id, item)
    SELECT g, 'item-' || g FROM pg_catalog.generate_series(1001, 1500) AS g;
    SQL
    
  2. Ghi lại thời gian. Hiện tại,bảng này có 1.500 hàng.
    sleep 5
    PITR_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)
    echo "export PITR_TIME=$PITR_TIME" >> ~/.codelab.env
    echo "$PITR_TIME"
    sleep 5
    
    Xác minh rằng đầu ra cho thấy thời gian ở định dạng YYYY-MM-DDThh:mm:ssZ, ví dụ: 2026-10-05T11:16:02Z.
  3. Xoá các hàng khỏi bảng để mô phỏng trường hợp xoá dữ liệu do nhầm lẫn. Sau đó, hãy bắt đầu một tệp WAL mới:
    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();"
    
    Xác minh rằng cụm từ tìm kiếm count cho thấy 1000. Hàm pg_switch_wal khiến máy chủ bắt đầu một tệp WAL mới. Sau đó, máy chủ có thể lưu trữ tệp WAL chứa các thay đổi của bạn.
  4. Xác minh rằng khoảng thời gian khôi phục của kế hoạch sao lưu có chứa thời gian ghi:
    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-plan
    
    Xác minh rằng giá trị PITR_TIME nằm sau giá trị begin của trường recoveryWindow.
  5. Tạo tài nguyên Restore cho thời gian đã ghi. Sau đó, hãy áp dụng tài nguyên:
    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
    
  6. Xác minh rằng quá trình khôi phục đã hoàn tất:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Restore -e resource_name=s3-restore-pitr
    
    Xác minh rằng trường phase cho thấy ProvisionSucceeded. Nếu giai đoạn không phải là ProvisionSucceeded, hãy đợi một phút rồi chạy lại lệnh.
  7. Đếm số hàng:
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    Xác minh rằng đầu ra cho thấy 1500.

8. Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn, hãy xoá các tài nguyên của lớp học lập trình này và lớp học lập trình Triển khai cụm có tính sẵn sàng cao AlloyDB Omni trên máy ảo GCE bằng Trình điều phối RPM. Trước tiên, hãy xoá các tài nguyên sao lưu, sau đó xoá cụm và môi trường điện toán.

  1. Trên VM điều khiển, hãy tạo playbook xoá:
    cat > delete.yaml <<EOF
    - name: Delete AlloyDB Omni resources
      hosts: localhost
      roles:
        - role: google.alloydbomni_orchestrator.delete
    EOF
    
  2. Liệt kê các bản sao lưu:
    ansible-playbook status.yaml -i deployment_spec.yaml -e resource_type=Backup
    
    Xác minh rằng đầu ra cho thấy bản sao lưu s3-backup-1.
  3. Xoá bản sao lưu trên s3-backup-1:
    ansible-playbook delete.yaml -i deployment_spec.yaml \
        -e resource_type=Backup -e resource_name=s3-backup-1
    
  4. Xoá kế hoạch sao lưu:
    ansible-playbook delete.yaml -i deployment_spec.yaml \
        -e resource_type=BackupPlan -e resource_name=s3-backup-plan
    
  5. Xoá cụm và môi trường điện toán bằng bước Xoá tài nguyên trong lớp học lập trình Triển khai cụm có tính sẵn sàng cao AlloyDB Omni trên máy ảo GCE bằng Trình điều phối RPM. Máy chủ MinIO và các bản sao lưu trong đó nằm trên VM kiểm soát. Khi xoá môi trường điện toán, bạn sẽ xoá cả máy chủ và các bản sao lưu.

9. Xin chúc mừng

Xin chúc mừng. Bạn đã sao lưu một cụm có tính sẵn sàng cao (HA) vào bộ nhớ đối tượng tương thích với S3 cho AlloyDB Omni bằng trình điều phối RPM. Sau đó, bạn đã khôi phục cụm từ các bản sao lưu.

Nội dung đã đề cập

  • Cách cài đặt và chạy MinIO dưới dạng bộ nhớ đối tượng tương thích với S3.
  • Cách tạo kế hoạch sao lưu và bản sao lưu theo yêu cầu.
  • Cách khôi phục một cụm từ bản sao lưu và đến một thời điểm.

Để biết thêm thông tin chi tiết, vui lòng xem trang bên dưới:

10. Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành các bài tập