PostgreSQL-17에서 페일오버 슬롯 설정하기

PostgreSQL 17은 고가용성 설정을 향상시키는 failover 슬롯을 소개합니다. 복제 슬롯은 복제 중에 노드 간 데이터를 신뢰할 수 있고 일관되게 유지하도록 보장하며, failover 슬롯은 특히 failover 중 및 이후에 노드 간 일관성을 보장합니다.

Failover 슬롯은 논리적 복제가 승격 서버로의 failover 이후에도 원활하게 계속될 수 있도록 보장하는 강력한 기능입니다. Failover 슬롯을 사용하면 논리적 복제 슬롯을 주 서버와 스탠바이 노드 간에 자동으로 동기화할 수 있어 downtime을 크게 줄이고 failover 중 수동 개입이 필요한 경우를 없앨 수 있습니다.

이 안내서에서는 새로운 failover 슬롯 기능을 사용하여 고가용성 PostgreSQL 클러스터를 설정하는 방법을 안내합니다. 마지막에는 failover를 원활하게 처리할 수 있는 견고한 복제 설정이 마련될 것입니다.

역사적 관점에서 Failover 슬롯의 중요성

PostgreSQL 15에서의 과제

  • 주 서버에 연결된 복제 슬롯: PostgreSQL 15에서는 복제 슬롯이 주 서버에만 생성되었습니다. 주 서버가 실패하면 모든 논리적 복제 슬롯이 손실되어 중요한 복제 지연과 데이터 손실을 야기했습니다.
  • 수동 Failover 관리: failover 시나리오에서 관리자는 새로운 주 서버에서 복제 슬롯을 수동으로 다시 생성해야 했으며, 이는 복잡성을 증가시키고 오류를 발생시키며 downtime을 연장시켰습니다.
  • 슬롯 동기화 없음: 대기 서버는 기본 서버의 논리 복제 슬롯에 대해 알 방법이 없었습니다. 이러한 동기화 부족은 장애 조치가 발생할 경우 복제 스트림이 완전히 초기화되는 결과를 초래했습니다.

PostgreSQL 16의 개선 사항

최소 논리 디코딩

PostgreSQL 16은 대기 서버에서 최소 논리 디코딩이라는 기능을 도입했습니다:

  • 대기에서의 최소 디코딩: 이를 통해 대기 서버는 WAL 로그를 디코딩하여 논리 복제를 준비할 수 있게 되었으며, 장애 조치가 발생할 경우 사용할 수 있도록 미리 준비된 슬롯을 활성화했습니다.
  • 더 빠른 장애 조치: 대기에서 WAL 변경 사항을 미리 디코딩함으로써 대기를 기본으로 승격할 때 복제 지연을 줄일 수 있었습니다. 그러나 이는 여전히 원활한 장애 조치를 보장하기 위한 수동 설정이 필요했습니다.

PostgreSQL 17: 게임 체인저 – 장애 조치 슬롯

  • 장애 조치 슬롯: PostgreSQL 17에 장애 조치 슬롯을 도입함으로써 기본 및 대기 서버 간의 논리 복제 슬롯을 자동으로 동기화하여 수동 개입의 필요성을 없앴습니다.
  • 자동 동기화: 새로운 슬롯 동기화 작업자는 장애 조치가 가능하도록 설정된 슬롯(failover = true)이 기본 노드가 활성화되어 있는 동안에도 항상 동기화되도록 보장합니다.
  • 신속한 전환: 장애 조치 시, 대기 서버가 주 서버로 전환될 수 있고 복제 슬롯을 잃지 않아 데이터 손실이 없고 지속적인 복제가 보장됩니다.

기능

PostgreSQL 15

PostgreSQL 16

PostgreSQL 17

논리 복제

자동 슬롯 동기화

아니오

대기 서버에서의 최소 논리 디코딩

전체 장애 조치 슬롯

장애 조치 처리

수동 개입 필요

대기 서버에 사전 준비된 슬롯

자동 장애 조치 슬롯

슬롯 동기화 대기 서버로

지원되지 않음

최소한의 구성 필요

슬롯 동기화 작업자를 통한 자동화

논리 복제를 위한 고가용성

제한적

최소한의 디코딩으로 개선됨

페일오버 슬롯과 원활하게 통합

페일오버 슬롯을 이용한 고가용성 클러스터 생성

이 섹션에서는 페일오버 슬롯을 사용하여 PostgreSQL 고가용성 클러스터를 만드는 방법을 안내합니다. 예제에서는 다음 노드를 사용할 것입니다:

  1. NodeA (기본 서버)
  2. NodeB (물리적 대기)
  3. NodeC (논리적 구독자)

사전 요구 사항

시작하기 전에 다음이 준비되어 있는지 확인하십시오:

  • 세 노드 모두에 PostgreSQL 17이 설치되어 있어야 합니다.
  • 각 노드 간의 비밀번호 없는 SSH 접근.
  • PostgreSQL, PostgreSQL 복제, 및 PostgreSQL 구성 파일에 대한 기본 이해.

1단계: 기본 노드(NodeA) 구성

1.1 NodeA에서 클러스터 초기화하기

기본 노드에 PostgreSQL을 설치한 후, 클러스터를 초기화합니다; 다음 명령어를 사용할 수 있습니다:

Shell

 

1.2 postgresql.conf 파일에서 복제 구성하기

클러스터를 초기화한 후, 기본적으로 /home/pgedge/nodeA/postgresql.conf에 위치한 postgresql.conf 파일을 편집합니다. 다음 매개변수 값을 설정합니다:

Shell

 

1.3 복제 접근을 허용하는 pg_hba.conf 파일 업데이트하기

pg_hba.conf 파일은 PostgreSQL 서버의 클라이언트 인증을 관리합니다. 복제 사용자에 대한 접근을 보장하기 위해 /home/pgedge/nodeA/pg_hba.conf에 다음 항목을 추가합니다:

Shell

 

그런 다음, 구성을 다시 로드합니다:

Shell

 

1.4 복제 사용자 생성하기

그런 다음, PostgreSQL에 로그인하여 복제 사용자를 생성합니다:

Shell

 

SQL

 

1.5 테이블 생성 및 게시 설정하기

다음으로, 테이블을 생성하고 관련 게시물을 생성해야 합니다:

SQL

 

2단계: 물리적 대기(NodeB) 구성하기

2.1 NodeB 초기화하기

PostgreSQL을 설치한 후, NodeB를 초기화합니다:

Shell

 

2.1 기본 백업 생성하기

그런 다음, pg_basebackup을 사용하여 클러스터의 백업을 수행합니다:

Shell

 

2.2 Node-B에서 postgresql.conf 구성하기

postgresql.conf 파일을 수정하세요(위치: /home/pgedge/nodeB/postgresql.conf), 다음을 설정하세요:

Shell

 

2.3 장애 조치 슬롯 동기화 활성화

psql 클라이언트를 사용하여 NodeB에 로그인합니다:

Shell

 

그런 다음, NodeB에 대한 복제를 구성하기 위해 다음 문을 사용하세요:

SQL

 

psql 클라이언트를 종료하고 NodeB를 다시 시작하세요:

Shell

 

2.4 슬롯 동기화 확인

그런 다음, psql을 사용하여 NodeB에 다시 연결하고 슬롯이 동기화되었는지 확인하세요:

SQL

 

단계 3: 논리 구독자(NodeC) 설정

3.1 클러스터 초기화 및 NodeC 구성

PostgreSQL을 설치한 후, 클러스터를 초기화하세요; 다음 명령을 사용할 수 있습니다:

Shell

 

그런 다음, 다음 매개변수 값을 설정한 /home/pgedge/nodeC/postgresql.conf 파일을 편집하세요:

Shell

 

3.2 NodeC에 구독 생성

NodeC에 구독을 생성하려면 다음 명령을 사용하세요:

Shell

 

단계 4: 장애 조치 시뮬레이션 및 연속성 보장

다음 명령을 사용하여 장애 조치를 시뮬레이션하고 복제가 계속되고 데이터 무결성이 유지되는지 확인할 수 있습니다.

4.1 장애 조치 시뮬레이션

NodeA의 장애를 시뮬레이션하고, 이어서 NodeB의 스탠바이에서 프라이머리로의 승격을 시뮬레이션하려면 다음 명령을 사용하세요:

Shell

 

NodeC에서 구독 업데이트

NodeB를 홍보한 후에는 NodeC에 로그인하여 연결을 업데이트하여 NodeB가 이제 주 노드임을 반영하십시오:

SQL

 

4.3 데이터 연속성 확인

복제를 테스트하려면 psql을 사용하여 주 노드인 Node-B에 로그인하십시오:

SQL

 

Node-C에서 복제 확인:

SQL

 

결론

PostgreSQL 17의 장애 조치 슬롯 기능을 통해 논리적 복제 환경에서 신속한 장애 조치가 가능합니다. 이 안내서에 나와 있는 단계를 따라 하면 주 서버 장애가 발생해도 데이터 흐름이 중단되지 않는 고가용성 클러스터를 생성할 수 있습니다.

구성을 최적화하고 PostgreSQL 17의 새로운 기능을 활용하여 중요한 응용 프로그램을 위한 견고하고 효율적인 데이터베이스 인프라를 구축할 수 있습니다.

Source:
https://dzone.com/articles/setting-up-failover-slots-in-postgresql-17