이 페이지에서는 pglogical
확장 프로그램을 사용하여 AlloyDB Omni와 다른 데이터베이스 간에 데이터를 복제하는 단계를 제공합니다.
자세한 내용은 pglogical
확장 프로그램 정보 및 pglogical
용어 및 기본 구성요소를 참고하세요.
지원되는 인증 방법
pglogical
확장 프로그램과 함께 사용되는 두 가지 기본 인증 방법은 비밀번호 및 신뢰 인증 방법입니다.
권장되는 인증 방법은 신뢰 인증 방법입니다. 자세한 내용은 지원되는 인증 방법을 참고하세요.
시작하기 전에
pglogical
를 특정 데이터베이스 내에 확장 프로그램으로 설치할 수 있습니다.
AlloyDB Omni에서 pglogical
확장 프로그램을 구현하기 전에 다음 시스템 요구사항을 충족하는지 확인하세요.
- AlloyDB가 아닌 PostgreSQL 클러스터에
superuser
로 액세스합니다. pglogical
확장 프로그램이 AlloyDB가 아닌 PostgreSQL 클러스터에 설치되어 있습니다. 출시 및 배포별 설치 안내는 pglogical을 참고하세요.- 설치 및 구성된 AlloyDB Omni 서버 AlloyDB Omni를 설치하는 방법에 관한 안내는 AlloyDB Omni 설치를 참고하세요.
- AlloyDB 이외의 PostgreSQL 클러스터와 AlloyDB Omni 호스트 서버의 IP 주소입니다.
- AlloyDB 이외의 PostgreSQL 클러스터와 AlloyDB Omni 호스트 서버 간에 설정되고 보호된 네트워크입니다. 표준 PostgreSQL 포트 5432의 TCP 연결이 필요합니다.
AlloyDB 이외의 제공업체에서 매개변수 조정
wal_level
매개변수를logical
로 설정하고postgresql.conf
파일의shared_preload_libraries
매개변수에pglogical
를 추가합니다.pglogical
확장 프로그램을 사용하려면 AlloyDB가 아닌 제공업체 클러스터에서 최소한의 매개변수 조정이 필요합니다.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
매개변수가 올바르게 설정되어 있는지 확인합니다.
grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
AlloyDB가 아닌 클러스터를 다시 시작하여 파라미터 변경사항을 적용합니다.
다른 매개변수는 이미 충분한 값으로 설정되어 있거나 AlloyDB가 아닌 배포 및 버전에 따라 조정이 필요할 수 있습니다.
다음 매개변수를 확인합니다.
max_worker_processes
: 공급자 데이터베이스당 하나, 구독자 노드당 하나 이상 이 매개변수의 표준은 10 이상입니다.max_replication_slots
: 제공업체 노드의 노드당 하나입니다.max_wal_senders
: 제공업체 노드의 노드당 하나입니다.track_commit_timestamp
: 마지막 또는 첫 번째 업데이트가 충돌 해결을 이기면on
로 설정해야 합니다.listen_addresses
: AlloyDB Omni IP 주소를 포함하거나 적용 CIDR 블록을 통해 언급해야 합니다.
(선택사항) AlloyDB 이외의 제공업체가 Amazon RDS 또는 Aurora인 경우 pglogical 확장 프로그램을 사용 설정하고
cluster parameter group
조정을 통해 필요한 매개변수를 조정해야 합니다.기존 또는 새 클러스터 매개변수 그룹 내에서 다음 매개변수를 설정합니다.
rds.logical_replication
~1
max_replication_slots
~50
max_wal_senders
~50
max_worker_processes
~64
shared_preload_libraries
~pg_stat_statements, pglogical
클러스터 매개변수 그룹 조정이 적용되도록 Amazon RDS 또는 Aurora 클러스터를 다시 시작합니다.
모든 매개변수 값이 관련 있는지 확인합니다.
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
는 제공업체 데이터베이스에 로컬 TCP 연결을 만듭니다. 따라서 호스트 서버의 IP 주소를 AlloyDB Omni DATA_DIR/pg_hba.conf
파일에 추가해야 합니다. 여기서 DATA_DIR
는 데이터 디렉터리의 파일 시스템 경로입니다(예: /home/$USER/alloydb-data
).
새
pglogical_replication
사용자와 관련된 로컬 서버의 신뢰 인증 항목을DATA_DIR/pg_hba.conf
파일에 추가합니다.또한 구독자 노드는 제공업체 노드에 대해 인증할 수 있어야 합니다. 각 구독자 노드의 IP 주소 또는 적절한 CIDR 블록 IP 범위를
DATA_DIR/pg_hba.conf
파일에 추가합니다.echo -e "# pglogical entries: host all pglogical_replication samehost trust host all pglogical_replication SERVER_IP_ADDRESS/32 trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
SERVER_IP_ADDRESS
를 복제할 기본 AlloyDB Omni 인스턴스의 IP 주소로 바꿉니다.항목이 올바른지 확인합니다.
tail -3 DATA_DIR/pg_hba.conf
AlloyDB가 아닌 클러스터를 다시 시작하여 파라미터 변경사항을 적용합니다.
AlloyDB Omni 구독자 클러스터에 매개변수 조정
pglogical
에는 AlloyDB Omni 구독자 클러스터에서도 최소한의 파라미터 조정이 필요합니다. DATA_DIR/postgresql.conf
파일의 shared_preload_libraries
매개변수에 pglogical
를 추가해야 합니다. 클러스터 내의 데이터베이스가 제공업체 데이터베이스로 작동하는 경우 제공업체 데이터베이스에 필요한 매개변수 변경사항을 적용합니다.
매개변수를 조정합니다.
sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
매개변수가 올바르게 설정되어 있는지 확인합니다.
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
파라미터 변경사항이 적용되도록 AlloyDB Omni를 다시 시작합니다.
Docker
docker container restart CONTAINER_NAME
CONTAINER_NAME
을 AlloyDB Omni 컨테이너를 시작할 때 할당한 이름으로 바꿉니다.Podman
podman container restart CONTAINER_NAME
CONTAINER_NAME
을 AlloyDB Omni 컨테이너를 시작할 때 할당한 이름으로 바꿉니다.다른 제공업체 데이터베이스 매개변수의 AlloyDB Omni 기본값을 설정합니다.
max_worker_processes
: 공급자 데이터베이스당 하나, 구독자 노드당 하나입니다.track_commit_timestamp
: 마지막/첫 번째 업데이트가 충돌 해결이 필요한 경우on
로 설정합니다.
모든 매개변수 값이 관련 있는지 확인합니다.
Docker
docker exec CONTAINER_NAME 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; "
Podman
podman exec CONTAINER_NAME 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 DATA_DIR/pg_hba.conf
파일에 구독자의 호스트 서버 IP 주소를 추가해야 합니다.
새
pglogical_replication
사용자와 관련된 로컬 서버의 신뢰 인증 항목을DATA_DIR/pg_hba.conf
파일에 추가합니다.echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
항목이 올바른지 확인합니다.
tail -2 DATA_DIR/pg_hba.conf
인증 변경사항이 적용되도록 AlloyDB Omni를 다시 시작합니다.
docker container restart CONTAINER_NAME
제공업체 클러스터와 구독자 클러스터 모두에서 pglogical
사용자 만들기
제공업체 클러스터와 구독자 클러스터 모두에서 새 사용자를 만들어야 합니다.
pglogical
를 사용하려면 사용자에게 superuser
및 replication
속성이 모두 있어야 합니다.
Google Cloud AlloyDB 제공업체 클러스터에서 다음과 같이 사용자 역할을 만듭니다.
CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
(선택사항) AlloyDB 이외의 제공업체가 Amazon RDS 또는 Aurora인 경우 다음 역할을 부여해야 합니다.
GRANT rds_superuser TO replication_user;
AlloyDB가 아닌 제공업체 데이터베이스에 pglogical
및 노드 추가
필요한 권한을 부여합니다.
각 데이터베이스에
pglogical
확장 프로그램을 설치하고 pglogical 데이터베이스 사용자에게usage
권한을 부여해야 합니다.예를 들어 데이터베이스가
my_test_db
인 경우 다음 명령어를 실행합니다.CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication;
제공자 데이터베이스의
pglogical
노드를 만듭니다.node_name
는 임의이며dsn
문자열은 동일한 데이터베이스로 돌아가는 유효한 TCP 연결이어야 합니다.예를 들어
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');
테이블을 만들고 기본 복제 세트에 추가
테이블을 만들고 AlloyDB가 아닌 제공업체 데이터베이스의 기본 복제 세트에 추가합니다.
제공업체 데이터베이스에
test_table_1
라는 테스트 테이블을 만듭니다.CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
기본 복제 세트에 테스트 테이블을 수동으로 추가합니다. 맞춤 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
복제 세트에서 테이블을 삭제합니다. 스키마에 기본 키 또는 복제본 ID가 없는 테이블이 있는 경우INSERT
문만 복제할 수 있습니다. 이러한 테이블을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
유틸리티를 사용하여 소스 데이터베이스의 스키마 전용 백업을 만듭니다.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
docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Podman
podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
그러면 행 데이터 없이 데이터베이스와 스키마가 생성됩니다. 행 데이터는 pglogical
확장 프로그램에 의해 복제됩니다. 필요한 다른 사용자 또는 역할을 수동으로 복사하거나 다시 만듭니다.
AlloyDB Omni 구독자 데이터베이스에 노드 및 구독 만들기
AlloyDB Omni 구독자 데이터베이스에 노드를 만듭니다. 비밀번호 인증을 사용하려면
dsn
에 비밀번호를 추가합니다.Docker
docker exec CONTAINER_NAME 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'); "
Podman
podman exec CONTAINER_NAME 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'); "
AlloyDB Omni 제공자 서버의 제공자 데이터베이스를 다시 가리키는 구독자를 구독자 데이터베이스에 만듭니다.
Docker
docker exec CONTAINER_NAME 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'); "
Podman
podman exec CONTAINER_NAME 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
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT * FROM test_table_1 ORDER BY 1; "
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT * FROM test_table_1 ORDER BY 1; "
제공업체 데이터베이스에 추가된 추가 행도 몇 초 이내에 실시간으로 복제됩니다.
추가 pglogical
배포 고려사항
pglogical
확장 프로그램에는 이 문서에서 다루지 않는 많은 고급 기능이 있습니다. 이러한 기능 중 다수는 구현에 적용할 수 있습니다. 다음과 같은 고급 기능을 고려해 볼 수 있습니다.
- 충돌 해결 방법
- 멀티마스터 및 양방향 복제
- 시퀀스 포함
- 전환 및 장애 조치 절차