Men-deploy database Oracle yang dikelola sendiri dan sangat tersedia

Panduan ini menguraikan deployment konfigurasi Oracle Data Guard yang sangat tersedia di cluster standar Google Distributed Cloud (GDC) dengan air gap. 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 ketersediaan tinggi terdiri dari database utama dan database standby yang dikonfigurasi dengan Data Guard untuk replikasi dan failover.

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

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. Operator ini menyederhanakan tugas-tugas kompleks seperti patching, pencadangan, dan pemulihan, sehingga memudahkan menjalankan workload Oracle stateful di lingkungan dalam container.
  • Database utama: instance database dalam container baca-tulis yang aktif.
  • Database standby: instance database replika hanya baca (atau baca-tulis selama failover).
  • Data Guard Broker: mengatur konfigurasi dan transisi peran (switchover/failover) di antara database.
  • Harbor: Container Registry pribadi yang digunakan untuk menghosting image database, operator, dan klien dalam lingkungan air-gapped.
  • Cert-manager: operator mengandalkan cert-manager untuk mengelola sertifikat webhook. cert-manager sudah diinstal sebelumnya di cluster standar GDC.

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

Pemisahan ini direkomendasikan untuk kejelasan dan kemudahan pengelolaan. Namun, Anda bebas memutuskan cara mengatur database Anda. Misalnya, Anda dapat mengelompokkan database tertentu dalam 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 sepanjang panduan ini.
  • Beri pengguna Anda peran Cluster Admin dan Standard Cluster Admin untuk project Anda. Dengan demikian, Anda dapat membuat cluster Kubernetes standar dan mengelola resource-nya:

    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 Harbor Instance Admin agar Anda dapat mengupload image ke instance Harbor:

    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 di secret Kubernetes, sehingga cluster dapat mengambil image dari Harbor saat membuat instance container.

  • Buat cluster Kubernetes standar dengan setidaknya dua worker node, 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. Variabel ini akan digunakan di seluruh panduan untuk membuat dan mereferensikan resource:

    Catatan:

    • Dua instance database diberi nama arbitrer blue dan green 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 ini 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 mesin tanpa akses internet, Anda harus mendapatkan aset ini secara terpisah (misalnya, menggunakan docker save untuk mengekspor image dari mesin 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 image ke Harbor

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

Login ke Oracle Container Registry

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

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

Setelah login berhasil, 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 image

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

  1. Duplikasi 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. Duplikasi image 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. Duplikasi 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 mengambil image dari Harbor menggunakan kredensial yang disimpan di ./docker-harbor/config.json lokal Anda. Anda memerlukan secret ini di namespace operator (untuk mengambil image operator) dan namespace database (untuk mengambil 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 pull 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 Oracle Database Operator

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, memasukkan konfigurasi imagePullSecrets agar 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 akan 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 dicolokkan (PDB).
    • edition: menentukan edisi database (enterprise dalam hal ini).
    • image: mengarah ke image registry Harbor pribadi Anda.
    • persistence: meminta volume persisten 50Gi menggunakan StorageClass standard-rwo, yang membuat persistent disk zona di GDC.
    • replicas: menetapkan jumlah pod ke 1 untuk instance.
    • archiveLog: mengaktifkan mode Archive Log, yang diperlukan untuk Data Guard.
    • flashBack: mengaktifkan Flashback Database, sehingga Anda dapat mengembalikan database ke titik waktu sebelumnya.
    • forceLog: mengaktifkan Force Logging, memastikan semua perubahan dicatat ke dalam log, bahkan untuk operasi yang biasanya mengabaikan 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 database utama agar dapat diakses 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. Pastikan 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 responsif, deploy instance standby. Perhatikan bahwa parameter Data Guard (archiveLog, flashBack, forceLog) diwarisi dari parameter utama dan tidak boleh ditentukan dalam manifes standby:

  1. Men-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. Pastikan 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 Data Guard Broker

  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, bertransisi ke mode asinkron jika setidaknya satu standby dapat dijangkau.
    • fastStartFailover: ditetapkan 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 yang 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. Dapatkan 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 yang 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 broker. Awalnya, layanan ini 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 menghubungkan IP:

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

Menguji sinkronisasi data dan peran

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 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 peralihan manual untuk membalikkan peran, sehingga database hijau menjadi database utama yang 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 peralihan:

    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 instance database telah beralih peran dan database hijau kini menjadi database 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