PostgreSQL용 AlloyDB 및 AlloyDB Omni 간에 데이터 복제

문서 버전을 선택합니다.

이 페이지에서는 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로 설정하고 pglogicalpostgresql.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 구독자에서도 최소한의 파라미터 집합을 조정해야 합니다. pglogicalDATA_DIR/postgresql.conf 파일의 shared_preload_libraries 파라미터에 추가해야 합니다. 클러스터 내 데이터베이스가 제공업체 데이터베이스 역할을 하는 경우 제공업체 데이터베이스에 필요한 파라미터를 변경합니다.

DATA_DIR를 데이터 디렉터리의 파일 시스템 경로로 바꿉니다(예: /home/$USER/alloydb-data).

  1. 파라미터를 조정합니다.

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. 매개변수가 올바르게 설정되어 있는지 확인합니다.

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. AlloyDB Omni를 다시 시작하여 파라미터 변경사항을 적용합니다.

    Docker

     docker container restart CONTAINER_NAME

    CONTAINER_NAME을 AlloyDB Omni 컨테이너를 설치할 때 할당한 이름으로 바꿉니다.

    Podman

     podman container restart CONTAINER_NAME

    CONTAINER_NAME을 AlloyDB Omni 컨테이너를 설치할 때 할당한 이름으로 바꿉니다.

  4. 다른 제공업체 데이터베이스 파라미터에 대한 AlloyDB Omni 기본값을 설정합니다.

    • max_worker_processes: 제공업체 데이터베이스당 하나, 구독자 노드당 하나
    • track_commit_timestamp: 마지막 또는 첫 번째 업데이트로 충돌이 해결되어야 하는 경우에는 on으로 설정합니다.
  5. 모든 파라미터 값이 올바르게 설정되었는지 확인합니다.

    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 주소를 추가해야 합니다.

  1. 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
  2. 항목이 올바른지 확인합니다.

    tail -2 DATA_DIR/pg_hba.conf
  3. AlloyDB Omni를 다시 시작하여 인증 변경사항을 적용합니다.

    Docker

    docker container restart CONTAINER_NAME

    Podman

    podman container restart CONTAINER_NAME

제공업체 클러스터와 구독자 클러스터에서 pglogical 사용자 만들기

제공자 클러스터와 구독자 클러스터 모두에서 새 사용자를 만들어야 합니다. pglogical을 사용하려면 사용자에게 superuserreplication 권한이 모두 있어야 합니다.

  1. PostgreSQL용 AlloyDB 제공업체 클러스터에서 사용자를 만들고 alloydbsuperuser 역할을 부여합니다.

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    GRANT alloydbsuperuser TO pglogical_replication;
    
  2. AlloyDB Omni 구독자 클러스터에서 사용자를 만들고 replicationsuperuser 속성을 부여합니다.

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    

PostgreSQL용 AlloyDB 제공업체 데이터베이스에 pglogical 및 노드 추가

  1. 필수 권한을 부여합니다.

    각 데이터베이스에 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;
    
  2. 제공업체 데이터베이스의 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 제공업체 데이터베이스에서 테이블을 만들고 기본 복제 세트에 추가합니다.

  1. 제공업체 데이터베이스에 테스트 테이블 test_table_1을 만듭니다.

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. 개별 테이블에 대한 SELECT 권한을 부여하거나 GRANT SELECT ON ALL TABLES 명령어를 실행합니다. 복제 세트에 포함될 테이블에는 복제 사용자 pglogical_replication에 부여된 쿼리 권한이 있어야 합니다.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  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;
    
  4. (선택사항) 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;
    
  5. 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 구독자 클러스터에 데이터베이스 복사

  1. pg_dump 유틸리티를 사용하여 소스 데이터베이스의 스키마 전용 백업을 만듭니다.

  2. 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
  3. 백업을 구독자 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 구독자 데이터베이스에 노드 및 구독 만들기

  1. 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');"
  2. 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');"
  3. 테이블 크기와 복제할 데이터에 따라 복제 시간이 몇 초부터 몇 분까지 다양할 수 있으며 그 후 초기 데이터가 제공업체에서 구독자로 복제됩니다.

    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 확장 프로그램에는 이 문서에서 다루지 않는 다양한 고급 기능이 있습니다. 이러한 기능 중 다수를 구현에 적용할 수 있습니다. 다음 고급 기능을 사용하는 것이 좋을 수 있습니다.

  • 충돌 해결 방법
  • 멀티 마스터 및 양방향 복제
  • 시퀀스 포함
  • 전환 및 장애 조치 절차

다음 단계