이 페이지에서는 pglogical
확장 프로그램을 사용하여 Google Cloud AlloyDB와 AlloyDB Omni 간에 데이터를 복제하는 단계도 설명합니다.
pglogical
의 주요 구성요소
pglogical
확장 프로그램의 주요 구성요소는 다음과 같습니다.
- 노드: PostgreSQL 클러스터 내 데이터베이스에 제공된 참조입니다.
pglogical
확장 프로그램은 클러스터 내의 데이터베이스에 설치되고 데이터베이스를 대상으로 작동하며, 각 데이터베이스는 별도의 pglogical 노드 역할을 합니다. 각 노드는 복제 소스라고도 하는 제공자이거나 복제 타겟이라고도 하는 구독자이거나 둘 다 동시에 될 수 있습니다. 데이터베이스당 하나의 노드만 허용됩니다. - 복제 세트: 마이그레이션할 테이블과 시퀀스의 논리적 그룹화 및 복제해야 하는
INSERT, UPDATE, DELETE, TRUNCATE
와 같은 SQL 문으로 제공업체 데이터베이스에 정의됩니다. 테이블을 두 개 이상의 복제 세트에 할당할 수 있습니다. 기본적으로default
,default_insert_only
,ddl_sql
와 같은 사전 구성된 복제 세트 3개가 제공되며 필요에 따라 복제 세트를 원하는 만큼 추가할 수 있습니다. - 구독: 제공자 데이터베이스에서 복제된 변경사항과 구독자 데이터베이스에서 복제된 변경사항의 세부정보를 제공합니다. 정기 결제는 연결 문자열을 통해 제공자 데이터베이스를 지정하고, 선택적으로 해당 제공자에서 복사해야 하는 복제 세트를 지정합니다. 또한 구독을 만들 때
apply delay
사용 여부를 지정할 수도 있습니다.
이 배포에서 Google Cloud AlloyDB 서비스는 제공자이고 온프레미스 AlloyDB Omni는 구독자입니다. 반대 구성도 가능합니다.
지원되는 인증 방법
AlloyDB Omni에서 pglogical
확장 프로그램을 구현하기 전에 복제 노드 간의 네트워킹과 보안을 고려해야 합니다.
pglogical
확장 프로그램과 함께 사용되는 두 가지 주요 인증 방법은 비밀번호 및 신뢰 인증 방법입니다.
비밀번호 인증 방법에서는 비밀번호가 pglogical
소유의 데이터베이스 테이블에 일반 텍스트 형식으로 저장되므로 신뢰 인증 방법을 사용하는 것이 좋습니다. 이러한 비밀번호는 이러한 테이블을 쿼리할 데이터베이스 권한이 있는 사용자에게 일반 텍스트로 표시되며, 비바이너리 백업 및 PostgreSQL 로그 파일에도 표시됩니다.
신뢰 인증 방법을 사용하는 경우 최대한의 보안을 위해 호스트 기반 인증 파일 pg_hba.conf
에 특정 항목을 입력해야 합니다. 타겟 데이터베이스를 지정하여 액세스를 제한하고 복제 옵션 또는 특정 데이터베이스, 복제 사용자, 구독자의 특정 IP 주소에서만 허용할 수 있습니다.
시작하기 전에
특정 데이터베이스 내에서 pglogical
를 확장 프로그램으로 설치할 수 있습니다.
AlloyDB Omni에 pglogical
확장 프로그램을 구현하기 전에 다음 시스템 요구사항을 충족하는지 확인하세요.
- Google Cloud AlloyDB 클러스터 및 Cloud AlloyDB 관리자로서 기본 인스턴스에 대한 읽기/쓰기 액세스 권한 Google Cloud AlloyDB 클러스터를 프로비저닝하는 방법은 데이터베이스 만들기 및 연결을 참고하세요.
- 설치 및 구성된 AlloyDB Omni 서버 AlloyDB Omni 설치 방법에 관한 안내는 AlloyDB Omni 설치를 참고하세요.
- Google Cloud AlloyDB의 기본 인스턴스와 AlloyDB Omni 호스트 서버의 IP 주소입니다.
- Google Cloud AlloyDB와 AlloyDB Omni 호스트 서버 간에 설정되고 보안이 유지되는 네트워크 표준 PostgreSQL 포트 5432의 TCP 연결이 필요합니다.
Google Cloud AlloyDB 제공업체의 매개변수 조정
pglogical
확장 프로그램에는Google Cloud AlloyDB 제공업체 클러스터에 대한 최소한의 매개변수 조정이 필요합니다. wal_level
매개변수를 logical
로 설정하고 postgresql.conf
파일의 shared_preload_libraries
매개변수에 pglogical
를 추가해야 합니다.
cp postgresql.conf postgresql.bak
sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
sed -r -i "s|',|'|" postgresql.conf
Google Cloud AlloyDB 서비스에서는 적절한 클러스터 플래그를 설정하여 매개변수를 조정할 수 있습니다.
다음 Google Cloud AlloyDB 플래그의 매개변수를 조정해야 합니다.
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
Google CloudAlloyDB에서 데이터베이스 플래그를 설정하는 방법을 알아보려면 인스턴스의 데이터베이스 플래그 구성을 참고하세요.
기타 필수 제공자 노드 데이터베이스 매개변수의 경우 다음과 같이Google Cloud AlloyDB 기본값을 설정해야 합니다.
max_worker_processes
: 공급자 데이터베이스당 하나, 구독자 노드당 하나 이상 이 매개변수의 표준은 10 이상입니다.max_replication_slots
: 제공자 노드의 노드당 하나max_wal_senders
: 제공자 노드의 노드당 하나track_commit_timestamp
: 마지막 또는 첫 번째 업데이트가 충돌 해결에서 승리해야 하는 경우on
로 설정합니다.listen_addresses
: AlloyDB Omni IP 주소를 포함하거나 포괄적인 CIDR 블록을 통해 언급해야 합니다.
psql
와 같은 쿼리 도구를 사용하여 이러한 매개변수를 확인할 수 있습니다.
AlloyDB Omni 구독자 클러스터의 매개변수 조정
pglogical
확장 프로그램에는 AlloyDB Omni 구독자에서도 최소한의 파라미터 조정이 필요합니다. /var/alloydb/config/postgresql.conf
파일의 shared_preload_libraries
매개변수에 pglogical
를 추가해야 합니다. 클러스터 내 데이터베이스가 제공자 데이터베이스 역할을 하는 경우 제공자 데이터베이스에 필요한 매개변수 변경사항을 적용합니다.
매개변수를 조정합니다.
sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" /var/alloydb/config/postgresql.conf
매개변수가 올바르게 설정되었는지 확인합니다.
grep -iE 'shared_preload_libraries' /var/alloydb/config/postgresql.conf
AlloyDB Omni CLI를 사용하여 매개변수 변경사항이 적용되도록 AlloyDB Omni를 다시 시작합니다.
sudo alloydb database-server stop
sudo alloydb database-server start
다른 제공자 데이터베이스 매개변수에 대한 AlloyDB Omni 기본값을 설정합니다.
max_worker_processes
: 공급자 데이터베이스당 하나, 구독자 노드당 하나track_commit_timestamp
: 마지막/첫 번째 업데이트가 충돌 해결에서 우선해야 하는 경우on
로 설정합니다.
모든 매개변수 값이 관련성이 있는지 확인합니다.
docker exec pg-service psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name; "
AlloyDB Omni 구독자 클러스터에 대한 호스트 기반 인증 조정
pglogical
는 AlloyDB Omni 구독자 데이터베이스에 로컬 TCP 연결을 만듭니다. 따라서 AlloyDB Omni /var/alloydb/config/pg_hba.conf
파일에 구독자의 호스트 서버 IP 주소를 추가해야 합니다.
새
pglogical_replication
사용자에 맞게 로컬 서버의 신뢰 인증 항목을/var/alloydb/config/pg_hba.conf
파일에 추가합니다.echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a /var/alloydb/config/pg_hba.conf
항목이 올바른지 확인합니다.
tail -2 /var/alloydb/config/pg_hba.conf
AlloyDB Omni CLI를 사용하여 인증 변경사항이 적용되도록 AlloyDB Omni를 다시 시작합니다.
sudo alloydb database-server stop
sudo alloydb database-server start
공급자 및 구독자 클러스터에서 pglogical
사용자 만들기
제공자 클러스터와 구독자 클러스터 모두에서 새 사용자를 만들어야 합니다.
pglogical
를 사용하려면 사용자에게 superuser
속성과 replication
속성이 모두 있어야 합니다.
Google Cloud AlloyDB 제공업체 클러스터에서 사용자를 만들고
alloydbsuperuser
역할을 부여합니다.CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; GRANT alloydbsuperuser TO pglogical_replication;
AlloyDB Omni 구독자 클러스터에서 사용자를 만들고
replication
및superuser
속성을 부여합니다.CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
Google Cloud AlloyDB 제공업체 데이터베이스에 pglogical
및 노드 추가
필수 권한을 부여합니다.
각 데이터베이스에
pglogical
확장 프로그램을 설치하고 pglogical 데이터베이스 사용자에게usage
권한을 부여해야 합니다. Google Cloud AlloyDB에서는pglogical
스키마에 권한을 부여해야 합니다.예를 들어 데이터베이스가
my_test_db
인 경우 Google Cloud AlloyDB 제공업체 데이터베이스에 대해 다음 명령어를 실행합니다.\c my_test_db; CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication; -- For Google Cloud AlloyDB we also need to manually grant privileges: GRANT ALL PRIVILEGES ON ALL tables IN SCHEMA pglogical TO pglogical_replication;
제공자 데이터베이스의
pglogical
노드를 만듭니다.node_name
는 임의의 값이며dsn
문자열은 동일한 데이터베이스로 다시 연결되는 유효한 TCP 연결이어야 합니다. Google Cloud AlloyDB의 경우dsn
의 호스트 부분은 기본 인스턴스에 제공된 IP 주소입니다.Google Cloud AlloyDB의 경우 신뢰 인증이 허용되지 않으며 비밀번호 인수가
dsn
에 포함되어야 합니다. 배포가 시작될 것입니다예를 들어
my_test_db
데이터베이스의 경우 다음 명령어를 실행합니다.SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
테이블을 만들고 기본 복제 세트에 추가
테이블을 만들고 Google CloudAlloyDB 제공자 데이터베이스의 기본 복제 세트에 추가합니다.
제공자 데이터베이스에
test_table_1
이라는 테스트 테이블을 만듭니다.CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
개별 테이블에
SELECT
권한을 부여하거나GRANT SELECT ON ALL TABLES
명령어를 실행합니다. 복제 세트에 포함될 테이블에는 복제 사용자pglogical_replication
에 쿼리 권한이 부여되어야 합니다.GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
기본 복제 세트에 테스트 테이블을 수동으로 추가합니다. 맞춤 pglogical 복제 세트를 만들거나 기본 복제 세트를 사용할 수 있습니다. 확장 프로그램을 만들 때
default
,default_insert_only
,ddl_sql
와 같은 여러 기본 복제 세트가 생성되었습니다. 복제 세트에 테이블과 시퀀스를 개별적으로 추가하거나 지정된 스키마에 대해 한 번에 모두 추가할 수 있습니다.-- Add the specified table to the default replication set: SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table;
(선택사항)
public
와 같은 지정된 스키마의 모든 테이블을 추가합니다.-- Add all "public" schema tables to the default replication set: SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table; -- Add all "public" schema sequences to the default replication: SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']); -- Check which sequences have been added to all replication sets: SELECT * FROM pglogical.replication_set_seq;
default
복제 세트에서 테이블을 삭제합니다. 기본 키가 없는 테이블이 스키마에 있는 경우 삽입 전용 복제를 설정하거나ALTER TABLE
명령어와 함께 사용되는REPLICA IDENTITY
기능을 사용하여 행을 고유하게 식별하는 열을 설정할 수 있습니다.replication_set_add_all_tables
함수를 사용하여 이러한 테이블을default
복제 세트에 자동으로 추가한 경우 해당 복제 세트에서 테이블을 수동으로 삭제하고default_insert_only
세트에 추가해야 합니다.-- Remove the table from the **default** replication set: SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
-- Manually add to the **default_insert_only** replication set: SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
원하는 경우 새로 생성된 테이블을 복제 세트에 자동으로 추가하려면
pglogical
소스에 제안된 대로pglogical_assign_repset
트리거를 추가하세요.
데이터베이스를 AlloyDB Omni 구독자 클러스터에 복사
pg_dump
유틸리티를 사용하여 소스 데이터베이스의 스키마 전용 백업을 만듭니다.Google Cloud AlloyDB 기본 인스턴스의 IP 주소를 사용하여 AlloyDB Omni 구독자 서버에서
pg_dump
명령어를 실행합니다.pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
백업을 구독자 AlloyDB Omni 서버의 구독자 데이터베이스로 가져옵니다.
docker exec -i pg-service psql -h localhost -U postgres < my_test_db.schema-only.sql
alloydbsuperuser not existing
와 같은 오류를 무시합니다. 이 역할은Google Cloud AlloyDB에만 적용됩니다.
이렇게 하면 행 데이터 없이 데이터베이스와 스키마가 생성됩니다. 행 데이터는 pglogical
확장 프로그램에 의해 복제됩니다. 필요한 다른 사용자 또는 역할을 수동으로 복사하거나 다시 만듭니다.
AlloyDB Omni 구독자 데이터베이스에 노드 및 구독 만들기
AlloyDB Omni 구독자 데이터베이스에 노드를 만듭니다.
docker exec pg-service psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication'); "
구독자 데이터베이스에서Google Cloud AlloyDB 제공업체 데이터베이스' 기본 인스턴스를 다시 가리키는 구독을 만듭니다.
docker exec pg-service psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret'); "
몇 초 또는 몇 분 이내에 초기 데이터가 제공자에서 구독자로 복제됩니다.
docker exec pg-service psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1; "
공급자 데이터베이스에 추가된 추가 행도 몇 초 내에 복제됩니다.
pglogical
추가 배포 고려사항
pglogical
확장 프로그램에는 이 문서에서 다루지 않는 많은 고급 기능이 있습니다.
이러한 기능 중 다수는 구현에 적용할 수 있습니다. 다음 고급 기능을 고려할 수 있습니다.
- 충돌 해결 방법
- 멀티 마스터 및 양방향 복제
- 시퀀스 포함
- 전환 및 장애 조치 절차