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

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

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

아키텍처

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

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

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

  • GDC 프로젝트: 리소스의 프로젝트 컨테이너입니다.
  • Standard Kubernetes 클러스터: 컴퓨팅 리소스를 제공하는 Standard 클러스터입니다.
  • Oracle Database Operator: Oracle 데이터베이스의 프로비저닝, 수명 주기 관리, 모니터링 가능성을 자동화하는 Kubernetes 연산자입니다. 패치, 백업, 복구와 같은 복잡한 작업을 간소화하여 컨테이너화된 환경에서 스테이트풀(Stateful) Oracle 워크로드를 더 쉽게 실행할 수 있습니다.
  • 기본 데이터베이스: 활성 읽기-쓰기 컨테이너화된 데이터베이스 인스턴스입니다.
  • 대기 데이터베이스: 복제본 읽기 전용 (또는 장애 조치 중 읽기-쓰기) 데이터베이스 인스턴스입니다.
  • Data Guard Broker: 데이터베이스 간의 구성 및 역할 전환(전환/장애 조치)을 조정합니다.
  • Harbor: 에어 갭 환경 내에서 데이터베이스, 오퍼레이터, 클라이언트 이미지를 호스팅하는 데 사용되는 비공개 Container Registry입니다.
  • 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
    
  • 환경 변수를 설정합니다. 이러한 변수는 가이드 전체에서 리소스를 만들고 참조하는 데 사용됩니다.

    참고:

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

  • 계속하기 전에 container-registry.oracle.com에서 계정을 만들고 API 토큰을 가져온 후 Oracle Database Enterprise Edition 및 Oracle 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 Container Registry에서 이미지를 다운로드하고 내부 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 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"
    

보안 비밀 만들기

로컬 ./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: standard-rwo StorageClass를 사용하여 50Gi 영구 볼륨을 요청합니다. 그러면 GDC에 영역 영구 디스크가 생성됩니다.
    • 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 브로커 구성

  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: 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 서비스 (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
    

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

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

다음 단계