이 가이드에서는 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로 구성된 기본 데이터베이스와 대기 데이터베이스로 구성됩니다.

주요 구성요소는 다음과 같습니다.
- 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-adminHarbor 프로젝트에서 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 컨테이너 레지스트리에서 이미지를 다운로드하고 내부 Harbor 프로젝트로 푸시합니다. 테스트를 위해 연산자, 엔터프라이즈 데이터베이스, 인스턴트 클라이언트를 미러링합니다.
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}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}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
클러스터 액세스 구성
리소스를 배포하기 전에 표준 클러스터의 사용자 인증 정보를 검색하고 편리한 별칭을 만듭니다.
표준 클러스터의 kubeconfig 파일을 검색합니다.
KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml gdcloud clusters \ get-credentials ${CLUSTER_NAME} \ --standard \ --project ${PROJECT_ID} \ --zone ${ZONE}후속 명령어를 간소화하기 위해
kk별칭을 만듭니다.alias kk="kubectl --kubeconfig kubeconfig-${CLUSTER_NAME}.yaml"
보안 비밀 만들기
클러스터가 로컬 ./docker-harbor/config.json에 저장된 사용자 인증 정보를 사용하여 Harbor에서 이미지를 가져올 수 있도록 Kubernetes 보안 비밀을 만듭니다. 연산자 이미지 가져오기를 위한 연산자의 네임스페이스와 데이터베이스 이미지 가져오기를 위한 데이터베이스의 네임스페이스 모두에 이 보안 비밀이 필요합니다.
연산자의 네임스페이스를 만듭니다.
kk create ns ${ORACLE_OPERATOR_NAMESPACE}연산자의 가져오기 보안 비밀을 만듭니다.
kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker-harbor/config.json \ -n ${ORACLE_OPERATOR_NAMESPACE}데이터베이스의 네임스페이스를 만듭니다.
kk create ns ${DB_NAMESPACE}데이터베이스 컨테이너의 이미지 가져오기 보안 비밀을 만듭니다.
kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker-harbor/config.json \ -n ${DB_NAMESPACE}데이터베이스의 관리 비밀번호에 대한 보안 비밀을 만듭니다.
kk create secret generic ${ADMIN_PASSWORD_SECRET_NAME} \ --from-literal=password=${ADMIN_PASSWORD} \ -n ${DB_NAMESPACE}
Oracle Database Operator 설치
이제 세 가지 매니페스트를 적용하여 Oracle Database Operator를 클러스터에 설치합니다.
클러스터 역할 바인딩: 연산자가 클러스터 전체에서 작동하는 데 필요한 권한을 설정합니다.
kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yaml노드 RBAC: 올바른 포드 예약에 중요한 노드 토폴로지를 읽을 수 있는 권한을 부여합니다.
kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yaml연산자 배포: 연산자 포드 및 커스텀 리소스 정의를 배포합니다. 이 명령어는 공식 매니페스트를 다운로드하고 이미지 경로를 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
기본 데이터베이스 및 대기 데이터베이스 배포
이제 동일한 네임스페이스에서 두 데이터베이스 인스턴스를 순차적으로 배포합니다.
기본 인스턴스 배포
다음 명령어를 실행하여 기본 데이터베이스 인스턴스를 만듭니다.
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-rwoStorageClass를 사용하여 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! #########################상태가
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)는 기본 인스턴스에서 상속되며 대기 매니페스트에 지정해서는 안 됩니다.
대기 인스턴스를 배포합니다.
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! #########################상태가
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 구성
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: 브로커의 KubernetesLoadBalancer서비스를 만들려면true로 설정하여 항상 현재 기본 데이터베이스로 라우팅되는 안정적인 외부 IP 주소를 제공합니다.
브로커 상태가
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 falseDataguardBroker는 트래픽을 현재 기본 데이터베이스로 자동 라우팅하는 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브로커 서비스의 엔드포인트를 확인합니다. 처음에는 파란색 포드의 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데이터베이스 포드를 확인하여 IP를 상호 연결합니다.
kk get pod -n ${DB_NAMESPACE} -o wide
데이터 동기화 및 역할 테스트
이제 클러스터 내 클라이언트 포드를 사용하여 기본 데이터베이스에 데이터를 쓰고 대기 데이터베이스에서 데이터를 읽어 복제를 확인합니다.
브로커 서비스로 기본 데이터베이스에 쓰기
안정적인 브로커 서비스를 사용하여 기본 데이터베이스에 연결할 임시 포드를 배포합니다.
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테스트 테이블을 만듭니다.
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
대기 데이터베이스에서 읽기 (직접 액세스)
대기 서비스에 직접 연결할 임시 포드를 배포합니다.
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데이터 복제를 확인합니다.
SELECT * FROM employees; exit;출력은 다음과 같이 표시됩니다.
ID NAME ---------- -------------------------------------------------- 1 John Doe
수동 전환 수행
수동 전환을 트리거하여 역할을 반대로 지정하고 녹색 데이터베이스를 새 기본 데이터베이스로 만듭니다. 연산자에는 전환 대상의 SID (예: ORCLGREEN)가 필요합니다.
다음 명령어를 실행합니다.
kk patch dataguardbroker broker-blue-green -n ${DB_NAMESPACE} --type='merge' \ -p "{\"spec\":{\"setAsPrimaryDatabase\":\"ORCLGREEN\"}}"전환 진행 상황을 모니터링합니다.
kk get sidb -n ${DB_NAMESPACE} -w전환이 완료되면 출력이 다음과 같이 표시됩니다.
NAME EDITION STATUS ROLE database-blue Enterprise Healthy PHYSICAL_STANDBY database-green Healthy PRIMARY데이터베이스 인스턴스의 역할이 전환되었고 녹색 데이터베이스가 이제 기본 데이터베이스인지 확인합니다.
kk get dataguardbroker -n ${DB_NAMESPACE}출력은 다음과 같이 표시됩니다.
NAME PRIMARY STANDBYS PROTECTION MODE broker-blue-green ORCLGREEN ORCLBLUE MaxAvailabilitybroker-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