高可用性のセルフマネージド Oracle データベースをデプロイする

このガイドでは、Google Distributed Cloud(GDC)エアギャップ スタンダード クラスタに高可用性マルチゾーン Oracle Data Guard 構成をデプロイする方法について説明します。 この設定では、Oracle Database Enterprise Edition を使用し、GDC の既存のストレージ機能とネットワーク機能を利用します。

このデプロイでは、データベースのライフサイクル管理を自動化する Oracle Database Operator for Kubernetes を使用します。

アーキテクチャ

このアーキテクチャは、GDC スタンダード クラスタ内の Oracle Database オペレーターによって管理される高可用性 Oracle Database デプロイについて説明しています。高可用性デプロイは、レプリケーションとフェイルオーバー用に Data Guard で構成されたプライマリ データベースとスタンバイ データベースで構成されます。

Data Guard アーキテクチャ図を使用した高可用性 Oracle データベースのデプロイ。

主なコンポーネントは次のとおりです。

  • GDC プロジェクト: リソースの プロジェクト コンテナ。
  • スタンダード Kubernetes クラスタ: コンピューティング リソースを提供するスタンダード クラスタ
  • Oracle Database オペレーター: Oracle データベースの プロビジョニング、ライフサイクル管理、オブザーバビリティを自動化する Kubernetes オペレーター。 パッチ適用、バックアップ、復元などの複雑なタスクを簡素化し、コンテナ化された環境でステートフル Oracle ワークロードを簡単に実行できるようにします。
  • プライマリ データベース: アクティブな読み取り / 書き込みコンテナ化データベース インスタンス。
  • スタンバイ データベース: レプリカの読み取り専用(またはフェイルオーバー時の読み取り / 書き込み) データベース インスタンス。
  • Data Guard ブローカー: データベース間の構成とロールの切り替え (スイッチオーバー/フェイルオーバー)を調整します。
  • Harbor: エアギャップ環境内でデータベース、 オペレーター、クライアント イメージをホストするために使用されるプライベート コンテナ レジストリ。
  • Cert-manager: オペレーターは、Webhook 証明書の管理に cert-manager を使用します。cert-manager は、GDC スタンダード クラスタにプリインストールされています。

このガイドでは、オペレーターを独自の Namespace(oracle-database-operator-system)にデプロイし、データベース インスタンスを別の Namespace(oracle-dbs)にデプロイします。これらの Namespace は、アーキテクチャ図で破線のボックスで示されています。

明確さと管理しやすさのために、この分離をおすすめします。ただし、データベースの構成方法はユーザーが決定します。たとえば、ワークロードのニーズ、チームの所有権、セキュリティ仕様に基づいて、特定のデータベースを異なる Namespace にグループ化して、きめ細かいアクセス制御(RBAC)を管理できます。

始める前に

デプロイを開始する前に、環境が次の要件を満たしていることを確認する必要があります。

  • このプロジェクト は、この ガイド全体で生成されるすべてのリソースのホルダーとして機能します。
  • プロジェクトのクラスタ管理者ロールとスタンダード クラスタ管理者ロールをユーザーに付与します。これにより、スタンダード 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 Secret に保存され、コンテナのインスタンス化時にクラスタが Harbor からイメージを pull できるようになります。

  • 少なくとも 2 つのワーカーノードを持つスタンダード Kubernetes クラスタを作成します。各ワーカーノードには、16 GB 以上のメモリが必要です。次に例を示します。

    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
    
  • 環境変数を設定します。これらは、ガイド全体でリソースの作成と参照に使用されます。

    注:

    • このガイドでは、2 つのデータベース インスタンスに bluegreen という名前を付けています。最初は、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"
    
  • ネットワークに関する注意: このガイドでは、GDC API にアクセスできると同時に、インターネットにアクセスして Oracle オペレーターのマニフェストとコンテナ イメージをダウンロードできる要塞ノードから実行することを前提としています。インターネットにアクセスできないマシンから実行する場合は、これらのアセットを個別に取得(たとえば、docker save を使用して接続されたマシンからイメージをエクスポートし、docker load を使用してインポートする)し、続行する前に環境に安全にアップロードする必要があります。

  • 続行する前に、 container-registry.oracle.com でアカウントを作成して API トークンを取得し、 Oracle Database Enterprise Edition イメージと Oracle Instant Client イメージの両方の使用許諾契約に同意する必要があります。

Harbor にイメージを読み込む

Google Distributed Cloud エアギャップ内のクラスタは外部レジストリにアクセスできないため、必要なイメージをプライベート Harbor インスタンスにミラーリングする必要があります。

Oracle Container Registry にログインする

ベースイメージを pull するには、まず公式の 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 に保存されます。

イメージを pull、タグ付け、push する

公式の Oracle コンテナ レジストリからイメージをダウンロードし、内部の Harbor プロジェクトに push します。テスト用に、オペレーター、エンタープライズ データベース、インスタント クライアントをミラーリングします。

  1. Oracle Database オペレーター イメージをミラーリングします。

    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 Instant Client イメージをミラーリングします。

    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"
    

Secret を作成する

ローカルの ./docker-harbor/config.json に保存されている認証情報を使用して、クラスタが Harbor からイメージを pull できるように、Kubernetes Secret を作成します。この Secret は、オペレーターの Namespace(オペレーター イメージを pull するため)とデータベースの Namespace(データベース イメージを pull するため)の両方に必要です。

  1. オペレーターの Namespace を作成します。

    kk create ns ${ORACLE_OPERATOR_NAMESPACE}
    
  2. オペレーターの pull Secret を作成します。

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${ORACLE_OPERATOR_NAMESPACE}
    
  3. データベースの Namespace を作成します。

    kk create ns ${DB_NAMESPACE}
    
  4. データベース コンテナのイメージ pull Secret を作成します。

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${DB_NAMESPACE}
    
  5. データベースの管理パスワードの Secret を作成します。

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

Oracle Database オペレーターをインストールする

次に、3 つのマニフェストを適用して、Oracle Database オペレーターをクラスタにインストールします。

  1. クラスタロール バインディング: オペレーターがクラスタ全体で機能するために必要な権限を設定します。

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yaml
    
  2. ノード RBAC: 正しい Pod スケジューリングに不可欠なノード トポロジを読み取る権限を付与します。

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yaml
    
  3. オペレーターのデプロイ: オペレーター Pod とカスタム リソース定義をデプロイします。このコマンドは、公式マニフェストをダウンロードし、イメージパスを Harbor URL に置き換え、Kubernetes が Harbor で認証できるように imagePullSecrets 構成を挿入して、結果を適用します。

    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 -
    

    オペレーター Pod が実行されるまで待ちます。

    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
    

プライマリ データベースとスタンバイ データベースをデプロイする

同じ Namespace に 2 つのデータベース インスタンスを順番にデプロイします。

プライマリ インスタンスをデプロイする

  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: システム ID(SID)とプラガブル データベース(PDB)名を定義します。
    • edition: データベース エディション(この場合は enterprise)を指定します。
    • image: プライベート Harbor レジストリ イメージを指します。
    • persistence: standard-rwo StorageClass を使用して 50 Gi の永続ボリュームをリクエストします。これにより、GDC にゾーン永続ディスクが作成されます。
    • replicas: インスタンスの Pod 数を 1 に設定します。
    • archiveLog: Data Guard に必要なアーカイブ ログモードを有効にします。
    • flashBack: フラッシュバック データベースを有効にして、データベースを以前の時点に戻せるようにします。
    • forceLog: 強制ロギングを有効にして、通常はロギングをバイパスするオペレーションでもすべての変更がログに記録されるようにします。

    カスタム初期化パラメータ やリソース上限など、構成オプションの完全なリストについては、公式 ドキュメントをご覧ください。

    データベースの作成はリソースを大量に消費するため、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 パラメータ(archiveLogflashBackforceLog)はプライマリから継承され、スタンバイ マニフェストで指定してはならないことに注意してください。

  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 ブローカーを構成する

  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: 少なくとも 1 つのスタンバイが使用可能な場合はデータ損失が発生しないように MaxAvailability に設定し、少なくとも 1 つのスタンバイに到達可能な場合は非同期モードに移行します。
    • fastStartFailover: false に設定して自動フェイルオーバーを無効にします。 有効にすると、プライマリ データベースが使用不能になった場合に、オブザーバー プロセスが自動的にフェイルオーバーをトリガーできます。
    • 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 Service(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. ブローカー サービスのエンドポイントを確認します。最初は、青色の Pod の IP アドレスを指している必要があります。

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

    出力は次のようになります。BLUE_POD_IP の代わりに青色の Pod の IP が表示されます。

    NAME                ENDPOINTS
    broker-blue-green   [BLUE_POD_IP]:5500,[BLUE_POD_IP]:1521
    
  5. データベース Pod を確認して IP を関連付けます。

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

データ同期とロールをテストする

クラスタ内クライアント Pod を使用して、プライマリにデータを書き込み、スタンバイから読み取ることで、レプリケーションを検証します。

ブローカー サービスを使用してプライマリ データベースに書き込む

  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 サービス エンドポイントが更新され、緑色の Pod の IP を指していることを確認します。

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

    出力は次のようになります。GREEN_POD_IP の代わりに緑色の Pod の IP が表示されます。

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

次のステップ