pglogical을 사용하여 인스턴스 간 데이터 동기화 - Amazon Aurora

pglogical을 사용하여 인스턴스 간 데이터 동기화

현재 사용 가능한 모든 Aurora PostgreSQL 버전pglogical 확장을 지원합니다. pglogical 확장은 PostgreSQL 버전 10에서 도입된 기능적으로 유사한 논리적 복제 기능보다 먼저 출시되었습니다. 자세한 내용은 Aurora에서 PostgreSQL 논리적 복제 사용 섹션을 참조하세요.

pglogical 확장은 둘 이상의 Aurora PostgreSQL DB 클러스터 간의 논리적 복제를 지원합니다. . 서로 다른 PostgreSQL 버전 간의 복제와 PostgreSQL DB 인스턴스용 RDS 및 Aurora PostgreSQL DB 클러스터에서 실행되는 데이터베이스 간의 복제도 지원합니다. pglogical 확장은 게시-구독 모델을 사용하여 게시자의 테이블 및 기타 객체(예: 시퀀스)의 변경 사항을 구독자에 복제합니다. 이 확장은 복제 슬롯을 사용하여, 다음과 같이 게시자 노드의 변경 사항이 구독자 노드로 동기화되게 합니다.

  • 게시자 노드는 다른 노드에 복제할 데이터의 소스인 Aurora PostgreSQL DB 클러스터입니다. 게시자 노드는 게시 세트에서 복제될 테이블을 정의합니다.

  • 구독자 노드는 게시자로부터 WAL 업데이트를 받는 Aurora PostgreSQL DB 클러스터입니다. 구독자는 구독을 생성하여 게시자에 연결하고 디코딩된 WAL 데이터를 얻습니다. 구독자가 구독을 생성하면 게시자 노드에서 복제 슬롯이 생성됩니다.

아래에서 pglogical 확장 설정 관련 정보를 확인할 수 있습니다.

plogical 확장에 대한 요구 사항 및 제한

현재 사용 가능한 모든 Aurora PostgreSQL 릴리스는 pglogical 확장을 지원합니다.

게시자 노드와 구독자 노드 모두가 논리적 복제를 할 수 있도록 설정되어야 합니다.

구독자에서 게시자로 복제할 테이블은 이름과 스키마가 동일해야 합니다. 또한 이러한 테이블은 동일한 열을 포함해야 하며, 각 열은 동일한 데이터 유형을 사용해야 합니다. 게시자와 구독자 테이블 모두 프라이머리 키가 동일해야 합니다. PRIMARY KEY만 고유 제약 조건으로 사용하는 것이 좋습니다.

구독자 노드의 테이블에는 CHECK 제약 조건 및 NOT NULL 제약 조건에 대해 게시자 노드의 테이블에 있는 것보다 더 많은 허용 제약 조건이 존재할 수 있습니다.

pglogical 확장은 PostgreSQL(버전 10 이상)에 내장된 논리적 복제 기능에서는 지원하지 않는 양방향 복제 같은 기능을 제공합니다. 자세한 내용은 pglogical을 사용한 PostgreSQL 양방향 복제를 참조하십시오.

pglogical 확장 설정

Aurora PostgreSQL DB 클러스터pglogical 확장을 설정하려면 Aurora PostgreSQL DB 클러스터용 사용자 지정 DB 클러스터 파라미터 그룹의 공유 라이브러리에 pglogical을 추가해야 합니다. 논리적 디코딩을 켜려면 rds.logical_replication 파라미터의 값을 1로 설정해야 합니다. 마지막으로, 데이터베이스에서 확장을 만듭니다. 이러한 작업에는 AWS Management Console 또는 AWS CLI를 사용할 수 있습니다.

이러한 작업을 수행하려면 rds_superuser 역할의 권한이 있어야 합니다.

다음 단계에서는 사용자의 Aurora PostgreSQL DB 클러스터가 사용자 지정 DB 클러스터에 연결되어 있다고 가정합니다. 사용자 지정 DB 클러스터 파라미터 그룹을 만드는 방법에 관한 자세한 내용은 파라미터 그룹 작업 섹션을 참조하세요.

pglogical 확장 설정 방법
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 선택합니다.

  3. Aurora PostgreSQL DB 클러스터 라이터 인스턴스구성 탭을 엽니다. 인스턴스 세부 정보 중에서 파라미터 그룹 링크를 찾습니다.

  4. 링크를 선택하여 Aurora PostgreSQL DB 클러스터와 연결된 사용자 지정 파라미터를 엽니다.

  5. 파라미터 검색 필드에 shared_pre를 입력하여 shared_preload_libraries 파라미터를 찾습니다.

  6. 파라미터 편집을 선택하여 속성 값에 액세스합니다.

  7. 필드의 목록에 pglogical를 추가합니다. 쉼표를 사용하여 값 목록에서 항목을 구분합니다.

    pglogical이 추가된 shared_preload_libraries 파라미터 이미지.
  8. rds.logical_replication 파라미터를 찾아 1로 설정하여 논리적 복제를 켭니다.

  9. Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 파라미터 변경 사항이 적용되게 합니다.

  10. 인스턴스를 사용할 수 있다면 psql(또는 pgAdmin)을 사용하여 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 연결할 수 있습니다.

    psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  11. plogical이 초기화되었는지 확인하려면 다음 명령을 실행합니다.

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pglogical (1 row)
  12. 논리적 디코딩을 활성화하는 설정을 다음과 같이 확인합니다.

    SHOW wal_level; wal_level ----------- logical (1 row)
  13. 다음과 같이 확장을 생성합니다.

    CREATE EXTENSION pglogical; EXTENSION CREATED
  14. 변경 사항 저장을 선택합니다.

  15. https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  16. 데이터베이스 목록에서 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 선택한 다음, 작업 메뉴에서 재부팅을 선택합니다.

plogical 확장 설정 방법

AWS CLI를 사용하여 pglogical을 설정하려면 다음 절차와 같이 modify-db-parameter-group 작업을 호출하여 사용자 지정 파라미터 그룹의 특정 파라미터를 수정합니다.

  1. 다음 AWS CLI 명령을 사용하여 shared_preload_libraries 파라미터에 pglogical를 추가합니다.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pglogical,ApplyMethod=pending-reboot" \ --region aws-region
  2. 다음 AWS CLI 명령을 사용하여 rds.logical_replication1로 설정하여 Aurora PostgreSQL DB 클러스터터의 라이터 인스턴스용 논리적 디코딩 기능을 켭니다.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.logical_replication,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  3. 다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 pglogical 라이브러리가 초기화되도록 합니다.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  4. 인스턴스를 사용할 수 있다면 psql을 사용하여 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 연결합니다.

    psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  5. 다음과 같이 확장을 생성합니다.

    CREATE EXTENSION pglogical; EXTENSION CREATED
  6. 다음 AWS CLI 명령으로 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅합니다.

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region

Aurora PostgreSQL DB 클러스터용 논리적 복제 설정

다음 절차는 Aurora PostgreSQL DB 클러스터 간에 논리적 복제를 시작하는 방법을 보여줍니다. 다음 단계에서는 원본(게시자)과 대상(구독자) 모두에 pglogical 확장 설정에서 설명하는 방법에 따라 pglogical 확장이 설정되어 있다고 가정합니다.

게시자 노드를 생성하고 복제할 테이블을 정의하는 방법

이 단계에서는 Aurora PostgreSQL DB 클러스터에 라이터 인스턴스와 데이터베이스가 하나씩 있고 이러한 데이터베이스에는 다른 노드에 복제할 하나 이상의 테이블이 있다고 가정합니다. 구독자의 테이블 구조를 게시자에서 다시 만들어야 하므로, 필요한 경우 먼저 테이블 구조를 가져와야 합니다. 이렇게 하려면 psq1 메타 명령을 사용한 다음 구독자 인스턴스에서 동일한 테이블을 생성해야 합니다. 다음 절차에서는 시연을 위해 게시자(원본)에서 예제 테이블을 만듭니다.

  1. psql을 사용하여 구독자용 소스로 사용할 테이블이 있는 인스턴스에 연결합니다.

    psql --host=source-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb

    복제하려는 기존 테이블이 없는 경우 다음과 같이 샘플 테이블을 생성할 수 있습니다.

    1. 다음 SQL 문을 사용하여 예제 테이블을 생성합니다.

      CREATE TABLE docs_lab_table (a int PRIMARY KEY);
    2. 다음 SQL 문을 사용하여 테이블에 생성된 데이터를 입력합니다.

      INSERT INTO docs_lab_table VALUES (generate_series(1,5000)); INSERT 0 5000
    3. 다음 SQL 문을 사용하여 테이블에 데이터가 있는지 확인합니다.

      SELECT count(*) FROM docs_lab_table;
  2. 다음과 같이 이 Aurora PostgreSQL DB 클러스터를 게시자 노드로 식별합니다.

    SELECT pglogical.create_node( node_name := 'docs_lab_provider', dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 dbname=labdb'); create_node ------------- 3410995529 (1 row)
  3. 복제할 테이블을 기본 복제 세트에 추가합니다. 복제 세트에 대한 자세한 내용은 pglogical 설명서의 복제 세트를 참조하십시오.

    SELECT pglogical.replication_set_add_table('default', 'docs_lab_table', 'true', NULL, NULL); replication_set_add_table --------------------------- t (1 row)

게시자 노드 설정이 완료되었습니다. 이제 게시자로부터 업데이트를 수신하도록 구독자 노드를 설정할 수 있습니다.

구독자 노드를 설정하고, 업데이트를 수신할 구독을 만드는 방법

이 단계에서는 Aurora PostgreSQL DB 클러스터pglogical 확장을 이용해 설정되었다고 가정합니다. 자세한 내용은 pglogical 확장 설정 섹션을 참조하세요.

  1. psql을 사용하여 게시자로부터 업데이트를 수신할 인스턴스에 연결합니다.

    psql --host=target-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. 구독자 Aurora PostgreSQL DB 클러스터 에서 게시자에 존재하는 것과 동일한 테이블을 만듭니다. 이 예제에서 테이블은 docs_lab_table입니다. 다음과 같이 테이블을 만들 수 있습니다.

    CREATE TABLE docs_lab_table (a int PRIMARY KEY);
  3. 이 테이블이 비어 있는지 확인합니다.

    SELECT count(*) FROM docs_lab_table; count ------- 0 (1 row)
  4. 다음과 같이 이 Aurora PostgreSQL DB 클러스터를 구독자 노드로 식별합니다.

    SELECT pglogical.create_node( node_name := 'docs_lab_target', dsn := 'host=target-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=********'); create_node ------------- 2182738256 (1 row)
  5. 구독을 생성합니다.

    SELECT pglogical.create_subscription( subscription_name := 'docs_lab_subscription', provider_dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=*******', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' ); create_subscription --------------------- 1038357190 (1 row)

    이 단계를 완료하면 게시자 테이블의 데이터가 구독자 테이블에서 생성됩니다. 다음 SQL 쿼리를 사용하면 이 문제가 발생했는지 확인할 수 있습니다.

    SELECT count(*) FROM docs_lab_table; count ------- 5000 (1 row)

이 시점 이후로는 게시자의 테이블에 적용한 변경 사항이 구독자의 테이블에 복제됩니다.

메이저 업그레이드 후 논리적 복제 재설정

논리적 복제용 게시자 노드로 설정된 Aurora PostgreSQL DB 클러스터 의 메이저 버전 업그레이드를 수행하려면, 먼저 활성화되지 않는 슬롯을 포함한 모든 복제 슬롯을 삭제해야 합니다. 게시자 노드에서 데이터베이스 트랜잭션을 일시적으로 전환하고, 복제 슬롯을 삭제하고, Aurora PostgreSQL DB 클러스터를 업그레이드한 다음 복제를 다시 설정하고 재시작하는 것이 좋습니다.

복제 슬롯은 게시자 노드에서만 호스팅됩니다. 논리적 복제 시나리오에서 Aurora PostgreSQL 구독자 노드는 삭제할 슬롯이 없습니다. Aurora PostgreSQL 메이저 버전 업그레이드 프로세스에서는 게시자 노드와 별개로 구독자를 PostgreSQL의 새 메이저 버전으로 업그레이드할 수 있습니다. 그러나 업그레이드 프로세스를 진행하면 복제 프로세스가 중단되고 게시자 노드와 구독자 노드 간의 WAL 데이터 동기화가 간섭을 받습니다. 게시자나 구독자 또는 둘 항목 모두를 업그레이드한 후에는 게시자와 구독자 간의 논리적 복제를 다시 설정해야 합니다. 다음 절차에서는 복제가 중단되었는지 판단하는 방법과 문제를 해결하는 방법을 확인할 수 있습니다.

논리적 복제가 중단되었는지 확인

다음과 같이 게시자 노드 또는 구독자 노드를 쿼리하면 복제 프로세스 중단 여부를 확인할 수 있습니다.

게시자 노드를 확인하는 방법
  • psql을 사용하여 게시자 노드에 연결한 다음 pg_replication_slots 함수를 쿼리합니다. 활성 열의 값을 기록해 둡니다. 일반적으로 이 값은 t(true)를 반환하며, 복제가 활성 상태라는 뜻입니다. 쿼리가 f(false)를 반환한다면 구독자로의 복제가 중단되었다는 뜻입니다.

    SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots; slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_labcb4fa94_docs_lab3de412c | pglogical_output | logical | f (1 row)
구독자 노드를 확인하는 방법

구독자 노드에서는 세 가지 방법으로 복제 상태를 확인할 수 있습니다.

  • 구독자 노드의 PostgreSQL 로그를 확인하여 실패 메시지를 찾습니다. 로그는 다음과 같이 종료 코드 1을 포함하는 메시지를 이용해 실패를 식별합니다.

    2022-07-06 16:17:03 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 14610) exited with exit code 1 2022-07-06 16:19:44 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 21783) exited with exit code 1
  • pg_replication_origin 함수를 쿼리합니다. 다음과 같이 psql을 사용하여 구독자 노드의 데이터베이스에 연결하고 pg_replication_origin 함수를 쿼리합니다.

    SELECT * FROM pg_replication_origin; roident | roname ---------+-------- (0 rows)

    결과 집합이 비어 있다면 복제가 중단되었다는 뜻입니다. 일반적인 출력은 다음과 같습니다.

    roident | roname ---------+---------------------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
  • 다음 예제와 같이 pglogical.show_subscription_status 함수를 쿼리합니다.

    SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status(); subscription_name | status | slot_name ---====----------------+--------+------------------------------------- docs_lab_subscription | down | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)

    이 출력은 복제가 중단되었음을 보여줍니다. 상태는 down입니다. 일반적으로 출력에서는 상태가 replicating으로 표시됩니다.

논리적 복제 프로세스가 중단된 경우 다음 단계에 따라 복제를 재설정할 수 있습니다.

게시자와 구독자 노드 간의 논리적 복제를 재설정하는 방법

복제를 다시 설정하려면 먼저 게시자 노드에서 구독자의 연결을 끊은 다음, 다음 단계의 설명에 따라 구독을 다시 설정합니다.

  1. 다음과 같이 psql을 사용하여 구독자 노드에 연결합니다.

    psql --host=222222222222.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. pglogical.alter_subscription_disable 함수를 사용하여 구독을 비활성화합니다.

    SELECT pglogical.alter_subscription_disable('docs_lab_subscription',true); alter_subscription_disable ---------------------------- t (1 row)
  3. 다음과 같이 pg_replication_origin을 쿼리하여 게시자 노드의 식별자를 가져옵니다.

    SELECT * FROM pg_replication_origin; roident | roname ---------+------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
  4. 이전 단계의 응답을 pg_replication_origin_create 명령과 함께 사용하여, 구독을 다시 설정할 때 사용할 수 있는 식별자를 할당합니다.

    SELECT pg_replication_origin_create('pgl_labdb_docs_labcb4fa94_docs_lab3de412c'); pg_replication_origin_create ------------------------------ 1 (1 row)
  5. 다음 예제와 같이 구독의 이름을 true 상태로 전달하여 구독을 활성화합니다.

    SELECT pglogical.alter_subscription_enable('docs_lab_subscription',true); alter_subscription_enable --------------------------- t (1 row)

노드의 상태를 확인합니다. 노드의 상태는 이 예제에서처럼 replicating이어야 합니다.

SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status(); subscription_name | status | slot_name -------------------------------+-------------+------------------------------------- docs_lab_subscription | replicating | pgl_labdb_docs_lab98f517b_docs_lab3de412c (1 row)

게시자 노드에서 구독자 복제 슬롯의 상태를 확인합니다. 슬롯의 active 열은 t(true)를 반환해야 하며, 복제가 다시 설정되었다는 뜻입니다.

SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots; slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_lab98f517b_docs_lab3de412c | pglogical_output | logical | t (1 row)

Aurora PostgreSQL용 논리적 복제 슬롯 관리

논리적 복제 시나리오에서 게시자 노드 역할을 하는 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스 의 메이저 버전 업그레이드를 수행하려면, 먼저 인스턴스에서 복제 슬롯을 삭제해야 합니다. 메이저 버전 업그레이드 사전 점검 프로세스에서는 업그레이드를 진행하려면 슬롯을 삭제해야 한다는 메시지가 표시됩니다.

pglogical 확장을 사용하여 만든 복제 슬롯을 식별하려면 각 데이터베이스에 로그인하여 노드 이름을 확인하십시오. 구독자 노드를 쿼리하면 이 예제에서처럼 출력에 게시자와 구독자 노드가 모두 표시됩니다.

SELECT * FROM pglogical.node; node_id | node_name ------------+------------------- 2182738256 | docs_lab_target 3410995529 | docs_lab_provider (2 rows)

다음 쿼리를 사용하면 구독 세부 정보를 확인할 수 있습니다.

SELECT sub_name,sub_slot_name,sub_target FROM pglogical.subscription; sub_name | sub_slot_name | sub_target ----------+--------------------------------+------------ docs_lab_subscription | pgl_labdb_docs_labcb4fa94_docs_lab3de412c | 2182738256 (1 row)

이제 다음과 같이 구독을 삭제할 수 있습니다.

SELECT pglogical.drop_subscription(subscription_name := 'docs_lab_subscription'); drop_subscription ------------------- 1 (1 row)

구독을 삭제한 후에는 노드를 삭제해도 됩니다.

SELECT pglogical.drop_node(node_name := 'docs-lab-subscriber'); drop_node ----------- t (1 row)

다음과 같은 방법을 이용해 노드가 더 이상 존재하지 않는지 확인할 수 있습니다.

SELECT * FROM pglogical.node; node_id | node_name ---------+----------- (0 rows)

plogical 확장용 파라미터 참조

표에서는 pglogical 확장과 관련된 파라미터를 확인할 수 있습니다. pglogical.conflict_log_levelpglogical.conflict_resolution 같은 파라미터는 업데이트 충돌을 처리하는 용도로 사용합니다. 게시자의 변경 사항을 구독한 테이블과을 로컬로 변경하면 충돌이 발생할 수 있습니다. 양방향 복제 또는 동일한 게시자로부터 여러 구독자를 복제하는 경우를 비롯한 다양한 시나리오에서도 충돌이 발생할 수 있습니다. 자세한 내용은 pglogical을 사용한 PostgreSQL 양방향 복제를 참조하십시오.

파라미터 설명

pglogical.batch_inserts

가능한 경우 배치를 삽입합니다. 기본적으로는 설정되지 않습니다. 켜려면 '1'로 변경하고 해제하려면 '0'으로 변경합니다.

pglogical.conflict_log_level

해결된 충돌을 로깅하는 데 사용할 로그 수준을 설정합니다. 지원되는 문자열 값은 debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal 및 panic입니다.

pglogical.conflict_resolution

해결할 수 있는 충돌인 경우 충돌을 해결하는 데 사용할 메서드를 설정합니다. 지원되는 문자열 값은 error, apply_remote, keep_local, last_update_wins 및 first_update_wins입니다.

pglogical.extra_connection_options

모든 피어 노드 연결에 추가할 연결 옵션입니다.

pglogical.synchronous_commit

pglogical 특정 동기 커밋 값입니다.

pglogical.use_spi

하위 수준 API 대신 SPI(서버 프로그래밍 인터페이스)를 사용하여 변경 사항을 적용합니다. 켜려면 '1'로 설정하고 해제하려면 '0'으로 설정합니다. SPI에 대한 자세한 내용은 PostgreSQL 설명서의 서버 프로그래밍 인터페이스를 참조하십시오.