مشاركة عبر


التحقق من صحة واختبار نشر قاعدة بيانات PostgreSQL على خدمة Azure Kubernetes (AKS)

في هذه المقالة، يمكنك تنفيذ خطوات مختلفة للاختبار والتحقق من الصحة على قاعدة بيانات PostgreSQL المنشورة على AKS. يتضمن ذلك التحقق من التوزيع والاتصال بقاعدة البيانات واختبار سيناريوهات تجاوز الفشل.

هام

يتم ذكر البرامج مفتوحة المصدر في جميع وثائق وعينات AKS. يتم استبعاد البرامج التي تنشرها من اتفاقيات مستوى خدمة AKS والضمان المحدود ودعم Azure. أثناء استخدامك للتكنولوجيا مفتوحة المصدر جنبا إلى جنب مع AKS، راجع خيارات الدعم المتوفرة من المجتمعات المحلية المعنية ومشرفي المشاريع لوضع خطة.

تتحمل Microsoft مسؤولية بناء الحزم مفتوحة المصدر التي ننشرها على AKS. تتضمن هذه المسؤولية امتلاك ملكية كاملة لعملية البناء والمسح الضوئي والتوقيع والتحقق من الصحة وإصلاحها، بالإضافة إلى التحكم في الثنائيات في صور الحاوية. لمزيد من المعلومات، راجع إدارة الثغرات الأمنية لتغطية دعم AKS وAKS.

فحص مجموعة PostgreSQL المنشورة

تحقق من انتشار PostgreSQL عبر مناطق توفر متعددة عن طريق استرداد تفاصيل عقدة AKS باستخدام kubectl get الأمر .

kubectl get nodes \
    --context $AKS_PRIMARY_CLUSTER_NAME \
    --namespace $PG_NAMESPACE \
    --output json | jq '.items[] | {node: .metadata.name, zone: .metadata.labels."failure-domain.beta.kubernetes.io/zone"}'

يجب أن يشبه الإخراج الخاص بك إخراج المثال التالي مع منطقة التوفر الموضحة لكل عقدة:

{
    "node": "aks-postgres-15810965-vmss000000",
    "zone": "westus3-1"
}
{
    "node": "aks-postgres-15810965-vmss000001",
    "zone": "westus3-2"
}
{
    "node": "aks-postgres-15810965-vmss000002",
    "zone": "westus3-3"
}
{
    "node": "aks-systempool-26112968-vmss000000",
    "zone": "westus3-1"
}
{
    "node": "aks-systempool-26112968-vmss000001",
    "zone": "westus3-2"
}

الاتصال ب PostgreSQL وإنشاء عينة مجموعة بيانات

في هذا القسم، يمكنك إنشاء جدول وإدراج بعض البيانات في قاعدة بيانات التطبيق التي تم إنشاؤها في CNPG Cluster CRD الذي قمت بنشره سابقا. يمكنك استخدام هذه البيانات للتحقق من صحة عمليات النسخ الاحتياطي والاستعادة لنظام مجموعة PostgreSQL.

  • إنشاء جدول وإدراج البيانات في قاعدة بيانات التطبيق باستخدام الأوامر التالية:

    kubectl cnpg psql $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
    
    -- Create a small dataset
    CREATE TABLE datasample (id INTEGER, name VARCHAR(255));
    INSERT INTO datasample (id, name) VALUES (1, 'John');
    INSERT INTO datasample (id, name) VALUES (2, 'Jane');
    INSERT INTO datasample (id, name) VALUES (3, 'Alice');
    SELECT COUNT(*) FROM datasample;
    

    اكتب \q للخروج من psql عند الانتهاء.

    يجب أن يشبه الإخراج الخاص بك إخراج المثال التالي:

    CREATE TABLE
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    count
    -------
        3
    (1 row)
    

الاتصال بنسخ PostgreSQL المتماثلة للقراءة فقط

  • اتصل بالنسخ المتماثلة للقراءة فقط PostgreSQL وتحقق من صحة مجموعة بيانات العينة باستخدام الأوامر التالية:

    kubectl cnpg psql --replica $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
    
    SELECT pg_is_in_recovery();
    

    مثال على الإخراج

    pg_is_in_recovery
    -------------------
    t
    (1 row)
    
    SELECT COUNT(*) FROM datasample;
    

    مثال على الإخراج

    count
    -------
      3
    (1 row)
    

إعداد النسخ الاحتياطية ل PostgreSQL عند الطلب والمجدولة باستخدام Barman

ملاحظة

من المتوقع أن تقوم CloudNativePG بإهمال دعم Barman Cloud الأصلي لصالح المكون الإضافي Barman Cloud في الإصدار 1.29 القادم. تستمر الخطوات الواردة في هذا الدليل في العمل اليوم ، ولكن خطط للترحيل إلى المكون الإضافي بمجرد استقراره.

  1. تحقق من أن نظام مجموعة PostgreSQL يمكنه الوصول إلى حساب تخزين Azure المحدد في CNPG Cluster CRD وأن Working WAL archiving يبلغ عن استخدام OK الأمر التالي:

    kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME 1 \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    

    مثال على الإخراج

    Continuous Backup status
    First Point of Recoverability:  Not Available
    Working WAL archiving:          OK
    WALs waiting to be archived:    0
    Last Archived WAL:              00000001000000000000000A   @   2024-07-09T17:18:13.982859Z
    Last Failed WAL:                -
    
  2. نشر نسخة احتياطية عند الطلب إلى Azure Storage، والذي يستخدم تكامل هوية حمل عمل AKS، باستخدام ملف YAML مع kubectl apply الأمر .

    export BACKUP_ONDEMAND_NAME="on-demand-backup-1"
    
    cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -v 9 -f -
    apiVersion: postgresql.cnpg.io/v1
    kind: Backup
    metadata:
      name: $BACKUP_ONDEMAND_NAME
    spec:
      method: barmanObjectStore
      cluster:
        name: $PG_PRIMARY_CLUSTER_NAME
    EOF
    
  3. تحقق من حالة النسخ الاحتياطي عند الطلب باستخدام kubectl describe الأمر .

    kubectl describe backup $BACKUP_ONDEMAND_NAME \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    

    مثال على الإخراج

    Type    Reason     Age   From                   Message
     ----    ------     ----  ----                   -------
    Normal  Starting   6s    cloudnative-pg-backup  Starting backup for cluster pg-primary-cnpg-r8c7unrw
    Normal  Starting   5s    instance-manager       Backup started
    Normal  Completed  1s    instance-manager       Backup completed
    
  4. تحقق من أن المجموعة لديها نقطة أولى من قابلية الاسترداد باستخدام الأمر التالي:

    kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME 1 \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    

    مثال على الإخراج

    Continuous Backup status
    First Point of Recoverability:  2024-06-05T13:47:18Z
    Working WAL archiving:          OK
    
  5. تكوين نسخة احتياطية مجدولة لكل ساعة في 15 دقيقة بعد الساعة باستخدام ملف YAML مع kubectl apply الأمر .

    export BACKUP_SCHEDULED_NAME="scheduled-backup-1"
    
    cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -v 9 -f -
    apiVersion: postgresql.cnpg.io/v1
    kind: ScheduledBackup
    metadata:
      name: $BACKUP_SCHEDULED_NAME
    spec:
      # Backup once per hour
      schedule: "0 15 * ? * *"
      backupOwnerReference: self
      cluster:
        name: $PG_PRIMARY_CLUSTER_NAME
    EOF
    
  6. تحقق من حالة النسخ الاحتياطي المجدول باستخدام kubectl describe الأمر .

    kubectl describe scheduledbackup $BACKUP_SCHEDULED_NAME \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    
  7. عرض ملفات النسخ الاحتياطي المخزنة على تخزين Azure blob للمجموعة الأساسية باستخدام az storage blob list الأمر .

    az storage blob list \
        --account-name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \
        --container-name backups \
        --query "[*].name" \
        --only-show-errors
    

    يجب أن يشبه الإخراج الخاص بك إخراج المثال التالي، والتحقق من صحة النسخ الاحتياطي كان ناجحا:

    [
      "pg-primary-cnpg-r8c7unrw/base/20240605T134715/backup.info",
      "pg-primary-cnpg-r8c7unrw/base/20240605T134715/data.tar",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000001",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000002",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000003",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000003.00000028.backup",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000004",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000005",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000005.00000028.backup",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000006",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000007",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000008",
      "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000009"
    ]
    

استعادة النسخ الاحتياطي عند الطلب إلى نظام مجموعة PostgreSQL جديد

في هذا القسم، يمكنك استعادة النسخ الاحتياطي عند الطلب الذي قمت بإنشائه مسبقا باستخدام عامل تشغيل CNPG في مثيل جديد باستخدام bootstrap Cluster CRD. يتم استخدام نظام مجموعة مثيل واحد للتبسيط. تذكر أن هوية حمل عمل AKS (عبر CNPG inheritFromAzureAD) تصل إلى ملفات النسخ الاحتياطي، وأن اسم مجموعة الاسترداد يستخدم لإنشاء حساب خدمة Kubernetes جديد خاص بمجموعة الاسترداد.

يمكنك أيضا إنشاء بيانات اعتماد موحدة ثانية لتعيين حساب خدمة نظام مجموعة الاسترداد الجديد إلى UAMI الموجود الذي لديه حق الوصول "Storage Blob Data Contributor" إلى ملفات النسخ الاحتياطي على تخزين blob.

  1. إنشاء بيانات اعتماد هوية موحدة ثانية باستخدام az identity federated-credential create الأمر .

    export PG_PRIMARY_CLUSTER_NAME_RECOVERED="$PG_PRIMARY_CLUSTER_NAME-recovered-db"
    
    az identity federated-credential create \
        --name $PG_PRIMARY_CLUSTER_NAME_RECOVERED \
        --identity-name $AKS_UAMI_CLUSTER_IDENTITY_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --issuer "${AKS_PRIMARY_CLUSTER_OIDC_ISSUER}" \
        --subject system:serviceaccount:"${PG_NAMESPACE}":"${PG_PRIMARY_CLUSTER_NAME_RECOVERED}" \
        --audience api://AzureADTokenExchange
    
  2. استعادة النسخ الاحتياطي عند الطلب باستخدام Cluster CRD مع kubectl apply الأمر .

    cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -v 9 -f -
    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: $PG_PRIMARY_CLUSTER_NAME_RECOVERED
    spec:
    
      inheritedMetadata:
        annotations:
          service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX
        labels:
          azure.workload.identity/use: "true"
    
      instances: 1
    
      affinity:
        nodeSelector:
          workload: postgres
    
      # Point to cluster backup created earlier and stored on Azure Blob Storage
      bootstrap:
        recovery:
          source: clusterBackup
    
      storage:
        size: 2Gi
        pvcTemplate:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 2Gi
          storageClassName: managed-csi-premium
          volumeMode: Filesystem
    
      walStorage:
        size: 2Gi
        pvcTemplate:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 2Gi
          storageClassName: managed-csi-premium
          volumeMode: Filesystem
    
      serviceAccountTemplate:
        metadata:
          annotations:
            azure.workload.identity/client-id: "$AKS_UAMI_WORKLOAD_CLIENTID"
          labels:
            azure.workload.identity/use: "true"
    
      externalClusters:
        - name: clusterBackup
          barmanObjectStore:
            destinationPath: https://${PG_PRIMARY_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/backups
            serverName: $PG_PRIMARY_CLUSTER_NAME
            azureCredentials:
              inheritFromAzureAD: true
            wal:
              maxParallel: 8
    EOF
    
  3. اتصل بالمثيل المسترد، ثم تحقق من وجود مجموعة البيانات التي تم إنشاؤها على نظام المجموعة الأصلي حيث تم أخذ النسخ الاحتياطي الكامل باستخدام الأمر التالي:

    kubectl cnpg psql $PG_PRIMARY_CLUSTER_NAME_RECOVERED --namespace $PG_NAMESPACE
    
    SELECT COUNT(*) FROM datasample;
    

    مثال على الإخراج

     count
    -------
         3
    (1 row)
    
    Type \q to exit psql
    
  4. احذف المجموعة المستردة باستخدام الأمر التالي:

    kubectl cnpg destroy $PG_PRIMARY_CLUSTER_NAME_RECOVERED 1 \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    
  5. احذف بيانات اعتماد الهوية الموحدة az identity federated-credential delete باستخدام الأمر .

    az identity federated-credential delete \
        --name $PG_PRIMARY_CLUSTER_NAME_RECOVERED \
        --identity-name $AKS_UAMI_CLUSTER_IDENTITY_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --yes
    

كشف نظام مجموعة PostgreSQL باستخدام موازن تحميل عام

في هذا القسم، يمكنك تكوين البنية الأساسية الضرورية لعرض نقاط النهاية للقراءة والكتابة والقراءة فقط ل PostgreSQL بشكل عام مع قيود مصدر IP لعنوان IP العام لمحطة عمل العميل.

يمكنك أيضا استرداد نقاط النهاية التالية من خدمة IP لنظام المجموعة:

  • نقطة نهاية أساسية للقراءة والكتابة تنتهي ب *-rw.
  • من صفر إلى N (اعتمادا على عدد النسخ المتماثلة) نقاط النهاية للقراءة فقط التي تنتهي ب *-ro.
  • نقطة نهاية نسخ متماثل واحدة تنتهي ب *-r.
  1. احصل على تفاصيل خدمة CLUSTER IP باستخدام kubectl get الأمر .

    kubectl get services \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE \
        -l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME
    

    مثال على الإخراج

    NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    pg-primary-cnpg-sryti1qf-r    ClusterIP   10.0.193.27    <none>        5432/TCP   3h57m
    pg-primary-cnpg-sryti1qf-ro   ClusterIP   10.0.237.19    <none>        5432/TCP   3h57m
    pg-primary-cnpg-sryti1qf-rw   ClusterIP   10.0.244.125   <none>        5432/TCP   3h57m
    

    ملاحظة

    هناك ثلاث خدمات: namespace/cluster-name-ro تم تعيينها إلى المنفذ 5433، namespace/cluster-name-rwوتعيينها namespace/cluster-name-r إلى المنفذ 5433. من المهم تجنب استخدام نفس المنفذ مثل عقدة القراءة/الكتابة لمجموعة قاعدة بيانات PostgreSQL. إذا كنت تريد أن تصل التطبيقات إلى النسخة المتماثلة للقراءة فقط من مجموعة قاعدة بيانات PostgreSQL، فوجهها إلى المنفذ 5433. عادة ما تستخدم الخدمة النهائية للنسخ الاحتياطية للبيانات ولكن يمكن أن تعمل أيضا كعقدة للقراءة فقط.

  2. احصل على تفاصيل الخدمة باستخدام kubectl get الأمر .

    export PG_PRIMARY_CLUSTER_RW_SERVICE=$(kubectl get services \
        --namespace $PG_NAMESPACE \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        -l "cnpg.io/cluster" \
        --output json | jq -r '.items[] | select(.metadata.name | endswith("-rw")) | .metadata.name')
    
    echo $PG_PRIMARY_CLUSTER_RW_SERVICE
    
    export PG_PRIMARY_CLUSTER_RO_SERVICE=$(kubectl get services \
        --namespace $PG_NAMESPACE \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        -l "cnpg.io/cluster" \
        --output json | jq -r '.items[] | select(.metadata.name | endswith("-ro")) | .metadata.name')
    
    echo $PG_PRIMARY_CLUSTER_RO_SERVICE
    
  3. تكوين خدمة موازن التحميل مع ملفات YAML التالية باستخدام kubectl apply الأمر .

    cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -f -
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: $AKS_PRIMARY_CLUSTER_NODERG_NAME
        service.beta.kubernetes.io/azure-pip-name: $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME
        service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX
      name: cnpg-cluster-load-balancer-rw
      namespace: "${PG_NAMESPACE}"
    spec:
      type: LoadBalancer
      ports:
      - protocol: TCP
        port: 5432
        targetPort: 5432
      selector:
        cnpg.io/instanceRole: primary
        cnpg.io/podRole: instance
      loadBalancerSourceRanges:
      - "$MY_PUBLIC_CLIENT_IP/32"
    EOF
    
    cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -f -
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: $AKS_PRIMARY_CLUSTER_NODERG_NAME
        service.beta.kubernetes.io/azure-pip-name: $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME
        service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX
      name: cnpg-cluster-load-balancer-ro
      namespace: "${PG_NAMESPACE}"
    spec:
      type: LoadBalancer
      ports:
      - protocol: TCP
        port: 5433
        targetPort: 5432
      selector:
        cnpg.io/instanceRole: replica
        cnpg.io/podRole: instance
      loadBalancerSourceRanges:
      - "$MY_PUBLIC_CLIENT_IP/32"
    EOF
    
  4. احصل على تفاصيل الخدمة باستخدام kubectl describe الأمر .

    kubectl describe service cnpg-cluster-load-balancer-rw \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    
    kubectl describe service cnpg-cluster-load-balancer-ro \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_NAMESPACE
    
    export AKS_PRIMARY_CLUSTER_ALB_DNSNAME="$(az network public-ip show \
        --resource-group $AKS_PRIMARY_CLUSTER_NODERG_NAME \
        --name $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME \
        --query "dnsSettings.fqdn" --output tsv)"
    
    echo $AKS_PRIMARY_CLUSTER_ALB_DNSNAME
    

التحقق من صحة نقاط نهاية PostgreSQL العامة

في هذا القسم، يمكنك التحقق من إعداد Azure Load Balancer بشكل صحيح باستخدام IP الثابت الذي قمت بإنشائه سابقا وتوجيه الاتصالات إلى النسخ المتماثلة الأساسية للقراءة والكتابة والقراءة فقط واستخدام psql CLI للاتصال بكليهما.

تذكر أن نقطة النهاية الأساسية للقراءة والكتابة تعين إلى منفذ TCP 5432 ونقاط نهاية النسخة المتماثلة للقراءة فقط إلى المنفذ 5433 للسماح باستخدام نفس اسم PostgreSQL DNS للقراء والكتاب.

ملاحظة

تحتاج إلى قيمة كلمة مرور مستخدم التطبيق لمصادقة PostgreSQL الأساسية التي تم إنشاؤها مسبقا وتخزينها في $PG_DATABASE_APPUSER_SECRET متغير البيئة.

  • تحقق من صحة نقاط نهاية PostgreSQL العامة باستخدام الأوامر التالية psql :

    echo "Public endpoint for PostgreSQL cluster: $AKS_PRIMARY_CLUSTER_ALB_DNSNAME"
    
    # Query the primary, pg_is_in_recovery = false
    
    psql -h $AKS_PRIMARY_CLUSTER_ALB_DNSNAME \
        -p 5432 -U app -d appdb -W -c "SELECT pg_is_in_recovery();"
    

    مثال على الإخراج

    pg_is_in_recovery
    -------------------
     f
    (1 row)
    
    echo "Query a replica, pg_is_in_recovery = true"
    
    psql -h $AKS_PRIMARY_CLUSTER_ALB_DNSNAME \
        -p 5433 -U app -d appdb -W -c "SELECT pg_is_in_recovery();"
    

    مثال على الإخراج

    # Example output
    
    pg_is_in_recovery
    -------------------
    t
    (1 row)
    

    عند الاتصال بنجاح بنقطة نهاية القراءة والكتابة الأساسية، ترجع f الدالة PostgreSQL خطأ، مما يشير إلى أن الاتصال الحالي قابل للكتابة.

    عند الاتصال بنسخة متماثلة، ترجع t الدالة إلى true، مما يشير إلى أن قاعدة البيانات في الاسترداد والقراءة فقط.

محاكاة تجاوز الفشل غير المخطط له

في هذا القسم، تقوم بتشغيل فشل مفاجئ عن طريق حذف الجراب الذي يقوم بتشغيل الأساسي، والذي يحاكي تعطلا مفاجئا أو فقدان اتصال الشبكة بالعقدة التي تستضيف PostgreSQL الأساسي.

  1. تحقق من حالة مثيلات الجراب قيد التشغيل باستخدام الأمر التالي:

    kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
    

    مثال على الإخراج

    Name                        Current LSN Rep role        Status  Node
    --------------------------- ----------- --------        ------- -----------
    pg-primary-cnpg-sryti1qf-1  0/9000060   Primary         OK      aks-postgres-32388626-vmss000000
    pg-primary-cnpg-sryti1qf-2  0/9000060   Standby (sync)  OK      aks-postgres-32388626-vmss000001
    pg-primary-cnpg-sryti1qf-3  0/9000060   Standby (sync)  OK      aks-postgres-32388626-vmss000002
    
  2. احذف الحاوية الأساسية باستخدام kubectl delete الأمر .

    PRIMARY_POD=$(kubectl get pod \
        --namespace $PG_NAMESPACE \
        --no-headers \
        -o custom-columns=":metadata.name" \
        -l role=primary)
    
    kubectl delete pod $PRIMARY_POD --grace-period=1 --namespace $PG_NAMESPACE
    
  3. تحقق من أن pg-primary-cnpg-sryti1qf-2 مثيل pod هو الآن الأساسي باستخدام الأمر التالي:

    kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
    

    مثال على الإخراج

    pg-primary-cnpg-sryti1qf-2  0/9000060   Primary         OK      aks-postgres-32388626-vmss000001
    pg-primary-cnpg-sryti1qf-1  0/9000060   Standby (sync)  OK      aks-postgres-32388626-vmss000000
    pg-primary-cnpg-sryti1qf-3  0/9000060   Standby (sync)  OK      aks-postgres-32388626-vmss000002
    
  4. pg-primary-cnpg-sryti1qf-1 إعادة تعيين مثيل الجراب كجهة أساسية باستخدام الأمر التالي:

    kubectl cnpg promote $PG_PRIMARY_CLUSTER_NAME 1 --namespace $PG_NAMESPACE
    
  5. تحقق من أن مثيلات الجراب قد عادت إلى حالتها الأصلية قبل اختبار تجاوز الفشل غير المخطط له باستخدام الأمر التالي:

    kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
    

    مثال على الإخراج

    Name                        Current LSN Rep role        Status  Node
    --------------------------- ----------- --------        ------- -----------
    pg-primary-cnpg-sryti1qf-1  0/9000060   Primary         OK      aks-postgres-32388626-vmss000000
    pg-primary-cnpg-sryti1qf-2  0/9000060   Standby (sync)  OK      aks-postgres-32388626-vmss000001
    pg-primary-cnpg-sryti1qf-3  0/9000060   Standby (sync)  OK      aks-postgres-32388626-vmss000002
    

تنظيف الموارد

  • بمجرد الانتهاء من مراجعة التوزيع، احذف جميع الموارد التي أنشأتها في هذا الدليل باستخدام az group delete الأمر .

    az group delete --resource-group $RESOURCE_GROUP_NAME --no-wait --yes
    

الخطوات التالية

في هذا الدليل الإرشادي، تعلمت كيفية:

  • استخدم Azure CLI لإنشاء مجموعة AKS متعددة المناطق.
  • نشر نظام مجموعة وقاعدة بيانات PostgreSQL عالية التوفر باستخدام عامل تشغيل CNPG.
  • إعداد المراقبة ل PostgreSQL باستخدام Prometheus وGrafana.
  • نشر عينة مجموعة بيانات إلى قاعدة بيانات PostgreSQL.
  • محاكاة مقاطعة نظام المجموعة وتجاوز فشل النسخة المتماثلة PostgreSQL.
  • إجراء نسخة احتياطية واستعادة قاعدة بيانات PostgreSQL.

لمعرفة المزيد حول كيفية استخدام AKS لأحمال العمل الخاصة بك، راجع ما هي خدمة Azure Kubernetes (AKS)؟ لمعرفة المزيد حول قاعدة بيانات Azure ل PostgreSQL، راجع ما هي قاعدة بيانات Azure ل PostgreSQL؟

المساهمون

تحتفظ Microsoft بهذه المقالة. كتبه المساهمون التاليون في الأصل:

  • كين كيلتي | الوحدة النمطية للنظام الأساسي الموثوق به
  • راسل دي بينا | الوحدة النمطية للنظام الأساسي الموثوق به
  • أدريان جويان | مهندس عملاء أول
  • جيني هايز | مطور محتوى أول
  • كارول سميث | مطور محتوى أول
  • إيرين شيفر | مطور المحتوى 2
  • آدم شريف | مهندس عميل 2

اعتراف

تم تطوير هذه الوثائق بالاشتراك مع EnterpriseDB، المشرفين على مشغل CloudNativePG. نشكر غابرييل بارتوليني على مراجعة المسودات السابقة لهذه الوثيقة وتقديم التحسينات التقنية.