pglogical
확장 프로그램을 사용하여 PostgreSQL용 AlloyDB 및 AlloyDB Omni 간에 데이터를 복제하는 단계를 설명합니다.
AlloyDB Omni의 pglogical
, 이점, 제한사항을 간략히 알아보려면 pglogical 확장 프로그램 정보를 참조하세요.
pglogical
주요 구성요소
pglogical
확장 프로그램 주요 구성요소는 다음과 같습니다.
- 노드: PostgreSQL 클러스터 내 데이터베이스에 제공된 참조입니다.
pglogical
확장 프로그램은 클러스터 내 데이터베이스에 설치되고 데이터베이스를 대상으로 작동하며 각 데이터베이스는 별도의 pglogical 노드 역할을 합니다. 각 노드는 복제 소스라고도 하는 제공업체나 복제 대상이라고도 하는 구독자이거나 둘 다 동시에 될 수 있습니다. 데이터베이스당 노드 하나만 허용됩니다. - 복제 세트: 마이그레이션할 테이블과 시퀀스의 논리적 그룹화 및 복제해야 하는
INSERT, UPDATE, DELETE, TRUNCATE
와 같은 SQL 문으로 제공업체 데이터베이스에 정의됩니다. 테이블을 복제 세트 2개 이상에 할당할 수 있습니다. 기본적으로default
,default_insert_only
,ddl_sql
과 같은 사전 구성된 복제 세트 3개가 제공되며 니즈에 따라 복제 세트를 원하는 만큼 추가할 수 있습니다. - 구독: 제공업체 데이터베이스에서 복제된 변경사항과 구독자 데이터베이스의 제공업체 데이터베이스로 복제된 변경사항에 대한 세부정보를 제공합니다. 구독은 연결 문자열을 통해 제공업체 데이터베이스를 지정하고 선택적으로 해당 제공업체에서 복사해야 하는 복제 세트를 지정합니다. 또한 구독을 만들 때
apply delay
사용 여부도 지정할 수 있습니다.
이 배포에서 PostgreSQL용 AlloyDB 서비스는 제공업체이고 온프레미스 AlloyDB Omni는 구독자입니다. 반대 구성도 가능합니다.
지원되는 인증 방법
AlloyDB Omni에서 pglogical
확장 프로그램을 구현하기 전에 복제 노드 간의 네트워킹과 보안을 고려해야 합니다.
pglogical
확장 프로그램과 함께 사용되는 두 가지 주요 인증 방법은 비밀번호와 신뢰 인증 방법입니다.
비밀번호 인증 방법에서는 비밀번호가 pglogical
소유의 데이터베이스 테이블에 일반 텍스트 형식으로 저장되므로 신뢰 인증 방법을 사용하는 것이 좋습니다. 이러한 비밀번호는 이러한 테이블을 쿼리할 수 있는 데이터베이스 권한이 있는 사용자에게 일반 텍스트로 표시되며 논바이너리 백업과 PostgreSQL 로그 파일에도 표시됩니다.
신뢰 인증 방법을 사용하는 경우 최대한의 보안을 위해 호스트 기반 인증 파일 pg_hba.conf
에 특정 항목을 입력해야 합니다. 대상 데이터베이스를 지정하고 복제 옵션 또는 특정 데이터베이스, 복제 사용자만 허용하고 구독자의 특정 IP 주소에서만 허용하여 액세스를 제한할 수 있습니다.
시작하기 전에
특정 데이터베이스 내에서 pglogical
을 확장 프로그램으로 설치할 수 있습니다.
AlloyDB Omni에 pglogical
확장 프로그램을 구현하기 전에 다음 시스템 요구사항을 충족하는지 확인합니다.
- PostgreSQL용 AlloyDB 클러스터 및 PostgreSQL용 AlloyDB 관리자로서 기본 인스턴스에 대한 읽기/쓰기 액세스 권한. PostgreSQL용 AlloyDB 클러스터를 프로비저닝하는 방법은 PostgreSQL용 AlloyDB 데이터베이스 만들기 및 연결을 참조하세요.
- 설치 및 구성된 AlloyDB Omni 서버. AlloyDB Omni 설치 방법은 AlloyDB Omni 설치를 참조하세요.
- PostgreSQL용 AlloyDB 기본 인스턴스와 AlloyDB Omni 호스트 서버의 IP 주소
- PostgreSQL용 AlloyDB 및 AlloyDB Omni 호스트 서버 간에 설정되고 보호되는 네트워크. 표준 PostgreSQL 포트 5432의 TCP 연결이 필요합니다.
PostgreSQL용 AlloyDB 제공업체에서 파라미터 조정
pglogical
확장 프로그램을 사용하려면 PostgreSQL용 AlloyDB 제공업체 클러스터에서 최소한의 파라미터 집합을 조정해야 합니다. wal_level
파라미터를 logical
로 설정하고 pglogical
을 postgresql.conf
파일의 shared_preload_libraries
파라미터에 추가해야 합니다.
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
PostgreSQL용 AlloyDB 서비스에서는 적절한 클러스터 플래그를 설정하여 파라미터를 조정할 수 있습니다.
다음 PostgreSQL용 AlloyDB 플래그 파라미터를 조정해야 합니다.
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
PostgreSQL용 AlloyDB에서 데이터베이스 플래그를 설정하는 방법은 인스턴스의 데이터베이스 플래그 구성을 참조하세요.
기타 필수 제공업체 노드 데이터베이스 파라미터의 경우 다음과 같이 PostgreSQL용 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 구독자에서도 최소한의 파라미터 집합을 조정해야 합니다. pglogical
을 DATA_DIR/postgresql.conf
파일의 shared_preload_libraries
파라미터에 추가해야 합니다. 클러스터 내 데이터베이스가 제공업체 데이터베이스 역할을 하는 경우 제공업체 데이터베이스에 필요한 파라미터를 변경합니다.
DATA_DIR를 데이터 디렉터리의 파일 시스템 경로로 바꿉니다(예: /home/$USER/alloydb-data
).
파라미터를 조정합니다.
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
docker container restart CONTAINER_NAME
Podman
podman container restart CONTAINER_NAME
제공업체 클러스터와 구독자 클러스터에서 pglogical
사용자 만들기
제공자 클러스터와 구독자 클러스터 모두에서 새 사용자를 만들어야 합니다.
pglogical
을 사용하려면 사용자에게 superuser
및 replication
권한이 모두 있어야 합니다.
PostgreSQL용 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;
PostgreSQL용 AlloyDB 제공업체 데이터베이스에 pglogical
및 노드 추가
필수 권한을 부여합니다.
각 데이터베이스에
pglogical
확장 프로그램을 설치하고 pglogical 데이터베이스 사용자에게usage
권한을 부여해야 합니다. PostgreSQL용 AlloyDB에서는pglogical
스키마에 대한 권한을 부여해야 합니다.예를 들어 데이터베이스가
my_test_db
인 경우 PostgreSQL용 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 연결이어야 합니다. PostgreSQL용 AlloyDB의 경우dsn
의 호스트 부분은 기본 인스턴스에 제공된 IP 주소입니다.PostgreSQL용 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');
테이블 생성 및 기본 복제 세트에 추가
PostgreSQL용 AlloyDB 제공업체 데이터베이스에서 테이블을 만들고 기본 복제 세트에 추가합니다.
제공업체 데이터베이스에 테스트 테이블
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
유틸리티를 사용하여 소스 데이터베이스의 스키마 전용 백업을 만듭니다.PostgreSQL용 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
alloydbsuperuser not existing
과 같은 오류를 무시합니다. 이 역할은 PostgreSQL용 AlloyDB에만 해당합니다.
이렇게 하면 행 데이터 없이 데이터베이스와 스키마가 생성됩니다. pglogical
확장 프로그램에서 행 데이터를 복제합니다. 필요한 다른 사용자나 역할을 수동으로 복사하거나 다시 만듭니다.
AlloyDB Omni 구독자 데이터베이스에 노드 및 구독 만들기
AlloyDB Omni 구독자 데이터베이스에 노드를 만듭니다.
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');"
PostgreSQL용 AlloyDB 제공업체 데이터베이스 기본 인스턴스를 다시 가리키는 구독을 구독자 데이터베이스에 만듭니다.
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
확장 프로그램에는 이 문서에서 다루지 않는 다양한 고급 기능이 있습니다.
이러한 기능 중 다수를 구현에 적용할 수 있습니다. 다음 고급 기능을 사용하는 것이 좋을 수 있습니다.
- 충돌 해결 방법
- 멀티 마스터 및 양방향 복제
- 시퀀스 포함
- 전환 및 장애 조치 절차