가용성이 높은 자체 관리형 Oracle 데이터베이스 배포

이 가이드에서는 Google Distributed Cloud (GDC) 에어 갭 표준 클러스터에 가용성이 높은 멀티 영역 Oracle Data Guard 구성을 배포하는 방법을 설명합니다. 이 설정은 Oracle Database Enterprise Edition을 사용하고 GDC의 기존 스토리지 및 네트워킹 기능을 활용합니다.

이 배포는 데이터베이스의 수명 주기 관리를 자동화하는 Kubernetes용 공식 Oracle Database Operator for Kubernetes를 사용합니다.

아키텍처

이 아키텍처는 GDC 표준 클러스터 내에서 Oracle Database Operator가 관리하는 가용성이 높은 Oracle 데이터베이스 배포를 설명합니다. 가용성이 높은 배포는 복제 및 장애 조치를 위해 Data Guard로 구성된 기본 데이터베이스와 대기 데이터베이스로 구성됩니다.

Data Guard 아키텍처 다이어그램이 포함된 고가용성 Oracle 데이터베이스 배포

주요 구성요소는 다음과 같습니다.

  • GDC 프로젝트: 리소스의 프로젝트 컨테이너입니다.
  • 표준 Kubernetes 클러스터: 컴퓨팅 리소스를 제공하는 표준 클러스터 입니다.
  • Oracle Database Operator: Oracle 데이터베이스의 프로비저닝, 수명 주기 관리, 관측 가능성을 자동화하는 Kubernetes 연산자입니다. 패치, 백업, 복구와 같은 복잡한 작업을 간소화하여 컨테이너화된 환경에서 스테이트풀 Oracle 워크로드를 더 쉽게 실행할 수 있습니다.
  • 기본 데이터베이스: 활성 읽기-쓰기 컨테이너화된 데이터베이스 인스턴스입니다.
  • 대기 데이터베이스: 복제본 읽기 전용 (또는 장애 조치 중 읽기-쓰기) 데이터베이스 인스턴스입니다.
  • Data Guard Broker: 데이터베이스 간의 구성 및 역할 전환 (전환/장애 조치)을 조정합니다.
  • Harbor: 에어 갭 환경 내에서 데이터베이스, 연산자, 클라이언트 이미지를 호스팅하는 데 사용되는 비공개 컨테이너 레지스트리입니다.
  • Cert-manager: 연산자는 웹훅 인증서를 관리하기 위해 cert-manager에 의존합니다. cert-manager 는 GDC 표준 클러스터에 사전 설치되어 있습니다.

이 가이드에서는 연산자를 자체 네임스페이스(oracle-database-operator-system)에 배포하고 데이터베이스 인스턴스를 별도의 네임스페이스 (oracle-dbs)에 배포합니다. 이러한 네임스페이스는 아키텍처 다이어그램에서 점선 테두리 상자로 표시됩니다.

명확성과 관리 용이성을 위해 이 분리를 사용하는 것이 좋습니다. 하지만 데이터베이스를 구성하는 방법은 사용자가 결정합니다. 예를 들어 워크로드 요구사항, 팀 소유권 또는 보안 사양에 따라 세분화된 액세스 제어 (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 보안 비밀에 저장되어 클러스터가 컨테이너를 인스턴스화할 때 Harbor에서 이미지를 가져올 수 있습니다.

  • 각각 최소 16GB의 메모리가 있는 워커 노드가 2개 이상 있는 표준 Kubernetes 클러스터를 만듭니다. 예를 들면 다음과 같습니다.

    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
    
  • 환경 변수를 설정합니다. 이러한 변수는 가이드 전반에서 리소스를 만들고 참조하는 데 사용됩니다.

    참고:

    • 이 가이드 전반에서 두 데이터베이스 인스턴스의 이름은 임의로 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 Operator의 매니페스트와 컨테이너 이미지를 다운로드할 수 있는 배스천 노드에서 실행된다고 가정합니다. 인터넷 액세스 권한이 없는 머신에서 실행하는 경우 이러한 애셋을 별도로 가져와야 합니다 (예: docker save를 사용하여 연결된 머신에서 이미지를 내보내고 docker load를 사용하여 가져오기). 그런 다음 계속하기 전에 환경에 안전하게 업로드합니다.

  • 계속하기 전에 container-registry.oracle.com에서 계정을 만들고 API 토큰을 가져온 후 Oracle Database Enterprise EditionOracle Instant Client 이미지 모두에 대한 라이선스 계약을 수락해야 합니다.

Harbor에 이미지 로드

Google Distributed Cloud 에어 갭 내의 클러스터는 외부 레지스트리에 액세스할 수 없으므로 필요한 이미지를 비공개 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 데이터베이스 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"
    

보안 비밀 만들기

클러스터가 로컬 ./docker-harbor/config.json에 저장된 사용자 인증 정보를 사용하여 Harbor에서 이미지를 가져올 수 있도록 Kubernetes 보안 비밀을 만듭니다. 연산자 이미지 가져오기를 위한 연산자의 네임스페이스와 데이터베이스 이미지 가져오기를 위한 데이터베이스의 네임스페이스 모두에 이 보안 비밀이 필요합니다.

  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. 클러스터 역할 바인딩: 연산자가 클러스터 전체에서 작동하는 데 필요한 권한을 설정합니다.

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yaml
    
  2. 노드 RBAC: 올바른 포드 예약에 중요한 노드 토폴로지를 읽을 수 있는 권한을 부여합니다.

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yaml
    
  3. 연산자 배포: 연산자 포드 및 커스텀 리소스 정의를 배포합니다. 이 명령어는 공식 매니페스트를 다운로드하고 이미지 경로를 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 -
    

    연산자 포드가 실행될 때까지 기다립니다.

    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: GDC에서 영역 영구 디스크를 만드는 standard-rwo StorageClass를 사용하여 50Gi 영구 볼륨을 요청합니다.
    • replicas: 인스턴스의 포드 수를 1로 설정합니다.
    • archiveLog: Data Guard에 필요한 보관 로그 모드를 사용 설정합니다.
    • flashBack: 데이터베이스를 이전 시점으로 되돌릴 수 있도록 플래시백 데이터베이스를 사용 설정합니다.
    • forceLog: 일반적으로 로깅을 우회하는 작업에서도 모든 변경사항이 로깅되도록 강제 로깅을 사용 설정합니다.

    커스텀 초기화 매개변수 및 리소스 한도를 포함한 구성 옵션의 전체 목록은 공식 문서를 참조하세요.

    데이터베이스 생성은 리소스 집약적이며 10~20분 정도 걸릴 수 있습니다.

    계속하기 전에 데이터베이스가 완전히 준비될 때까지 기다립니다. 대기 데이터베이스는 복제를 설정하기 위해 기본 데이터베이스에 액세스할 수 있어야 하므로 이 단계는 매우 중요합니다.

    데이터베이스 포드가 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"
    

    데이터베이스 포드가 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로 설정합니다. 사용 설정된 경우 기본 데이터베이스를 사용할 수 없게 되면 관찰자 프로세스가 자동으로 장애 조치를 트리거할 수 있습니다.
    • loadBalancer: 브로커의 Kubernetes LoadBalancer 서비스를 만들려면 true로 설정하여 항상 현재 기본 데이터베이스로 라우팅되는 안정적인 외부 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
    

    출력은 다음과 같이 표시됩니다. 여기서 BLUE_POD_IP 대신 파란색 포드 IP가 표시됩니다.

    NAME                ENDPOINTS
    broker-blue-green   [BLUE_POD_IP]:5500,[BLUE_POD_IP]:1521
    
  5. 데이터베이스 포드를 확인하여 IP를 상호 연결합니다.

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

데이터 동기화 및 역할 테스트

이제 클러스터 내 클라이언트 포드를 사용하여 기본 데이터베이스에 데이터를 쓰고 대기 데이터베이스에서 데이터를 읽어 복제를 확인합니다.

브로커 서비스로 기본 데이터베이스에 쓰기

  1. 안정적인 브로커 서비스를 사용하여 기본 데이터베이스에 연결할 임시 포드를 배포합니다.

    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. 대기 서비스에 직접 연결할 임시 포드를 배포합니다.

    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
    

    출력은 다음과 같이 표시됩니다. 여기서 GREEN_POD_IP 대신 녹색 포드 IP가 표시됩니다.

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

다음 단계