이 페이지에서는 pglogical
확장 프로그램을 사용하여 Google Cloud AlloyDB와 AlloyDB Omni 간에 데이터를 복제하는 단계를 제공합니다.
AlloyDB Omni의 pglogical
, 이점, 제한사항에 관한 개요는 pglogical 확장 프로그램 정보를 참고하세요.
pglogical
의 주요 구성요소
pglogical
확장 프로그램의 주요 구성요소는 다음과 같습니다.
- 노드: PostgreSQL 클러스터 내 데이터베이스에 대한 참조입니다.
pglogical
확장 프로그램은 클러스터 내의 임의의 데이터베이스에 설치되고 이러한 데이터베이스에서 작동하며, 각각은 고유한 pglogical 노드로 작동합니다. 각 노드는 복제 소스라고도 하는 제공업체이거나 복제 대상이라고도 하는 구독자이거나 둘 다 동시에 될 수 있습니다. 데이터베이스당 하나의 노드만 허용됩니다. - 복제 세트: 프로바이더 데이터베이스에 마이그레이션할 테이블 및 시퀀스의 논리적 그룹화와 복제해야 하는 SQL 문(예:
INSERT, UPDATE, DELETE, TRUNCATE
)으로 정의됩니다. 테이블을 두 개 이상의 복제 세트에 할당할 수 있습니다. 기본적으로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 구독자에서도 최소한의 파라미터 조정이 필요합니다. DATA_DIR/postgresql.conf
파일의 shared_preload_libraries
매개변수에 pglogical
를 추가해야 합니다. 클러스터 내의 데이터베이스가 제공업체 데이터베이스로 작동하는 경우 제공업체 데이터베이스에 필요한 매개변수 변경사항을 적용합니다.
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
권한이 모두 있어야 합니다.
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
복제 세트에서 테이블을 삭제합니다. 스키마에 기본 키가 없는 테이블이 있는 경우 INSERT 전용 복제용으로 설정하거나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
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
과 같은 오류는 무시합니다. 이 역할은Google Cloud 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');"
구독자 데이터베이스에서Google Cloud 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
확장 프로그램에는 이 문서에서 다루지 않는 많은 고급 기능이 있습니다.
이러한 기능 중 다수는 구현에 적용할 수 있습니다. 다음과 같은 고급 기능을 고려해 볼 수 있습니다.
- 충돌 해결 방법
- 멀티마스터 및 양방향 복제
- 시퀀스 포함
- 전환 및 장애 조치 절차