AlloyDB Omni와 다른 데이터베이스 간에 데이터 복제

문서 버전을 선택합니다.

이 페이지에서는 pglogical 확장 프로그램을 사용하여 AlloyDB Omni와 다른 데이터베이스 간에 데이터를 복제하는 단계를 설명합니다.

자세한 내용은 pglogical 확장 프로그램 정보pglogical 용어 및 기본 구성요소를 참고하세요.

지원되는 인증 방법

pglogical 확장 프로그램과 함께 사용되는 두 가지 주요 인증 방법은 비밀번호 및 신뢰 인증 방법입니다.

신뢰 인증 방법을 사용하는 것이 좋습니다. 자세한 내용은 지원되는 인증 방법을 참고하세요.

시작하기 전에

특정 데이터베이스 내에서 pglogical를 확장 프로그램으로 설치할 수 있습니다.

AlloyDB Omni에 pglogical 확장 프로그램을 구현하기 전에 다음 시스템 요구사항을 충족하는지 확인하세요.

  • superuser로 AlloyDB가 아닌 PostgreSQL 클러스터에 액세스
  • pglogical 확장 프로그램이 AlloyDB 외 PostgreSQL 클러스터에 설치되어 있습니다. 출시 및 배포 관련 설치 안내는 pglogical을 참고하세요.
  • AlloyDB Omni 서버가 설치되고 구성되어 있어야 합니다. AlloyDB Omni를 설치하는 방법에 관한 안내는 AlloyDB Omni 설치를 참고하세요.
  • AlloyDB가 아닌 PostgreSQL 클러스터와 AlloyDB Omni 호스트 서버의 IP 주소
  • AlloyDB 외 PostgreSQL 클러스터와 AlloyDB Omni 호스트 서버 간에 설정되고 보안이 유지되는 네트워크 표준 PostgreSQL 포트 5432의 TCP 연결이 필요합니다.

AlloyDB가 아닌 공급자의 매개변수 조정

  1. 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
  2. 매개변수가 올바르게 설정되었는지 확인합니다.

    grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
  3. 파라미터 변경사항을 적용하려면 AlloyDB가 아닌 클러스터를 다시 시작합니다.

    다른 매개변수는 이미 충분한 값으로 설정되어 있거나 AlloyDB 이외의 배포 및 버전에 따라 조정해야 할 수 있습니다.

    다음 매개변수를 확인합니다.

    • max_worker_processes: 공급자 데이터베이스당 하나, 구독자 노드당 하나 이상 이 매개변수의 표준은 10 이상입니다.
    • max_replication_slots: 제공자 노드의 노드당 하나
    • max_wal_senders: 제공자 노드의 노드당 하나
    • track_commit_timestamp: 마지막 또는 첫 번째 업데이트가 충돌 해결에서 승리해야 하는 경우 on로 설정합니다.
    • listen_addresses: AlloyDB Omni IP 주소를 포함하거나 포괄적인 CIDR 블록을 통해 언급해야 합니다.
  4. (선택사항) AlloyDB 이외의 제공업체가 Amazon RDS 또는 Aurora인 경우 pglogical 확장 프로그램을 사용 설정하고 cluster parameter group 조정을 통해 필수 매개변수를 조정해야 합니다.

    1. 기존 또는 새 클러스터 파라미터 그룹 내에서 다음 파라미터를 설정합니다.

      • rds.logical_replication~1
      • max_replication_slots~50
      • max_wal_senders~50
      • max_worker_processes~64
      • shared_preload_libraries~pg_stat_statements, pglogical
    2. 클러스터 파라미터 그룹 조정이 적용되도록 Amazon RDS 또는 Aurora 클러스터를 다시 시작합니다.

  5. 모든 매개변수 값이 관련성이 있는지 확인합니다.

    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).

  1. 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 주소로 바꿉니다.

  2. 항목이 올바른지 확인합니다.

    tail -3 DATA_DIR/pg_hba.conf
  3. 파라미터 변경사항을 적용하려면 AlloyDB가 아닌 클러스터를 다시 시작합니다.

AlloyDB Omni 구독자 클러스터의 매개변수 조정

pglogical를 사용하려면 AlloyDB Omni 구독자 클러스터에서도 최소한의 매개변수 조정이 필요합니다. DATA_DIR/postgresql.conf 파일의 shared_preload_libraries 매개변수에 pglogical를 추가해야 합니다. 클러스터 내 데이터베이스가 제공자 데이터베이스 역할을 하는 경우 제공자 데이터베이스에 필요한 매개변수 변경사항을 적용합니다.

  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 container restart CONTAINER_NAME

제공자 및 구독자 클러스터 모두에서 pglogical 사용자 만들기

제공자 클러스터와 구독자 클러스터 모두에서 새 사용자를 만들어야 합니다. pglogical를 사용하려면 사용자에게 superuser 속성과 replication 속성이 모두 있어야 합니다.

  1. PostgreSQL용 AlloyDB 제공자 클러스터에서 사용자 역할을 만듭니다.

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    
  2. (선택사항) AlloyDB 이외의 제공자가 Amazon RDS 또는 Aurora인 경우 다음 역할을 부여해야 합니다.

    GRANT rds_superuser TO replication_user;
    

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

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

    각 데이터베이스에 pglogical 확장 프로그램을 설치하고 pglogical 데이터베이스 사용자에게 usage 권한을 부여해야 합니다.

    예를 들어 데이터베이스가 my_test_db인 경우 다음 명령어를 실행합니다.

    CREATE EXTENSION IF NOT EXISTS pglogical;
    GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    
  2. 제공자 데이터베이스의 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가 아닌 제공업체 데이터베이스의 기본 복제 세트에 추가합니다.

  1. 제공자 데이터베이스에 test_table_1이라는 테스트 테이블을 만듭니다.

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. 기본 복제 세트에 테스트 테이블을 수동으로 추가합니다. 맞춤 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;
    
  3. (선택사항) 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;
    
  4. 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 구독자 클러스터에 복사

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

  2. AlloyDB Omni 구독자 서버에서 AlloyDB 외 서버의 IP 주소 또는 엔드포인트를 사용하여 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

이렇게 하면 행 데이터 없이 데이터베이스와 스키마가 생성됩니다. 행 데이터는 pglogical 확장 프로그램에 의해 복제됩니다. 필요한 다른 사용자 또는 역할을 수동으로 복사하거나 다시 만듭니다.

AlloyDB Omni 구독자 데이터베이스에 노드 및 구독 만들기

  1. 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');
    "
  2. 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');
    "
  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 확장 프로그램에는 이 문서에서 다루지 않는 많은 고급 기능이 있습니다. 이러한 기능 중 다수는 구현에 적용할 수 있습니다. 다음 고급 기능을 고려해 볼 수 있습니다.

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

다음 단계