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

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

논리적 복제용 게시자 노드로 설정된 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)