Men-deploy database Oracle yang dikelola sendiri dan sangat tersedia

Panduan ini menguraikan deployment konfigurasi Oracle Data Guard multi-zona dengan ketersediaan tinggi di cluster standar air gap Google Distributed Cloud (GDC). Penyiapan ini menggunakan Oracle Database Enterprise Edition dan memanfaatkan kemampuan GDC yang ada untuk penyimpanan dan jaringan.

Deployment ini menggunakan Oracle Database Operator for Kubernetes resmi, yang mengotomatiskan pengelolaan siklus proses database.

Arsitektur

Arsitektur ini menjelaskan deployment Oracle Database dengan ketersediaan tinggi yang dikelola oleh Oracle Database Operator dalam cluster standar GDC. Deployment dengan ketersediaan tinggi terdiri dari database utama dan database standby yang dikonfigurasi dengan Data Guard untuk replikasi dan failover.

Diagram arsitektur Data Guard untuk deployment database Oracle yang sangat tersedia.

Komponen utamanya adalah sebagai berikut:

  • Project GDC: container project untuk resource Anda.
  • Cluster Kubernetes standar: cluster standar yang menyediakan resource komputasi.
  • Oracle Database Operator: operator Kubernetes yang mengotomatiskan penyediaan, pengelolaan siklus proses, dan kemampuan observasi database Oracle. Layanan ini menyederhanakan tugas-tugas kompleks seperti patching, pencadangan, dan pemulihan, sehingga memudahkan Anda menjalankan workload Oracle stateful di lingkungan dalam container.
  • Database utama: instance database dalam container baca-tulis aktif.
  • Database standby: instance database replika hanya baca (atau baca-tulis selama failover).
  • Broker Data Guard: mengorkestrasi konfigurasi dan transisi peran (pengalihan/pengalihan ke server cadangan) antara database.
  • Harbor: registry container pribadi yang digunakan untuk menghosting database, operator, dan image klien dalam lingkungan yang terisolasi.
  • Cert-manager: operator mengandalkan cert-manager untuk mengelola sertifikat webhook. cert-manager sudah diinstal sebelumnya di cluster standar GDC.

Dalam panduan ini, Anda men-deploy operator di namespace-nya sendiri (oracle-database-operator-system) dan instance database di namespace terpisah (oracle-dbs). Namespace ini diilustrasikan dengan kotak berbingkai putus-putus dalam diagram arsitektur.

Pemisahan ini direkomendasikan untuk kejelasan dan kemudahan pengelolaan. Namun, Anda yang memutuskan cara mengatur database Anda. Misalnya, Anda dapat mengelompokkan database tertentu di namespace yang berbeda untuk mengelola kontrol akses terperinci (RBAC) berdasarkan kebutuhan workload, kepemilikan tim, atau spesifikasi keamanan.

Sebelum memulai

Sebelum memulai deployment, Anda harus memastikan bahwa lingkungan Anda memenuhi persyaratan berikut:

  • Buat project yang akan berfungsi sebagai penampung untuk semua resource yang dihasilkan di seluruh panduan ini.
  • Berikan peran Cluster Admin dan Standard Cluster Admin kepada pengguna Anda untuk project Anda. Dengan begitu, Anda dapat membuat cluster Kubernetes standar dan mengelola sumber dayanya:

    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
    
  • Buat instance Harbor dan project Harbor untuk menghosting image container yang diperlukan untuk panduan ini.

  • Beri pengguna Anda peran Admin Instance Harbor agar Anda dapat mengupload image ke instance Harbor Anda:

    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=harbor-instance-admin
    
  • Buat akun robot Harbor di project Harbor Anda. Selanjutnya dalam panduan ini, kredensial akun robot akan disimpan dalam secret Kubernetes, sehingga cluster dapat menarik image dari Harbor saat membuat instance container.

  • Buat cluster Kubernetes standar dengan minimal dua node pekerja, yang masing-masing memiliki memori minimal 16 GB. Contoh:

    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
    
  • Siapkan variabel lingkungan Anda. Ini akan digunakan di seluruh panduan untuk membuat dan mereferensikan resource:

    Catatan:

    • Dua instance database tersebut diberi nama blue dan green secara acak di seluruh panduan ini. Awalnya, instance blue adalah instance utama, dan green adalah instance standby.
    # 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"
    
  • Catatan jaringan: Panduan ini mengasumsikan bahwa panduan dijalankan dari node bastion yang memiliki akses ke GDC API dan juga memiliki akses ke internet untuk mendownload manifes dan image container Oracle Operator. Jika Anda menjalankan ini dari komputer tanpa akses internet, Anda harus mendapatkan aset ini secara terpisah (misalnya, menggunakan docker save untuk mengekspor gambar dari komputer yang terhubung dan docker load untuk mengimpornya) dan menguploadnya dengan aman ke lingkungan Anda sebelum melanjutkan.

  • Sebelum melanjutkan, Anda harus membuat akun dan mendapatkan token API di container-registry.oracle.com, lalu menyetujui perjanjian lisensi untuk image Oracle Database Enterprise Edition dan Oracle Instant Client.

Memuat gambar ke Harbor

Karena cluster dalam Google Distributed Cloud dengan air gap tidak dapat mengakses registry eksternal, Anda harus mencerminkan image yang diperlukan ke instance Harbor pribadi Anda.

Login ke Oracle Container Registry

Anda harus melakukan autentikasi terlebih dahulu dengan registry Oracle resmi untuk menarik image dasar:

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

Setelah berhasil login, kredensial akan disimpan di ./docker-oracle/config.json.

Login ke Harbor

Lakukan autentikasi dengan instance Harbor pribadi Anda:

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

Setelah berhasil login, kredensial akun robot akan disimpan di ./docker-harbor/config.json.

Menarik, memberi tag, dan mengirim gambar

Download image dari registry container Oracle resmi dan kirim ke project Harbor internal Anda. Anda akan mencerminkan operator, database perusahaan, dan klien instan untuk pengujian.

  1. Cerminkan image operator database 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. Mencerminkan image Enterprise database Oracle:

    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. Mirror image klien instan 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
    

Mengonfigurasi akses cluster

Sebelum men-deploy resource, ambil kredensial untuk cluster standar Anda dan buat alias yang mudah:

  1. Ambil file kubeconfig untuk cluster standar Anda:

    KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml gdcloud clusters \
      get-credentials ${CLUSTER_NAME} \
      --standard \
      --project ${PROJECT_ID} \
      --zone ${ZONE}
    
  2. Buat alias kk untuk menyederhanakan perintah berikutnya:

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

Membuat secret

Buat Secret Kubernetes untuk mengizinkan cluster menarik image dari Harbor menggunakan kredensial yang disimpan di ./docker-harbor/config.json lokal Anda. Anda memerlukan secret ini di namespace operator (untuk menarik image operator) dan namespace database (untuk menarik image database).

  1. Buat namespace untuk operator:

    kk create ns ${ORACLE_OPERATOR_NAMESPACE}
    
  2. Buat secret pull untuk operator:

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${ORACLE_OPERATOR_NAMESPACE}
    
  3. Buat namespace untuk database:

    kk create ns ${DB_NAMESPACE}
    
  4. Buat secret penarikan image untuk container database:

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${DB_NAMESPACE}
    
  5. Buat secret untuk sandi administratif database:

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

Menginstal Operator Database Oracle

Sekarang, instal Oracle Database Operator ke cluster Anda dengan menerapkan tiga manifes:

  1. Cluster Role Binding: Menyiapkan izin yang diperlukan agar operator dapat berfungsi di seluruh cluster.

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yaml
    
  2. RBAC Node: Memberikan izin untuk membaca topologi node, yang sangat penting untuk penjadwalan pod yang benar.

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yaml
    
  3. Deployment Operator: Men-deploy pod operator dan definisi resource kustom. Perintah ini mendownload manifes resmi, mengganti jalur image dengan URL Harbor Anda, menyuntikkan konfigurasi imagePullSecrets sehingga Kubernetes dapat melakukan autentikasi dengan Harbor, dan menerapkan hasilnya:

    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 -
    

    Tunggu hingga pod operator berjalan:

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

    Outputnya akan terlihat seperti berikut ini:

    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
    

Men-deploy database utama dan standby

Sekarang Anda men-deploy dua instance database di namespace yang sama secara berurutan.

Men-deploy instance utama

  1. Jalankan perintah berikut untuk membuat instance database utama:

    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"
    

    Parameter konfigurasi utama:

    • sid / pdbName: menentukan ID sistem (SID) dan nama database yang dapat di-plug (PDB).
    • edition: menentukan edisi database (enterprise dalam kasus ini).
    • image: mengarah ke image registry Harbor pribadi Anda.
    • persistence: meminta volume persisten 50 Gi menggunakan StorageClass standard-rwo, yang membuat persistent disk zona di GDC.
    • replicas: menetapkan jumlah pod menjadi 1 untuk instance.
    • archiveLog: mengaktifkan mode Log Arsip, yang diperlukan untuk Data Guard.
    • flashBack: mengaktifkan Flashback Database, sehingga Anda dapat mengembalikan database ke titik waktu sebelumnya.
    • forceLog: mengaktifkan Logging Paksa, sehingga memastikan semua perubahan dicatat, bahkan untuk operasi yang biasanya melewati logging.

    Untuk mengetahui daftar lengkap opsi konfigurasi, termasuk parameter init kustom dan batas resource, lihat dokumentasi resmi.

    Pembuatan database memerlukan banyak resource dan mungkin memerlukan waktu 10 hingga 20 menit.

    Tunggu hingga database siap sepenuhnya sebelum melanjutkan. Hal ini sangat penting karena database standby memerlukan akses ke database utama untuk membuat replikasi.

    Tunggu hingga pod database berstatus Running:

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

    Output akan terlihat seperti berikut:

    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
    

    Kemudian, amati log dan tunggu pesan DATABASE IS READY TO USE!:

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

    Output harus berisi hal berikut:

    #########################
    DATABASE IS READY TO USE!
    #########################
    
  2. Verifikasi bahwa statusnya adalah Healthy dan perannya adalah PRIMARY:

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

    Output akan terlihat seperti berikut:

    NAME            EDITION      STATUS    ROLE
    database-blue   Enterprise   Healthy   PRIMARY
    

Men-deploy instance standby

Setelah instance utama dalam kondisi baik, deploy instance standby. Perhatikan bahwa parameter Data Guard (archiveLog, flashBack, forceLog) diwarisi dari primer dan tidak boleh ditentukan dalam manifes standby:

  1. Deploy instance standby:

    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"
    

    Tunggu hingga pod database berstatus Running:

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

    Output akan terlihat seperti berikut:

    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
    

    Kemudian, amati log dan tunggu pesan DATABASE IS READY TO USE!:

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

    Output harus berisi hal berikut:

    #########################
    DATABASE IS READY TO USE!
    #########################
    
  2. Verifikasi bahwa statusnya adalah Healthy dan perannya adalah PHYSICAL_STANDBY:

    kk get sidb -n ${DB_NAMESPACE}
    

    Output akan terlihat seperti berikut:

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

Mengonfigurasi Broker Data Guard

  1. Deploy DataguardBroker untuk mengelola konfigurasi 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
    

    Parameter konfigurasi utama:

    • protectionMode: ditetapkan ke MaxAvailability untuk memastikan tidak ada kehilangan data jika setidaknya satu standby tersedia, beralih ke mode asinkron jika setidaknya satu standby dapat dijangkau.
    • fastStartFailover: tetapkan ke false untuk menonaktifkan failover otomatis. Jika diaktifkan, proses Observer dapat otomatis memicu failover jika database utama tidak tersedia.
    • loadBalancer: ditetapkan ke true untuk membuat layanan LoadBalancer Kubernetes untuk broker, yang menyediakan alamat IP eksternal stabil yang selalu merutekan ke database utama saat ini.
  2. Pantau status broker hingga melaporkan Healthy:

    kk get dataguardbroker -n ${DB_NAMESPACE} -w
    

    Output akan terlihat seperti berikut:

    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 membuat layanan Kubernetes (broker-blue-green) yang secara otomatis merutekan traffic ke database utama saat ini. Hal ini memberikan titik koneksi yang stabil untuk aplikasi. Mendapatkan layanan ini:

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

    Output akan terlihat seperti berikut. Perhatikan penyediaan CLUSTER-IP untuk klien dalam cluster, dan EXTERNAL-IP untuk klien eksternal menggunakan load balancer:

    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. Periksa endpoint layanan pialang. Awalnya harus mengarah ke alamat IP pod biru:

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

    Output-nya akan terlihat seperti berikut, dengan IP pod biru akan muncul, bukan BLUE_POD_IP:

    NAME                ENDPOINTS
    broker-blue-green   [BLUE_POD_IP]:5500,[BLUE_POD_IP]:1521
    
  5. Periksa pod database untuk mengorelasikan IP:

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

Menguji sinkronisasi dan peran data

Sekarang Anda memverifikasi replikasi dengan menulis data ke database utama dan membacanya dari database standby menggunakan pod klien dalam cluster.

Menulis ke database utama dengan layanan broker

  1. Deploy pod sementara untuk terhubung ke database utama menggunakan layanan broker yang stabil:

    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. Buat tabel pengujian:

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

    Output akan terlihat seperti berikut:

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

Membaca dari standby (akses langsung)

  1. Deploy pod sementara untuk terhubung langsung ke layanan standby:

    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. Verifikasi replikasi data:

    SELECT * FROM employees;
    exit;
    

    Output akan terlihat seperti berikut:

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

Melakukan pengalihan manual

Picu switchover manual untuk membalikkan peran, sehingga database hijau menjadi database utama baru. Operator memerlukan SID (misalnya, ORCLGREEN) untuk target pengalihan.

  1. Jalankan perintah berikut:

    kk patch dataguardbroker broker-blue-green -n ${DB_NAMESPACE} --type='merge' \
      -p "{\"spec\":{\"setAsPrimaryDatabase\":\"ORCLGREEN\"}}"
    
  2. Pantau progres pengalihan:

    kk get sidb -n ${DB_NAMESPACE} -w
    

    Output akan terlihat seperti berikut setelah pengalihan selesai:

    NAME             EDITION      STATUS    ROLE
    database-blue    Enterprise   Healthy   PHYSICAL_STANDBY
    database-green                Healthy   PRIMARY
    
  3. Pastikan bahwa instance database telah beralih peran dan database hijau kini menjadi yang utama:

    kk get dataguardbroker -n ${DB_NAMESPACE}
    

    Outputnya akan terlihat seperti berikut ini:

    NAME                PRIMARY     STANDBYS   PROTECTION MODE
    broker-blue-green   ORCLGREEN   ORCLBLUE   MaxAvailability
    
  4. Pastikan endpoint layanan broker-blue-green telah diperbarui untuk mengarah ke IP pod hijau:

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

    Output akan terlihat seperti berikut, dengan IP pod hijau akan muncul, bukan GREEN_POD_IP:

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

Langkah berikutnya