주:
- 이 사용지침서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료할 때 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
Pglogical Extension을 사용하여 OCI 데이터베이스와 PostgreSQL의 리전 간 동기화
소개
Pglogical 확장을 사용하면 PostgreSQL 인스턴스를 통해 여러 OCI(Oracle Cloud Infrastructure) 데이터베이스에서 논리적 복제를 수행할 수 있습니다. 버전 간 PostgreSQL 복제를 지원하며 OCI 내의 지역 및 로컬 가용성 도메인에 배포된 데이터베이스 간 데이터 동기화를 용이하게 합니다. 또한 클라우드에서 실행하든 온프레미스에서 실행하든 관계없이 다중 클라우드 공급업체의 관리형 PostgreSQL 서비스와 자체 관리형 커뮤니티 PostgreSQL 인스턴스에 호스팅되는 데이터베이스 간 복제를 통해 매우 유연하고 상호 운용 가능한 복제 솔루션을 제공할 수 있습니다.
pglogical은 게시-구독 모델을 활용하여 논리적 스트리밍 복제를 통해 게시자에서 가입자로의 테이블, 시퀀스 및 기타 객체에 대한 변경 사항을 복제할 수 있습니다. 이 확장 기능은 다음과 같은 다양한 사용 사례에 이상적입니다.
-
전체 데이터베이스 복제
-
주요 버전 업그레이드(특정 제한 사항 포함)
-
스키마, DDL(데이터 정의어), 시퀀스 및 테이블 데이터 복제
-
CDC(변경 데이터 캡처)
-
여러 업스트림 서버에서 데이터 집계 및 병합
제한사항
pglogical 확장은 다음과 같은 제한으로 인해 특정 사용 사례에 적합하지 않을 수 있습니다.
-
여러 데이터베이스를 동시에 복제하는 것은 지원되지 않습니다.
-
UNLOGGED
및TEMPORARY
테이블을 복제할 수 없습니다. -
데이터베이스 메타데이터 마이그레이션은 지원되지 않습니다.
-
자동 DDL 복제를 사용할 수 없습니다.
-
인코딩이 다른 데이터베이스 간 복제는 지원되지 않습니다.
-
LOB(대형 객체) 변경 사항은 디코딩할 수 없으므로 복제가 불가능합니다. 가능하면 LOB 대신 대용량 이진 데이터를 저장하려면 bytea 데이터 유형을 사용하는 것이 좋습니다.
자세한 내용은 제한 및 제한을 참조하십시오.
목표
- 특히 애슈번과 뭄바이 간의 복제를 시연하는 두 OCI 리전 간 교차 리전에서 언어 확장을 구현합니다. 이 설정은 단일 OCI 리전 내에서 리전 내 복제에 맞게 조정할 수도 있습니다.
필수 조건
-
OCI 테넌시에 액세스합니다.
-
OCI 배스천 호스트(OCI 컴퓨트 이미지)입니다.
-
각 지역에 VCN(가상 클라우드 네트워크)을 생성합니다.
-
Pglogical 확장은 원본 데이터베이스와 대상 데이터베이스에 모두 설치되어야 합니다.
-
테이블 구조 일관성: 제공자와 가입자의 테이블은 이름이 동일하고, 스키마에 있고, 데이터 유형이 일치하는 열이 동일해야 합니다.
-
제약 조건 호환성:
CHECK
및NOT NULL
제약 조건은 제공자보다 가입자에 대해 동일하거나 더 많이 허용되어야 합니다. -
기본 주요 요구 사항: 테이블은 동일한
PRIMARY KEYs
를 가져야 합니다. 기본 키 이외의 다른UNIQUE
제약 조건을 추가하는 것은 권장되지 않습니다.
작업 1: 데이터베이스 간의 통신 설정
여러 지역의 DB 시스템에 연결하려면 VCN 피어링을 설정해야 합니다.
DRG(동적 경로 지정 게이트웨이)를 사용하여 VCN 피어링을 생성하려면 하위 태스크를 따릅니다.
작업 1.1: DRG를 VCN에 연결
-
요구사항에 따라 소스 영역 및 대상 영역에 VCN을 생성합니다.
-
요구사항에 따라 소스 및 대상 영역에서 DRG(동적 경로 지정 게이트웨이)를 생성합니다.
-
VCN에 DRG를 연결하려면 소스 영역에서 DRG를 선택합니다. VCN 연결 및 가상 클라우드 네트워크 연결 생성을 누릅니다.
-
VCN 연결 생성 페이지에서 연결 이름을 입력하고 VCN-A(소스 지역 VCN)를 선택한 다음 VCN 연결 생성을 누릅니다.
-
동일한 단계를 반복하여 대상 VCN을 연결합니다.
자세한 내용은 동적 경로 지정 게이트웨이를 참조하십시오.
작업 1.2: RPC(원격 피어링 연결) 생성
-
소스 영역 RPC(
SOR-RPC
)를 만듭니다. -
SOURCE DRG
세부정보 페이지로 이동하고 원격 피어링 접속 첨부 파일을 누릅니다. -
원격 피어링 접속 생성을 누릅니다.
-
원격 피어링 접속 생성 페이지에서 접속 이름을 입력하고 컴파트먼트를 선택한 다음 원격 피어링 접속 생성을 누릅니다.
-
대상 영역 RPC(
TAR-RPC
)를 만들려면 위에서 수행한 것과 동일한 절차를 반복하여 대상 영역 RPC를 만듭니다.
작업 1.3: RPC 연결 설정
SOR-RPC
연결을 통해 소스 영역에서 대상 영역으로의 연결을 설정합니다.
-
SOURCE DRG
세부정보 페이지로 이동하고 원격 피어링 접속 첨부 파일을 누릅니다. -
원격 피어링 접속 열에서 접속 이름을 눌러
SOR-RPC
의 세부정보를 확인합니다. -
접속 세부정보 페이지에서 접속 설정을 누르고 접속 이름을 입력한 다음 컴파트먼트를 선택합니다.
-
접속 설정 페이지에서 대상 영역 이름 영역을 선택하고 대상 RPC의 OCID(
TAR-RPC
)를 입력합니다. 연결이 설정되면 RPC의 상태가 PEERED로 변경됩니다.따라서
TAR-RPC
피어링 상태도 PEERED로 변경됩니다.
작업 1.4: DRG 연결로 대상 트래픽을 전송하도록 VCN의 경로 테이블 구성
-
Target-VCN
개인 서브넷 CIDR로 트래픽을 전송하도록Source-VCN
에서 경로 테이블을 구성합니다. -
Source-VCN
세부정보 페이지로 이동하고 경로 테이블을 누릅니다. -
경로 테이블 목록에서 전용 서브넷-소스-VCN에 대한 경로 테이블을 누릅니다.
-
경로 테이블 페이지에서 경로 규칙 추가를 누르고 요구사항에 따라 경로 규칙 정보를 입력합니다.
-
소스-VCN의 프라이빗 서브넷 CIDR로 트래픽을 전송하도록
Target-VCN
의 경로 테이블을 구성하려면 위에서 수행한 것과 동일한 단계를 반복하여 소스-VCN의 프라이빗 서브넷에 대한 경로 테이블을 구성합니다.
작업 1.5: DRG를 통해 VCN의 프라이빗 서브넷 간 트래픽을 허용하도록 보안 수신 규칙 추가
-
소스 VCN의 프라이빗 서브넷-소스-VCN에 대한 보안 목록에 수신 규칙을 추가하여
Target-VCN-private
서브넷에서Source-VCN-private
서브넷으로 오는 트래픽 허용 -
Source-VCN
세부정보 페이지로 이동하여 보안 목록 및 전용 서브넷 소스-VCN에 대한 보안 목록을 누릅니다. -
보안 목록 페이지에서 수신 규칙 추가를 누르고 요구사항에 따라 수신 규칙 정보를 입력합니다.
-
Source-VCN-private
서브넷에서Target-VCN-private
서브넷으로 들어오는 트래픽을 허용하도록Target-VCN
의 프라이빗 서브넷 대상-VCN에 대한 보안 목록에 수신 규칙을 추가하려면 위에서 수행한 것과 동일한 단계를 반복하여 대상-VCN에 대한 수신 규칙을 추가하지만 적절한 수신 규칙을 사용합니다.
작업 1.6: 영역 간 데이터베이스 연결 테스트 및 검증
Source-VM
에 연결하여 대상 데이터베이스에 대한 연결을 확인하고 대상 VM에서 소스 데이터베이스의 연결을 동시에 검증하여 양방향 통신을 보장합니다.
작업 2: A-record 입력 구성
영역 간 데이터베이스 시스템의 FQDN(정규화된 도메인 이름)을 분석하도록 A 레코드 항목을 구성해야 합니다. 이 자습서에서는 뭄바이 지역이 대상 지역 역할을 합니다.
-
대상 영역(뭄바이)으로 전환하고 검색 표시줄에 DNS를 입력한 다음 개인 뷰를 선택합니다.
-
현재 영역에 대한 VCN 목록이 표시됩니다. DRG가 이미 구성된 VCN을 선택합니다.
-
뭄바이에 있는 데이터베이스 시스템의 FQDN을 포함하여 DNS 영역 목록이 나타납니다.
-
원격 데이터베이스 시스템에 대한 항목을 추가합니다.
-
영역 만들기를 누릅니다.
-
영역 이름에 다른 영역(애슈번)에 있는 데이터베이스 시스템의 FQDN을 입력합니다.
-
새 영역 항목을 추가하려면 생성을 누릅니다.
-
-
A-record 항목을 구성합니다.
-
새로 생성된 구역을 열고 레코드 관리를 누른 다음 레코드 추가를 선택합니다.
-
다음 정보를 입력합니다.
-
이름: 이름을 입력합니다.
-
유형: A(IPv4 주소)를 선택합니다.
-
TTL: 3600초를 입력합니다(애플리케이션 요구사항에 따라 수정).
-
RDATA 모드: 기본을 선택합니다.
-
주소: 다른 영역에 있는 데이터베이스 시스템의 기본 끝점 IP 주소를 입력합니다.
-
-
-
변경사항 저장, 변경사항 게시 순으로 눌러 구성을 적용합니다.
이 설정을 통해 이제 데이터베이스 시스템 B(뭄바이)가 FQDN을 사용하여 데이터베이스 시스템 A(애슈번)를 해결하고 연결할 수 있으므로 원활한 리전 간 데이터베이스 통신이 가능합니다.
작업 3: 영역 전체에서 데이터베이스 시스템 생성
OCI의 여러 리전에 PostgreSQL 데이터베이스를 배포하여 강력한 재해 복구(DR) 전략을 수립합니다. OCI에서 PostgreSQL 데이터베이스 생성에 대한 자세한 내용은 데이터베이스 시스템 생성을 참조하십시오.
작업 4: 영역 전체에서 pglogical 확장 사용
이 자습서에서는 애슈번을 소스 영역으로, 뭄바이를 대상 영역으로 지정하여 DR 구현을 보여줍니다.
-
애슈번 지역에서 OCI 콘솔에 로그인하고, PostgreSQL 데이터베이스로 이동하고, 데이터베이스 시스템을 선택하고, 구성 파일에 액세스하여 구성 설정을 수정합니다.
-
전체 구성 파일로 재지정됩니다. 계속하려면 구성 복사를 선택합니다. 그러면 다음 페이지가 표시됩니다.
-
사양을 기준으로 필요한 정보를 입력합니다. 그런 다음 사용자 변수(읽기/쓰기)로 이동하고 다른 변수 추가를 누른 다음 변수 이름을 각각
wal_level
및track_commit_timestamp
으로, 변수 값을 각각logical
및1
으로 선택합니다. -
확장 구성에서
pglogical
을 PostgreSQL 확장으로 선택합니다. -
생성을 누르면 구성 파일이 생성됩니다.
-
데이터베이스 시스템으로 이동하고 구성에서 편집을 선택한 다음 이전에 생성된 구성을 데이터베이스 시스템에 적용합니다.
-
데이터베이스 시스템에 Updating 상태가 표시됩니다. 계속하기 전에 Active가 될 때까지 기다립니다.
-
활성 상태인 경우 다음 질의를 사용하여 데이터베이스 시스템에 로그인하고 사용으로 설정된 확장을 확인합니다.
SHOW oci.admin_enabled_extensions;
-
다음 명령을 사용하여 언어 확장을 만듭니다.
CREATE EXTENSION pglogical;
다음은 해당 명령의 샘플 출력입니다.
pglogical_source=> show oci.admin_enabled_extensions ; oci.admin_enabled_extensions ------------------------------ pglogical (1 row) pglogical_source=> create extension pglogical; CREATE EXTENSION
-
다른 (뭄바이) 지역 데이터베이스에서 동일한 절차를 반복하여 언어 확장을 활성화합니다.
작업 5: 소스 데이터베이스 구성
다음 질의를 실행하여 소스 데이터베이스에 논리적 복제를 사용으로 설정할 수 있는 권한을 부여합니다.
alter role psql with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to psql ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql;
'psql'은 데이터베이스 설정 프로세스 중에 생성된 샘플 사용자입니다.
작업 6: 소스 데이터베이스에서 일반 확장 복제 설정
-
소스 데이터베이스에 게시자 노드를 만듭니다.
SELECT pglogical.create_node(node_name := 'provider1',dsn :='host=primary.xxxxxxxxx.postgresql.us-ashburn-1.oci.oraclecloud.com port=5432 user=xxxx password=xxxxx dbname=pglogical_source');
node_name:
소스 데이터베이스에 만들 게시자의 이름을 지정합니다.host:
소스 데이터베이스의 FQDN(정규화된 도메인 이름)을 입력합니다.port_number:
소스 데이터베이스가 실행 중인 포트를 제공합니다.database_name:
게시가 생성될 데이터베이스를 지정합니다.
-
공용 스키마의 모든 테이블을 기본 복제 세트에 포함합니다.
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
작업 7: 대상 데이터베이스 구성
다음 질의를 실행하여 대상 데이터베이스에 논리적 복제를 사용으로 설정할 수 있는 권한을 부여합니다.
alter role psql with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to psql ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to psql;
'psql'은 데이터베이스 설정 프로세스 중에 생성된 샘플 사용자입니다.
필요한 권한을 부여한 후 원본 데이터베이스 구조와 일치하도록 Target Database의 모든 필수 객체를 복제합니다.
작업 8: 대상 데이터베이스에서 pglogical 복제 설정
-
대상 데이터베이스에 가입자 노드를 생성합니다.
SELECT pglogical.create_node(node_name := 'subscriber1',dsn :='host=primary.xxxxxxx.postgresql.ap-mumbai-1.oci.oraclecloud.com port=5432 user=xxxx password=xxxxx dbname=pglogical_target');
node_name:
대상 데이터베이스에서 가입자 이름을 정의합니다.host:
대상 데이터베이스의 FQDN(정규화된 도메인 이름)을 입력합니다.port_number:
대상 데이터베이스가 실행 중인 포트를 입력합니다.database_name:
가입이 생성될 데이터베이스의 이름을 제공합니다.
-
구독자 노드에서 구독을 생성하여 백그라운드 동기화 및 복제 프로세스를 시작합니다.
SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=primary.xxxxxxxx.postgresql.us-ashburn-1.oci.oraclecloud.com port=5432 user=xxxx password=xxxxxx dbname=pglogical_source sslmode=verify-full sslrootcert=/etc/opt/postgresql/ca-bundle.pem'); SELECT pglogical.wait_for_subscription_sync_complete('subscription1');
subscription_name:
구독 이름을 제공합니다.host:
소스 데이터베이스의 FQDN을 제공합니다.port_number:
대상 데이터베이스가 실행 중인 포트를 제공합니다.database_name:
소스 데이터베이스의 이름을 제공합니다.
주: 접속 실패를 방지하려면 구독 생성 문자열에
sslmode=verify-full
및sslrootcert = /etc/opt/postgresql/ca-bundle.pem
를 사용해야 합니다.
작업 9: 가입 상태 확인
다음 명령문을 실행하여 대상 데이터베이스에서 가입 상태를 확인합니다.
select * from pglogical.show_subscription_status();
작업 10: 데이터 복제가 실행 중인지 확인
다음 명령문을 실행하여 소스 데이터베이스에서 복제 상태를 확인합니다.
SELECT * FROM pg_stat_replication;
작업 11: (Optional) 복제 중지 또는 시작
-
대상 데이터베이스에서 다음 명령을 사용하여 가입을 비활성화할 수 있습니다.
select pglogical.alter_subscription_disable('subscription_name');
-
대상 데이터베이스에서 다음 명령을 사용하여 가입을 활성화할 수 있습니다.
select pglogical.alter_subscription_enable('subscription_name');
참고:
subscription_name
에서 대상에 생성된 구독의 이름을 입력합니다.
작업 12: (선택사항) 가입 삭제
대상 데이터베이스에서 가입을 삭제하려면 다음 명령을 실행합니다.
select pglogical.drop_subscription('subscription_name');
참고:
subscription_name
에서 대상에 생성된 구독의 이름을 입력합니다.
문제 해결
-
다음 오류가 발생하면 대상 VCN에 A-record를 추가해야 함을 나타냅니다. 해결하려면 작업 2를 참조하십시오.
ERROR: could not connect to the postgresql server: could not translate host name "primary.XXXXXXX.postgresql.xx-xxxxx-1.oci.oraclecloud.com" to address: Name or service not known
-
인증 실패를 방지하려면 가입을 생성하는 동안 문자열에
sslmode=verify-full and sslrootcert=/etc/opt/postgresql/ca-bundle.pem
를 지정합니다.could not connect to the postgresql server: connection to server at "primary.XXXXXXX.postgresql.xx-xxxxx-1.oci.oraclecloud.com" , port 5432 failed: SSL error: certificate verify failed
다음 단계
이 사용지침서에서는 전체 확장 기능을 사용하여 PostgreSQL를 통해 OCI Database의 리전에 걸쳐 DR 솔루션을 구현하는 포괄적인 접근 방식을 제공합니다. 구성 프로세스, 데이터 복제 및 일반적인 문제 해결에 대해 다룹니다.
또한 이 방법을 PostgreSQL 업그레이드에 적용하여 다운타임을 최소화하고 대상 데이터베이스가 소스와 완전히 동기화되면 원활한 애플리케이션 컷오버를 수행할 수 있습니다.
승인
- 작성자 - Kaviya Selvaraj(Senior Member Technical Staff)
추가 학습 자원
docs.oracle.com/learn에서 다른 랩을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Cross-Region Synchronization of OCI Database with PostgreSQL using the pglogical Extension
G31234-03
Copyright ©2025, Oracle and/or its affiliates.