פריסה של מסדי נתונים של Oracle בניהול עצמי עם זמינות גבוהה

במדריך הזה מוסבר איך לפרוס הגדרה של Oracle Data Guard עם זמינות גבוהה וריבוי אזורים באשכול רגיל עם מרווח אוויר ב-Google Distributed Cloud ‏ (GDC). ההגדרה הזו משתמשת ב-Oracle Database Enterprise Edition ומסתמכת על היכולות הקיימות של GDC לאחסון ולרשת.

הפריסה הזו משתמשת בOracle Database Operator for Kubernetes הרשמי, שמבצע אוטומציה של ניהול מחזור החיים של מסד הנתונים.

ארכיטקטורה

הארכיטקטורה מתארת פריסה של מסד נתונים של Oracle בזמינות גבוהה שמנוהלת על ידי Oracle Database Operator באשכול רגיל של GDC. פריסה עם זמינות גבוהה מורכבת ממסד נתונים ראשי וממסד נתונים במצב המתנה, שהוגדרו עם Data Guard ליצירת רפליקות ויתירות כשל.

דיאגרמת ארכיטקטורה של פריסת מסד נתונים של Oracle עם זמינות גבוהה באמצעות Data Guard.

הרכיבים העיקריים הם:

  • פרויקט GDC: מאגר הפרויקט של המשאבים שלכם.
  • אשכול Kubernetes רגיל: אשכול רגיל שמספק את משאבי המחשוב.
  • Oracle Database Operator: אופרטור של Kubernetes שמבצע אוטומציה של הקצאת משאבים, ניהול מחזור חיים ויכולת צפייה במסדי נתונים של Oracle. הוא מפשט משימות מורכבות כמו תיקון, גיבוי ושחזור, ומקל על הפעלת עומסי עבודה (workloads) של Oracle עם שמירת מצב בסביבה מבוססת-קונטיינרים.
  • מסד נתונים ראשי: מופע פעיל של מסד נתונים מבוסס-קונטיינר עם הרשאות קריאה וכתיבה.
  • מסד נתונים במצב המתנה: העותק המשוכפל של מופע מסד הנתונים במצב קריאה בלבד (או במצב קריאה וכתיבה במהלך מעבר לגיבוי).
  • Data Guard Broker: מתאם את ההגדרה ואת המעברים בין התפקידים (החלפה/מעבר לגיבוי) בין מסדי הנתונים.
  • Harbor: מאגר פרטי של קונטיינרים שמשמש לאירוח מסד הנתונים, האופרטור ותמונות הלקוח בסביבה מבודדת.
  • Cert-manager: האופרטור מסתמך על cert-manager לניהול אישורי webhook. ‫cert-manager מותקן מראש באשכולות רגילים של GDC.

במדריך הזה, אתם פורסים את האופרטור במרחב שמות משלו (oracle-database-operator-system) ואת מופע מסד הנתונים במרחב שמות נפרד (oracle-dbs). מרחבי השמות האלה מודגמים בתיבות עם קו מקווקו בדיאגרמת הארכיטקטורה.

מומלץ להפריד בין הנתונים לשם הבהרה וניהול נוח יותר. עם זאת, אתם מחליטים איך לארגן את מסדי הנתונים. לדוגמה, אפשר לקבץ מסדי נתונים מסוימים במרחבי שמות שונים כדי לנהל בקרת גישה מפורטת (RBAC) על סמך צורכי עומס העבודה, בעלות הצוות או מפרטי האבטחה.

לפני שמתחילים

לפני שמתחילים בהטמעה, צריך לוודא שהסביבה עומדת בדרישות הבאות:

  • יוצרים פרויקט שישמש כמאגר לכל המשאבים שנוצרו במהלך המדריך הזה.
  • נותנים למשתמש את התפקידים Cluster Admin ו-Standard Cluster Admin בפרויקט. כך תוכלו ליצור אשכול Kubernetes רגיל ולנהל את המשאבים שלו:

    export PROJECT_ID=PROJECT_ID
    export USER_NAME=USER_NAME
    
    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=cluster-admin
    
    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=standard-cluster-admin
    
  • יוצרים מופע של Harbor ופרויקט של Harbor כדי לארח את תמונות הקונטיינר שנדרשות במדריך הזה.

  • נותנים למשתמש את התפקיד 'אדמין של מופע Harbor' כדי שיוכל להעלות תמונות למופע Harbor:

    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=harbor-instance-admin
    
  • יוצרים חשבון רובוט של Harborבפרויקט Harbor. בהמשך המדריך הזה, פרטי הכניסה של חשבון הרובוט יאוחסנו בסודות של Kubernetes, כדי לאפשר לאשכול לשלוף תמונות מ-Harbor כשיוצרים מופעים של קונטיינרים.

  • יוצרים אשכול Kubernetes רגיל עם שני צמתים לפחות של עובדים, שלכל אחד מהם יש זיכרון בנפח 16GB לפחות. לדוגמה:

    kubectl --kubeconfig MGMT_API_KUBECONFIG create -f - <<EOF
    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: ${CLUSTER_NAME}
      namespace: ${PROJECT_ID}
    spec:
      nodePools:
      - machineTypeName: n3-standard-8-gdc
        nodeCount: 2
        name: ${CLUSTER_NAME}-node-pool
    EOF
    
  • מגדירים את משתני הסביבה. המשתנים האלה ישמשו לאורך המדריך ליצירה של משאבים ולהפניה אליהם:

    הערות:

    • במדריך הזה, שני מופעי מסד הנתונים נקראים באופן שרירותי blue ו-green. בהתחלה, מכונת blue היא הראשית ומכונת green היא מכונת ההמתנה.
    # General info
    export PROJECT_ID="PROJECT_ID"
    export ZONE="ZONE"
    export ORG_NAME="ORG_NAME"
    export CLUSTER_NAME="CLUSTER_NAME"
    
    # Software versions
    export ORACLE_OPERATOR_VERSION="2.1.0"
    export ORACLE_DB_VERSION="21.3.0.0"
    
    # Namespaces
    export ORACLE_OPERATOR_NAMESPACE="ORACLE_OPERATOR_NAMESPACE"
    export DB_NAMESPACE="DATABASE_NAMESPACE"
    
    # Harbor config
    export HARBOR_INSTANCE_PROJECT_ID="HARBOR_PROJECT_ID"
    export HARBOR_INSTANCE_NAME="HARBOR_INSTANCE_NAME"
    export HARBOR_INSTANCE_URL="HARBOR_INSTANCE_URL"
    export HARBOR_PROJECT="HARBOR_PROJECT"
    export HARBOR_PULL_SECRET_NAME="HARBOR_PULL_SECRET_NAME"
    export HARBOR_ROBOT_ACCOUNT="robot\$HARBOR_PROJECT+ROBOT_NAME"
    export HARBOR_ROBOT_SECRET="HARBOR_ROBOT_SECRET"
    
    # Oracle database config
    export ADMIN_PASSWORD="ADMIN_PASSWORD"
    export ADMIN_PASSWORD_SECRET_NAME="ADMIN_PASSWORD_SECRET_NAME"
    
    # Database names
    export DB_NAME_BLUE="database-blue"
    export DB_NAME_GREEN="database-green"
    
  • הערה לגבי רשת: המדריך הזה מבוסס על ההנחה שהוא מופעל מצומת bastion שיש לו גישה לממשקי ה-API של GDC וגם גישה לאינטרנט כדי להוריד את המניפסטים ואת תמונות הקונטיינר של Oracle Operator. אם אתם מריצים את הפקודה ממכונה ללא גישה לאינטרנט, אתם צריכים להשיג את הנכסים האלה בנפרד (למשל, באמצעות docker save לייצוא תמונות ממכונה מחוברת ו-docker load לייבוא שלהן) ולהעלות אותם בצורה מאובטחת לסביבה שלכם לפני שתמשיכו.

  • לפני שממשיכים, צריך ליצור חשבון ולקבל אסימון API בכתובת container-registry.oracle.com, ולאחר מכן לאשר את הסכם הרישיון של התמונות Oracle Database Enterprise Edition ו-Oracle Instant Client.

טעינת תמונות ל-Harbor

מכיוון שלקלאסטרים ב-Google Distributed Cloud במודל Air-gapped אין גישה למאגרי מידע חיצוניים, אתם צריכים לשכפל את התמונות הנדרשות למופע הפרטי של Harbor.

כניסה ל-Oracle Container Registry

קודם צריך לעבור אימות במרשם הרשמי של Oracle כדי למשוך את תמונות הבסיס:

docker --config=./docker-oracle login container-registry.oracle.com

אחרי התחברות מוצלחת, פרטי הכניסה יישמרו ב-./docker-oracle/config.json.

מתחברים ל-Harbor

מאמתים את עצמכם באמצעות מופע Harbor פרטי:

docker --config=./docker-harbor login ${HARBOR_INSTANCE_URL} \
  -u ${HARBOR_ROBOT_ACCOUNT} \
  -p ${HARBOR_ROBOT_SECRET}

אחרי התחברות מוצלחת, פרטי הכניסה של החשבון הרובוטי יישמרו ב-./docker-harbor/config.json.

שליפה, תיוג ודחיפה של תמונות

מורידים את התמונות ממאגר הקונטיינרים הרשמי של Oracle ומעבירים אותן לפרויקט הפנימי שלכם ב-Harbor. תשכפלו את האופרטור, את מסד הנתונים של הארגון ואת הלקוח המיידי לצורך בדיקה.

  1. משכפלים את תמונת האופרטור של מסד הנתונים של Oracle:

    docker --config=./docker-oracle pull \
      container-registry.oracle.com/database/operator:${ORACLE_OPERATOR_VERSION} \
      --platform linux/amd64
    
    docker tag container-registry.oracle.com/database/operator:${ORACLE_OPERATOR_VERSION} \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-operator:${ORACLE_OPERATOR_VERSION}
    
    docker --config=./docker-harbor push \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-operator:${ORACLE_OPERATOR_VERSION}
    
  2. משכפלים את תמונת Oracle database Enterprise:

    docker --config=./docker-oracle pull \
      container-registry.oracle.com/database/enterprise:${ORACLE_DB_VERSION} \
      --platform linux/amd64
    
    docker tag container-registry.oracle.com/database/enterprise:${ORACLE_DB_VERSION} \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}
    
    docker --config=./docker-harbor push \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}
    
  3. משכפלים את תמונת הלקוח המיידי של Oracle:

    docker --config=./docker-oracle pull \
      container-registry.oracle.com/database/instantclient:latest \
      --platform linux/amd64
    
    docker tag container-registry.oracle.com/database/instantclient:latest \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest
    
    docker --config=./docker-harbor push \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest
    

הגדרת גישה לאשכול

לפני שמקצים משאבים, מאחזרים את פרטי הכניסה של האשכול הרגיל ויוצרים כינוי נוח:

  1. מאחזרים את קובץ ה-kubeconfig עבור האשכול הרגיל:

    KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml gdcloud clusters \
      get-credentials ${CLUSTER_NAME} \
      --standard \
      --project ${PROJECT_ID} \
      --zone ${ZONE}
    
  2. יוצרים את הכינוי kk כדי לפשט את הפקודות הבאות:

    alias kk="kubectl --kubeconfig kubeconfig-${CLUSTER_NAME}.yaml"
    

יצירת סודות

יוצרים Kubernetes Secret כדי לאפשר לאשכול לשלוף תמונות מ-Harbor באמצעות פרטי הכניסה ששמורים ב-./docker-harbor/config.json המקומי. הסוד הזה נדרש במרחב השמות של האופרטור (כדי לשלוף את תמונת האופרטור) ובמרחב השמות של מסד הנתונים (כדי לשלוף את תמונת מסד הנתונים).

  1. יוצרים את מרחב השמות של האופרטור:

    kk create ns ${ORACLE_OPERATOR_NAMESPACE}
    
  2. יוצרים את סוד המשיכה לאופרטור:

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${ORACLE_OPERATOR_NAMESPACE}
    
  3. יוצרים את מרחב השמות למסדי הנתונים:

    kk create ns ${DB_NAMESPACE}
    
  4. יוצרים את סוד המשיכה של האימג' עבור קונטיינרים של מסד נתונים:

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${DB_NAMESPACE}
    
  5. יוצרים את הסוד לסיסמת האדמין של מסדי הנתונים:

    kk create secret generic ${ADMIN_PASSWORD_SECRET_NAME} \
      --from-literal=password=${ADMIN_PASSWORD} \
      -n ${DB_NAMESPACE}
    

התקנה של Oracle Database Operator

עכשיו מתקינים את Oracle Database Operator באשכול על ידי החלת שלושה מניפסטים:

  1. ‫Cluster Role Binding: מגדיר את ההרשאות הנדרשות כדי שהאופרטור יפעל בכל האשכול.

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yaml
    
  2. Node RBAC: מעניק הרשאות לקריאת טופולוגיית הצומת, שחשובה לתזמון נכון של הפודים.

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yaml
    
  3. פריסת אופרטור: פריסת פודים של אופרטור והגדרות של משאבים מותאמים אישית. הפקודה הזו מורידה את המניפסט הרשמי, מחליפה את נתיב התמונה בכתובת ה-URL של Harbor, מוסיפה את ההגדרה imagePullSecrets כדי ש-Kubernetes יוכל לאמת את עצמו ב-Harbor, ומחיל את התוצאה:

    curl -L https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/oracle-database-operator.yaml \
      | sed "s|container-registry.oracle.com/database/operator:latest|${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-operator:${ORACLE_OPERATOR_VERSION}|g" \
      | awk "/terminationGracePeriodSeconds: 10/{print; print \"      imagePullSecrets:\n      - name: ${HARBOR_PULL_SECRET_NAME}\"; next}1" \
      | kk apply -f -
    

    ממתינים עד שהפודים של האופרטור יפעלו:

    kk get pods -n ${ORACLE_OPERATOR_NAMESPACE} --watch
    

    הפלט אמור להיראות כך:

    NAME                                                           READY   STATUS    RESTARTS   AGE
    oracle-database-operator-controller-manager-5f7b56874d-k9v4z   1/1     Running   0          45s
    oracle-database-operator-controller-manager-5f7b56874d-n2x8m   1/1     Running   0          45s
    oracle-database-operator-controller-manager-5f7b56874d-r6z7q   1/1     Running   0          45s
    

פריסת מסדי נתונים ראשיים ומסדי נתונים במצב המתנה

עכשיו פורסים שני מופעים של מסד נתונים באותו מרחב שמות ברצף.

פריסת המכונה הראשית

  1. מריצים את הפקודה הבאה כדי ליצור את מופע מסד הנתונים הראשי:

    apiVersion: database.oracle.com/v4
    kind: SingleInstanceDatabase
    metadata:
      name: ${DB_NAME_BLUE}
      namespace: ${DB_NAMESPACE}
    spec:
      replicas: 1
      edition: enterprise
      image:
        pullFrom: "${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}"
        pullSecrets: ${HARBOR_PULL_SECRET_NAME}
        prebuiltDB: true
      sid: ORCLBLUE
      pdbName: ORCLPDB1
      archiveLog: true
      flashBack: true
      forceLog: true
      adminPassword:
        secretName: "${ADMIN_PASSWORD_SECRET_NAME}"
        secretKey: "password"
      persistence:
        size: "50Gi"
        storageClass: "standard-rwo"
        accessMode: "ReadWriteOnce"
      resources:
        requests:
          memory: "4Gi"
    

    פרמטרים מרכזיים להגדרה:

    • sid / pdbName: מגדיר את מזהה המערכת (SID) ואת השם של מסד הנתונים הניתן לחיבור (PDB).
    • edition: מציין את מהדורת מסד הנתונים (enterprise במקרה הזה).
    • image: מצביע על תמונת הרישום הפרטית שלכם ב-Harbor.
    • persistence: בקשה לנפח אחסון מתמיד (persistent volume) בנפח 50Gi באמצעות standard-rwo StorageClass, שיוצר דיסק מתמיד אזורי ב-GDC.
    • replicas: מגדיר את מספר הפודים ל-1 עבור המופע.
    • archiveLog: מפעיל את מצב Archive Log, שנדרש ל-Data Guard.
    • flashBack: הפעלה של Flashback Database, שמאפשרת להחזיר את מסד הנתונים לנקודת זמן קודמת.
    • forceLog: הפעלת אילוץ של רישום ביומן, כדי להבטיח שכל השינויים יירשמו ביומן, גם פעולות שבדרך כלל לא נרשמות ביומן.

    רשימה מלאה של אפשרויות ההגדרה, כולל פרמטרים מותאמים אישית של init ומגבלות משאבים, זמינה במסמכים הרשמיים.

    יצירת מסד הנתונים דורשת הרבה משאבים, ולכן התהליך עשוי להימשך 10 עד 20 דקות.

    צריך לחכות עד שהמסד נתונים יהיה מוכן לחלוטין לפני שממשיכים. זה קריטי כי כדי להגדיר שכפול, מסד הנתונים במצב המתנה צריך גישה למסד הנתונים הראשי.

    מחכים עד שה-pod של מסד הנתונים יהיה Running:

    kk get po -n ${DB_NAMESPACE} -l app=${DB_NAME_BLUE} -w
    

    הפלט אמור להיראות כך:

    NAME                   READY   STATUS    RESTARTS   AGE
    database-blue-i5xdj   0/1     Pending   0          0s
    database-blue-i5xdj   0/1     Pending   0          0s
    database-blue-i5xdj   0/1     Pending   0          1s
    database-blue-i5xdj   0/1     Init:0/1   0          1s
    database-blue-i5xdj   0/1     PodInitializing   0          98s
    database-blue-i5xdj   0/1     Running           0          99s
    database-blue-i5xdj   1/1     Running           0          99s
    

    אחר כך בודקים את היומנים ומחכים להודעה DATABASE IS READY TO USE!:

    kk logs -n ${DB_NAMESPACE} -l app=${DB_NAME_BLUE} -f
    

    הפלט צריך לכלול את הפרטים הבאים:

    #########################
    DATABASE IS READY TO USE!
    #########################
    
  2. מוודאים שהסטטוס הוא Healthy והתפקיד הוא PRIMARY:

    kk get sidb -n ${DB_NAMESPACE} ${DB_NAME_BLUE}
    

    הפלט אמור להיראות כך:

    NAME            EDITION      STATUS    ROLE
    database-blue   Enterprise   Healthy   PRIMARY
    

פריסת המכונה במצב המתנה

אחרי שהשרת הראשי תקין, פורסים את שרת הגיבוי. שימו לב שהפרמטרים של Data Guard ‏ (archiveLog,‏ flashBack,‏ forceLog) עוברים בירושה מהפרמטרים של הפריימרי, ואסור לציין אותם במניפסט של הסטנדביי:

  1. פורסים את המכונה במצב המתנה:

    apiVersion: database.oracle.com/v4
    kind: SingleInstanceDatabase
    metadata:
      name: ${DB_NAME_GREEN}
      namespace: ${DB_NAMESPACE}
    spec:
      replicas: 1
      edition: enterprise
      image:
        pullFrom: "${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}"
        pullSecrets: ${HARBOR_PULL_SECRET_NAME}
        prebuiltDB: true
      sid: ORCLGREEN
      pdbName: ORCLPDB1
      adminPassword:
        secretName: "${ADMIN_PASSWORD_SECRET_NAME}"
        secretKey: "password"
      createAs: standby
      primaryDatabaseRef: ${DB_NAME_BLUE}
      persistence:
        size: "50Gi"
        storageClass: "standard-rwo"
        accessMode: "ReadWriteOnce"
      resources:
        requests:
          memory: "4Gi"
    

    מחכים עד שה-pod של מסד הנתונים יהיה Running:

    kk get po -n ${DB_NAMESPACE} -l app=${DB_NAME_GREEN} -w
    

    הפלט אמור להיראות כך:

    NAME                   READY   STATUS    RESTARTS   AGE
    database-green-q1gur   0/1     Pending   0          0s
    database-green-q1gur   0/1     Pending   0          0s
    database-green-q1gur   0/1     Pending   0          1s
    database-green-q1gur   0/1     Init:0/1   0          1s
    database-green-q1gur   0/1     PodInitializing   0          98s
    database-green-q1gur   0/1     Running           0          99s
    database-green-q1gur   1/1     Running           0          99s
    

    אחר כך בודקים את היומנים ומחכים להודעה DATABASE IS READY TO USE!:

    kk logs -n ${DB_NAMESPACE} -l app=${DB_NAME_GREEN} -f
    

    הפלט צריך לכלול את הפרטים הבאים:

    #########################
    DATABASE IS READY TO USE!
    #########################
    
  2. מוודאים שהסטטוס הוא Healthy והתפקיד הוא PHYSICAL_STANDBY:

    kk get sidb -n ${DB_NAMESPACE}
    

    הפלט אמור להיראות כך:

    NAME             EDITION      STATUS    ROLE
    database-blue    Enterprise   Healthy   PRIMARY
    database-green                Healthy   PHYSICAL_STANDBY
    

הגדרת Data Guard Broker

  1. פורסים את DataguardBroker כדי לנהל את ההגדרות של Data Guard:

    apiVersion: database.oracle.com/v4
    kind: DataguardBroker
    metadata:
      name: broker-blue-green
      namespace: ${DB_NAMESPACE}
    spec:
      primaryDatabaseRef: ${DB_NAME_BLUE}
      standbyDatabaseRefs:
        - ${DB_NAME_GREEN}
      protectionMode: MaxAvailability
      fastStartFailover: false
      loadBalancer: true
    

    פרמטרים מרכזיים להגדרה:

    • protectionMode: מוגדר ל-MaxAvailability כדי למנוע אובדן נתונים אם לפחות אחד מהשרתים במצב המתנה זמין, ועובר למצב אסינכרוני אם אפשר להגיע לפחות לאחד מהשרתים במצב המתנה.
    • fastStartFailover: מגדירים את הערך false כדי להשבית את המעבר האוטומטי לגיבוי. כאשר הוא מופעל, תהליך Observer יכול להפעיל באופן אוטומטי יתירות כשל אם מסד הנתונים הראשי הופך ללא זמין.
    • loadBalancer: צריך להגדיר את הערך true כדי ליצור שירות Kubernetes LoadBalancer של הברוקר, שיספק כתובת IP חיצונית יציבה שתמיד תנתב למסד הנתונים הראשי הנוכחי.
  2. עוקבים אחרי סטטוס הברוקר עד שהוא מדווח על Healthy:

    kk get dataguardbroker -n ${DB_NAMESPACE} -w
    

    הפלט אמור להיראות כך:

    NAME                PRIMARY   STANDBYS   PROTECTION MODE   CONNECT STR   STATUS     FSFO
    broker-blue-green                        MaxAvailability                 Creating
    broker-blue-green                        MaxAvailability                 Creating
    broker-blue-green   ORCLBLUE   ORCLGREEN   MaxAvailability   10.0.0.25:32345/DATAGUARD   Creating   false
    broker-blue-green   ORCLBLUE   ORCLGREEN   MaxAvailability   10.0.0.25:32345/DATAGUARD   Healthy    false
    
  3. הסקריפט DataguardBroker יוצר שירות Kubernetes ‏ (broker-blue-green) שמנתב אוטומטית את התנועה למסד הנתונים הראשי הנוכחי. כך מספקים נקודת חיבור יציבה לאפליקציות. קבלת השירות הזה:

    kk get svc -n ${DB_NAMESPACE} broker-blue-green
    

    הפלט אמור להיראות כך: שימו לב להקצאת CLUSTER-IP ללקוחות בתוך האשכול ו-EXTERNAL-IP ללקוחות חיצוניים באמצעות מאזן עומסים:

    NAME                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                         AGE
    broker-blue-green   LoadBalancer   10.0.19.198   100.66.38.138   1521:31116/TCP,5500:31842/TCP   8m
    
  4. בודקים את נקודות הקצה של שירות הברוקר. היא צריכה להצביע בהתחלה על כתובת ה-IP של הפוד הכחול:

    kk get endpoints -n ${DB_NAMESPACE} broker-blue-green
    

    הפלט צריך להיראות כך, כשכתובת ה-IP של הפוד הכחול מופיעה במקום BLUE_POD_IP:

    NAME                ENDPOINTS
    broker-blue-green   [BLUE_POD_IP]:5500,[BLUE_POD_IP]:1521
    
  5. בודקים את ה-pods של מסד הנתונים כדי למצוא את הקשר בין כתובת ה-IP:

    kk get pod -n ${DB_NAMESPACE} -o wide
    

בדיקה של סנכרון הנתונים והתפקידים

עכשיו מאמתים את השכפול על ידי כתיבת נתונים למאסטר וקריאתם מההמתנה באמצעות פוד של לקוח בתוך האשכול.

כתיבה למסד נתונים ראשי באמצעות שירות ברוקר

  1. פורסים pod זמני כדי להתחבר למסד הנתונים הראשי באמצעות שירות ברוקר יציב:

    kk run sqlplus -n ${DB_NAMESPACE} --rm -it --restart=Never \
      --image=${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest \
      --image-pull-policy=Always \
      --overrides='{"spec": {"imagePullSecrets": [{"name": "'${HARBOR_PULL_SECRET_NAME}'"}]}}' \
      -- sqlplus sys/${ADMIN_PASSWORD}@broker-blue-green:1521/ORCLPDB1 as sysdba
    
  2. יוצרים טבלת בדיקה:

    CREATE TABLE employees (id NUMBER, name VARCHAR2(50));
    INSERT INTO employees VALUES (1, 'John Doe');
    COMMIT;
    SELECT * FROM employees;
    exit;
    

    הפלט אמור להיראות כך:

            ID NAME
    ---------- --------------------------------------------------
            1 John Doe
    

קריאה ממצב המתנה (גישה ישירה)

  1. פריסת pod זמני כדי להתחבר ישירות לשירות ההמתנה:

    kk run sqlplus -n ${DB_NAMESPACE} --rm -it --restart=Never \
      --image=${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest \
      --image-pull-policy=Always \
      --overrides='{"spec": {"imagePullSecrets": [{"name": "'${HARBOR_PULL_SECRET_NAME}'"}]}}' \
      -- sqlplus sys/${ADMIN_PASSWORD}@${DB_NAME_GREEN}:1521/ORCLPDB1 as sysdba
    
  2. בודקים את שכפול הנתונים:

    SELECT * FROM employees;
    exit;
    

    הפלט אמור להיראות כך:

            ID NAME
    ---------- --------------------------------------------------
            1 John Doe
    

ביצוע מעבר ידני

מפעילים מעבר ידני לגיבוי כדי להפוך את התפקידים, כך שמסד הנתונים הירוק יהפוך לראשי החדש. המפעיל דורש את ה-SID (לדוגמה, ORCLGREEN) עבור יעד המעבר.

  1. מריצים את הפקודה הבאה:

    kk patch dataguardbroker broker-blue-green -n ${DB_NAMESPACE} --type='merge' \
      -p "{\"spec\":{\"setAsPrimaryDatabase\":\"ORCLGREEN\"}}"
    
  2. עוקבים אחרי התקדמות המעבר:

    kk get sidb -n ${DB_NAMESPACE} -w
    

    אחרי ההעברה, הפלט אמור להיראות כך:

    NAME             EDITION      STATUS    ROLE
    database-blue    Enterprise   Healthy   PHYSICAL_STANDBY
    database-green                Healthy   PRIMARY
    
  3. מוודאים שמופעי מסד הנתונים החליפו תפקידים ושמסד הנתונים הירוק הוא עכשיו הראשי:

    kk get dataguardbroker -n ${DB_NAMESPACE}
    

    הפלט אמור להיראות כך:

    NAME                PRIMARY     STANDBYS   PROTECTION MODE
    broker-blue-green   ORCLGREEN   ORCLBLUE   MaxAvailability
    
  4. מוודאים שנקודות הקצה של שירות broker-blue-green עודכנו כך שיפנו לכתובת ה-IP של הפוד הירוק:

    kk get endpoints -n ${DB_NAMESPACE} broker-blue-green
    

    הפלט אמור להיראות כך, כאשר כתובת ה-IP של הפוד הירוק מופיעה במקום GREEN_POD_IP:

    NAME                ENDPOINTS
    broker-blue-green   [GREEN_POD_IP]:5500,[GREEN_POD_IP]:1521
    

המאמרים הבאים