במדריך הזה מוסבר איך לפרוס הגדרה של Oracle Data Guard עם זמינות גבוהה וריבוי אזורים באשכול רגיל עם מרווח אוויר ב-Google Distributed Cloud (GDC). ההגדרה הזו משתמשת ב-Oracle Database Enterprise Edition ומסתמכת על היכולות הקיימות של GDC לאחסון ולרשת.
הפריסה הזו משתמשת בOracle Database Operator for Kubernetes הרשמי, שמבצע אוטומציה של ניהול מחזור החיים של מסד הנתונים.
ארכיטקטורה
הארכיטקטורה מתארת פריסה של מסד נתונים של Oracle בזמינות גבוהה שמנוהלת על ידי Oracle Database Operator באשכול רגיל של GDC. פריסה עם זמינות גבוהה מורכבת ממסד נתונים ראשי וממסד נתונים במצב המתנה, שהוגדרו עם 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. תשכפלו את האופרטור, את מסד הנתונים של הארגון ואת הלקוח המיידי לצורך בדיקה.
משכפלים את תמונת האופרטור של מסד הנתונים של 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}משכפלים את תמונת 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}משכפלים את תמונת הלקוח המיידי של 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
הגדרת גישה לאשכול
לפני שמקצים משאבים, מאחזרים את פרטי הכניסה של האשכול הרגיל ויוצרים כינוי נוח:
מאחזרים את קובץ ה-kubeconfig עבור האשכול הרגיל:
KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml gdcloud clusters \ get-credentials ${CLUSTER_NAME} \ --standard \ --project ${PROJECT_ID} \ --zone ${ZONE}יוצרים את הכינוי
kkכדי לפשט את הפקודות הבאות:alias kk="kubectl --kubeconfig kubeconfig-${CLUSTER_NAME}.yaml"
יצירת סודות
יוצרים Kubernetes Secret כדי לאפשר לאשכול לשלוף תמונות מ-Harbor באמצעות פרטי הכניסה ששמורים ב-./docker-harbor/config.json המקומי. הסוד הזה נדרש במרחב השמות של האופרטור (כדי לשלוף את תמונת האופרטור) ובמרחב השמות של מסד הנתונים (כדי לשלוף את תמונת מסד הנתונים).
יוצרים את מרחב השמות של האופרטור:
kk create ns ${ORACLE_OPERATOR_NAMESPACE}יוצרים את סוד המשיכה לאופרטור:
kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker-harbor/config.json \ -n ${ORACLE_OPERATOR_NAMESPACE}יוצרים את מרחב השמות למסדי הנתונים:
kk create ns ${DB_NAMESPACE}יוצרים את סוד המשיכה של האימג' עבור קונטיינרים של מסד נתונים:
kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker-harbor/config.json \ -n ${DB_NAMESPACE}יוצרים את הסוד לסיסמת האדמין של מסדי הנתונים:
kk create secret generic ${ADMIN_PASSWORD_SECRET_NAME} \ --from-literal=password=${ADMIN_PASSWORD} \ -n ${DB_NAMESPACE}
התקנה של Oracle Database Operator
עכשיו מתקינים את Oracle Database Operator באשכול על ידי החלת שלושה מניפסטים:
Cluster Role Binding: מגדיר את ההרשאות הנדרשות כדי שהאופרטור יפעל בכל האשכול.
kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yamlNode RBAC: מעניק הרשאות לקריאת טופולוגיית הצומת, שחשובה לתזמון נכון של הפודים.
kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yamlפריסת אופרטור: פריסת פודים של אופרטור והגדרות של משאבים מותאמים אישית. הפקודה הזו מורידה את המניפסט הרשמי, מחליפה את נתיב התמונה בכתובת ה-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
פריסת מסדי נתונים ראשיים ומסדי נתונים במצב המתנה
עכשיו פורסים שני מופעים של מסד נתונים באותו מרחב שמות ברצף.
פריסת המכונה הראשית
מריצים את הפקודה הבאה כדי ליצור את מופע מסד הנתונים הראשי:
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-rwoStorageClass, שיוצר דיסק מתמיד אזורי ב-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! #########################-
מוודאים שהסטטוס הוא
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) עוברים בירושה מהפרמטרים של
הפריימרי, ואסור לציין אותם במניפסט של הסטנדביי:
פורסים את המכונה במצב המתנה:
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! #########################מוודאים שהסטטוס הוא
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
פורסים את
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כדי ליצור שירות KubernetesLoadBalancerשל הברוקר, שיספק כתובת IP חיצונית יציבה שתמיד תנתב למסד הנתונים הראשי הנוכחי.
-
עוקבים אחרי סטטוס הברוקר עד שהוא מדווח על
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הסקריפט
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בודקים את נקודות הקצה של שירות הברוקר. היא צריכה להצביע בהתחלה על כתובת ה-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בודקים את ה-pods של מסד הנתונים כדי למצוא את הקשר בין כתובת ה-IP:
kk get pod -n ${DB_NAMESPACE} -o wide
בדיקה של סנכרון הנתונים והתפקידים
עכשיו מאמתים את השכפול על ידי כתיבת נתונים למאסטר וקריאתם מההמתנה באמצעות פוד של לקוח בתוך האשכול.
כתיבה למסד נתונים ראשי באמצעות שירות ברוקר
פורסים 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יוצרים טבלת בדיקה:
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
קריאה ממצב המתנה (גישה ישירה)
פריסת 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בודקים את שכפול הנתונים:
SELECT * FROM employees; exit;הפלט אמור להיראות כך:
ID NAME ---------- -------------------------------------------------- 1 John Doe
ביצוע מעבר ידני
מפעילים מעבר ידני לגיבוי כדי להפוך את התפקידים, כך שמסד הנתונים הירוק יהפוך לראשי החדש. המפעיל דורש את ה-SID (לדוגמה, ORCLGREEN) עבור יעד המעבר.
מריצים את הפקודה הבאה:
kk patch dataguardbroker broker-blue-green -n ${DB_NAMESPACE} --type='merge' \ -p "{\"spec\":{\"setAsPrimaryDatabase\":\"ORCLGREEN\"}}"עוקבים אחרי התקדמות המעבר:
kk get sidb -n ${DB_NAMESPACE} -wאחרי ההעברה, הפלט אמור להיראות כך:
NAME EDITION STATUS ROLE database-blue Enterprise Healthy PHYSICAL_STANDBY database-green Healthy PRIMARYמוודאים שמופעי מסד הנתונים החליפו תפקידים ושמסד הנתונים הירוק הוא עכשיו הראשי:
kk get dataguardbroker -n ${DB_NAMESPACE}הפלט אמור להיראות כך:
NAME PRIMARY STANDBYS PROTECTION MODE broker-blue-green ORCLGREEN ORCLBLUE MaxAvailabilityמוודאים שנקודות הקצה של שירות
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