پشتیبان‌گیری و بازیابی AlloyDB Omni در فضای ذخیره‌سازی سازگار با S3 بااستفاده از هماهنگ‌کننده RPM

۱. مقدمه

در این codelab، بااستفاده از هماهنگ‌کننده RPM، از خوشه دسترس‌پذیری بالا (HA) در فضای ذخیره‌سازی سازگار با S3 برای AlloyDB Omni پشتیبان‌گیری می‌کنید.

این codelab از خوشه codelab Deploy AlloyDB Omni high availability cluster on GCE VMs using RPM Orchestrator برای ایجاد خوشه HA در ماشین‌های مجازی Compute Engine استفاده می‌کند. در این codelab، سرور فضای ذخیره‌سازی شیء سازگار با S3 را به یکی از ماشین‌های مجازی اضافه می‌کنید. از سرور فضای ذخیره‌سازی شیء برای خوشه HA استفاده می‌کنید تا داده‌ها را در آن پشتیبان‌گیری کنید و خوشه را از سرور بازیابی کنید.

‫Cloud Shell به ماشین مجازی کنترل متصل می‌شود. ماشین مجازی کنترل Ansible و MinIO را اجرا می‌کند. psql ازطریق IP مجازی ماشین‌های مجازی HAProxy به خوشه متصل می‌شود. ماشین‌های مجازی پایگاه داده پشتیبان‌گیری‌ها را به MinIO در درگاه ۹۰۰۰ ارسال می‌کنند.

پیش‌نیازها

  • پروژه Google Cloud با صورت‌حساب فعال.
  • نقش‌های IAM که codelab HA فهرست می‌کند.
  • آشنایی اولیه با فرمان‌های Linux و SQL.

آنچه خواهید آموخت

  • نحوه نصب و اجرای سرور ذخیره‌سازی شیء سازگار با S3 برای پشتیبان‌گیری.
  • نحوه ایجاد طرح پشتیبان که پشتیبان‌گیری‌ها را در فضای ذخیره‌سازی سازگار با S3 می‌نویسد.
  • نحوه ایجاد پشتیبان‌گیری درخواستی.
  • نحوه بازیابی خوشه از نسخه پشتیبان و تا یک نقطه زمانی.

آنچه نیاز خواهید داشت

۲. راه‌اندازی و الزامات

  1. در این مرحله، بااستفاده از codelab استقرار خوشه با دسترس‌پذیری بالا AlloyDB Omni در ماشین‌های مجازی GCE بااستفاده از RPM Orchestrator، خوشه با دسترس‌پذیری بالا ایجاد می‌کنید. مراحل زیر را تکمیل کنید. اگر ازقبل خوشه‌ای از کدآزمایی دارید، به مرحله بعدی بروید.
  2. توجه: در این مرحله، گام «پاک‌سازی منابع» را اجرا نکنید. این مرحله را در پایان این codelab انجام خواهید داد.
  3. برگشتن به این codelab

۳. به خوشه متصل شوید و داده‌های نمونه اضافه کنید

در این مرحله، تنظیمات خوشه را در ماشین مجازی کنترل بار می‌کنید. سپس به خوشه متصل می‌شوید و جدولی با داده‌های نمونه اضافه می‌کنید.

  1. اگر به ماشین مجازی کنترل متصل نیستید، از Cloud Shell به آن متصل شوید:
    gcloud compute ssh "$CLUSTER-control" --zone="$ZONE" --project="$PROJECT"
    
    متغیرهای CLUSTER، ZONE، و PROJECT از مرحله آماده‌سازی ماشین‌های مجازی برای استقرار در آزمایش استقرار خوشه با دردسترس بودن بالای AlloyDB Omni در ماشین‌های مجازی GCE بااستفاده از RPM Orchestrator می‌آیند. اگر Cloud Shell این متغیرها را ندارد، آن‌ها را دوباره تنظیم کنید.
  2. در ماشین مجازی کنترل، به دایرکتوری خانه خود بروید و متغیرهای محیط را بار کنید. سپس نام خوشه و کاربر 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 را اجرا کنید.
  3. تنظیمات اتصال را به فایل محیط اضافه کنید. وقتی فرمان read گذرواژه را درخواست کرد، گذرواژه کاربر postgres را وارد کنید. این گذرواژه را در مرحله راه‌اندازی خوشه AlloyDB Omni در codelab استقرار خوشه با دردسترس بودن بالای AlloyDB Omni در ماشین‌های مجازی GCE بااستفاده از RPM Orchestrator تنظیم می‌کنید
    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. جدولی ایجاد کنید و ۱٬۰۰۰ ردیف اضافه کنید:
    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. تعداد ردیف‌ها:
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    تأیید کنید که برونداد 1000 را برمی‌گرداند.

۴. نصب و اجرای فضای ذخیره‌سازی شیء سازگار با S3

در این مرحله، کتابچه Ansible می‌نویسید که سرور MinIO را در ماشین مجازی کنترل نصب می‌کند. این کتابچه راهنما همچنین مخزن و کاربر را برای پشتیبان‌گیری‌ها ایجاد می‌کند و مطمئن می‌شود که ماشین‌های مجازی پایگاه داده می‌توانند به MinIO متصل شوند. همه فرمان‌های این مرحله را در ماشین مجازی کنترل اجرا کنید.

  1. در ماشین مجازی کنترل، تنظیمات فضای ذخیره‌سازی را به فایل محیط اضافه کنید. فرمان‌های openssl گذرواژه‌های تصادفی ایجاد می‌کنند.
    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"
    
    مطمئن شوید که برونداد نام و نشانی IP داخلی ماشین مجازی کنترل را نشان دهد، برای مثال my-cluster-control 10.1.0.2. ماشین‌های مجازی پایگاه داده از این نام میزبان و نشانی IP برای اتصال به MinIO استفاده می‌کنند. نشانی IP را سرور فراداده ماشین مجازی ارائه می‌دهد. برای اطلاعات بیشتر، مستندات فراداده ماشین مجازی را ببینید.مقادیر MINIO_URL و MC_URL نشانی‌های وب بارگیری سرور MinIO و کارخواه MinIO (mc) هستند.
  2. مجموعه Ansible community.crypto موردنیاز را در ماشین مجازی کنترل نصب کنید:
    ansible-galaxy collection install community.crypto
    
  3. ساختن کتابچه راهنمای 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
    
    متغیر MINIO_DOMAIN به MinIO اجازه می‌دهد درخواست‌های سبک میزبان مجازی را بپذیرد. هماهنگ‌کننده RPM از کاربر alloydb-backup برای نوشتن نسخه‌های پشتیبان استفاده می‌کند. خط‌مشی readwrite خط‌مشی داخلی MinIO است.
  4. اجرای دفترچه:
    ansible-playbook s3_server.yaml -i deployment_spec.yaml
    
    تأیید کنید که برونداد PLAY RECAP مقدار failed=0 را برای localhost و برای هر ماشین مجازی پایگاه داده نشان می‌دهد.
  5. تأیید کنید که این انبار وجود دارد:
    mc --insecure ls s3repo
    
    تأیید کنید که برونداد سطل alloydb-backups/ را نشان می‌دهد.

۵. ایجاد طرح پشتیبان

طرح پشتیبان شامل مکان ذخیره‌سازی، زمان‌بندی، و دوره نگهداری برای پشتیبان‌گیری‌های خوشه است. در این مرحله، طرح پشتیبانی برای مخزن MinIO ایجاد می‌کنید.

  1. در ماشین مجازی کنترل، دفترچه راهنمای پشتیبان‌گیری و دفترچه راهنمای وضعیت را ایجاد کنید. از کتابچه راهنمای پشتیبان‌گیری برای منابع 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
    
  2. منبع 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.yaml
    
    نام‌های کلید در بخش data باید access-key-id و access-key باشد. باید منبع Secret را قبل‌از منبع BackupPlan اعمال کنید.
  3. منبع 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.yaml
    
    مقدار key مسیر پشتیبان‌گیری‌ها در دسته‌بندی است. این مسیر باید با خط مورب (/) شروع شود. فیلد caBundle حاوی گواهینامه CA با کد PEM است که گواهینامه سرور ذخیره‌سازی S3 را اعتبارسنجی می‌کند.
  4. تأیید کنید که طرح پشتیبان‌گیری آماده است:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=BackupPlan -e resource_name=s3-backup-plan
    
    تأیید کنید که فیلد phase‏ Ready را نشان می‌دهد. اگر فاز Ready نیست، یک دقیقه صبر کنید و فرمان را دوباره اجرا کنید.
  5. وقتی طرح پشتیبان ایجاد می‌شود، هماهنگ‌کننده RPM به‌طور خودکار پشتیبان‌گیری کامل اولیه را شروع می‌کند. قبل‌از ایجاد پشتیبان‌گیری درخواستی، مطمئن شوید که این پشتیبان‌گیری اولیه تکمیل شده است:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Backup
    
    تأیید کنید که مرحله پشتیبان‌گیری اولیه موفقیت‌آمیز باشد.

‫۶. ایجاد پشتیبان‌گیری درخواستی

در این مرحله، از خوشه نسخه پشتیبان درخواستی ایجاد می‌کنید.

  1. در ماشین مجازی کنترل، منبع 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.yaml
    
    فیلد backupPlanRef نام طرح پشتیبان است. فیلد dbclusterRef نام خوشه است.
  2. تأیید کنید که پشتیبان‌گیری کامل شده است:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Backup -e resource_name=s3-backup-1
    
    تأیید کنید که فیلد phase‏ Succeeded را نشان می‌دهد. اگر فاز Succeeded نیست، یک دقیقه صبر کنید و فرمان را دوباره اجرا کنید.
  3. تأیید کنید که فایل‌های پشتیبان در این مخزن قرار دارند:
    mc --insecure tree "s3repo/$S3_BUCKET"
    
    تأیید کنید که برونداد پوشه backup را نشان می‌دهد که حاوی پوشه db است.

‫۷. بازیابی کردن دسته از نسخه پشتیبان

هماهنگ‌کننده RPM خوشه‌ای را در محل بازیابی می‌کند. در این مرحله، جدولی را حذف می‌کنید و آن را از نسخه پشتیبان بازیابی می‌کنید. سپس می‌توانید خوشه‌بندی را به‌صورت اختیاری به نقطه زمانی بازگردانید.

احتیاط: عملیات بازیابی همه داده‌های موجود در خوشه پایگاه داده را رونویسی می‌کند.

بازیابی از نسخه پشتیبان

  1. در ماشین مجازی کنترل، جدول orders را حذف کنید. سپس ردیف‌ها را بشمارید:
    psql -c "DROP TABLE public.orders;"
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    تأیید کنید که فرمان دوم با خطا ناموفق است. پیام خطا نشان می‌دهد که رابطه وجود ندارد. برای مثال، «ERROR: table "orders" does not exist» (خطا: جدول «سفارش‌ها» وجود ندارد)
  2. ایجاد کتابچه بازیابی:
    cat > restore.yaml <<EOF
    - name: Restore AlloyDB Omni cluster
      hosts: localhost
      roles:
        - role: google.alloydbomni_orchestrator.restore
    EOF
    
  3. منبع 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
    
  4. تأیید کنید که عملیات بازیابی کامل شده است:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Restore -e resource_name=s3-restore-1
    
    تأیید کنید که فیلد phase‏ ProvisionSucceeded را نشان می‌دهد. اگر فاز ProvisionSucceeded نیست، یک دقیقه صبر کنید و فرمان را دوباره اجرا کنید.
  5. تعداد ردیف‌های جدول بازیابی‌شده را بشمارید:
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    تأیید کنید که برونداد 1000 را نشان می‌دهد.

(اختیاری) بازیابی کردن تا یک نقطه زمانی

بازیابی لحظه‌ای از پشتیبان‌گیری و گزارش بایگانی‌شده پیش‌از نوشتن (WAL) استفاده می‌کند. می‌توانید خوشه‌ها را در هر زمانی در بازه بازیابی طرح پشتیبان‌گیری بازیابی کنید.

قوانین زمان هدف

برای انتخاب مقدار و قالب زمان هدف، باید از همه قوانین پیروی کنید:

  • از قالب RFC 3339 در UTC استفاده کنید: YYYY-MM-DDThh:mm:ssZ. برای مثال، 2026-06-19T14:30:00Z برابر با ۱۴:۳۰:۰۰ به وقت ساعت هماهنگ جهانی در ۱۹ ژوئن ۲۰۲۶ است. حرف T تاریخ و زمان را از هم جدا می‌کند. حرف Z ساعت هماهنگ جهانی را نشان می‌دهد.
  • از زمان در گذشته استفاده کنید.
  • از زمان پس‌از مقدار begin فیلد recoveryWindow در CRD BackupPlan استفاده کنید.

برای نمایش زمان کنونی در قالب RFC 3339، این فرمان را اجرا کنید:

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

برای تغییر زمان محلی به این قالب، انحراف زمان محلی از «ساعت هماهنگ جهانی» را به فرمان date اضافه کنید. برای مثال، فرمان زیر 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 را برمی‌گرداند.

بازیابی کردن تا زمان ضبط‌شده

در این روش، ردیف‌هایی به جدول اضافه می‌کنید و زمان را ثبت می‌کنید. وقتی زمانی را ضبط می‌کنید، لحظه دقیقی را که پایگاه داده کاملاً سالم است (دقیقاً ۱۵۰۰ ردیف دارد) نشانک‌گذاری می‌کنید. سپس ردیف‌ها را حذف می‌کنید و خوشه‌ای را به زمان ضبط‌شده بازیابی می‌کنید.

  1. ‫۵۰۰ ردیف به جدول اضافه کنید:
    psql <<'SQL'
    INSERT INTO public.orders (id, item)
    SELECT g, 'item-' || g FROM pg_catalog.generate_series(1001, 1500) AS g;
    SQL
    
  2. زمان را ضبط کنید. درحال‌حاضر جدول ۱۵۰۰ ردیف دارد.
    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
    
    تأیید کنید که برونداد زمان را در قالب YYYY-MM-DDThh:mm:ssZ نشان می‌دهد، برای مثال 2026-10-05T11:16:02Z.
  3. ردیف‌ها را از جدول حذف کنید تا حذف تصادفی داده‌ها شبیه‌سازی شود. سپس فایل 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 حاوی تغییرات شما را بایگانی کند.
  4. تأیید کنید که پنجره بازیابی طرح پشتیبان‌گیری حاوی زمان ضبط‌شده است:
    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
    
    تأیید کنید که مقدار PITR_TIME بعداز مقدار begin فیلد recoveryWindow باشد.
  5. منبع 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
    
  6. تأیید کنید که عملیات بازیابی کامل شده است:
    ansible-playbook status.yaml -i deployment_spec.yaml \
        -e resource_type=Restore -e resource_name=s3-restore-pitr
    
    تأیید کنید که فیلد phase‏ ProvisionSucceeded را نشان می‌دهد. اگر فاز ProvisionSucceeded نیست، یک دقیقه صبر کنید و فرمان را دوباره اجرا کنید.
  7. تعداد ردیف‌ها:
    psql -c "SELECT pg_catalog.count(*) FROM public.orders;"
    
    تأیید کنید که برونداد 1500 را نشان می‌دهد.

‫۸. پاک‌سازی

برای جلوگیری از کسر هزینه از حساب Google Cloud خود، منابع این codelab و codelab استقرار خوشه با دردسترس بودن بالای AlloyDB Omni در ماشین‌های مجازی GCE بااستفاده از RPM Orchestrator را حذف کنید. ابتدا منابع پشتیبان را حذف کنید، سپس خوشه‌ای و محیط محاسباتی را حذف کنید.

  1. در ماشین مجازی کنترل، کتابچه نمایشی حذف را ایجاد کنید:
    cat > delete.yaml <<EOF
    - name: Delete AlloyDB Omni resources
      hosts: localhost
      roles:
        - role: google.alloydbomni_orchestrator.delete
    EOF
    
  2. فهرست کردن نسخه‌های پشتیبان:
    ansible-playbook status.yaml -i deployment_spec.yaml -e resource_type=Backup
    
    تأیید کنید که برونداد پشتیبان‌گیری s3-backup-1 را نشان می‌دهد.
  3. حذف نسخه پشتیبان s3-backup-1:
    ansible-playbook delete.yaml -i deployment_spec.yaml \
        -e resource_type=Backup -e resource_name=s3-backup-1
    
  4. حذف طرح پشتیبان:
    ansible-playbook delete.yaml -i deployment_spec.yaml \
        -e resource_type=BackupPlan -e resource_name=s3-backup-plan
    
  5. خوشه و محیط محاسباتی را بااستفاده از مرحله پاک‌سازی منابع از codelab استقرار خوشه با دردسترس بودن بالای AlloyDB Omni در ماشین‌های مجازی GCE بااستفاده از RPM Orchestrator حذف کنید. سرور MinIO و نسخه‌های پشتیبان موجود در آن در ماشین مجازی کنترل قرار دارند. وقتی محیط محاسباتی را حذف می‌کنید، هم سرور و هم پشتیبان‌گیری‌ها را حذف می‌کنید.

‫۹. تبریک می‌گوییم

تبریک می‌گوییم. بااستفاده از هماهنگ‌کننده RPM، خوشه با دردسترس بودن بالا (HA) را در فضای ذخیره‌سازی شیء سازگار با S3 برای AlloyDB Omni پشتیبان‌گیری کردید. سپس خوشه‌بندی را از نسخه‌های پشتیبان بازیابی کردید.

آنچه پوشش داده‌ایم

  • نحوه نصب و اجرای MinIO به‌عنوان فضای ذخیره‌سازی شیء سازگار با S3.
  • نحوه ایجاد طرح پشتیبان‌گیری و پشتیبان‌گیری درصورت نیاز.
  • نحوه بازیابی خوشه از نسخه پشتیبان و تا یک نقطه زمانی.

برای اطلاعات بیشتر، صفحه‌های زیر را ببینید:

‫۱۰. نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط آن را بخوانید آن را بخوانید و تمرین‌ها را تکمیل کنید