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 고가용성 클러스터를 만드는 방법을 안내합니다. 예제에서는 다음 노드를 사용할 것입니다:
- NodeA (기본 서버)
- NodeB (물리적 대기)
- NodeC (논리적 구독자)
사전 요구 사항
시작하기 전에 다음이 준비되어 있는지 확인하십시오:
- 세 노드 모두에 PostgreSQL 17이 설치되어 있어야 합니다.
- 각 노드 간의 비밀번호 없는 SSH 접근.
- PostgreSQL, PostgreSQL 복제, 및 PostgreSQL 구성 파일에 대한 기본 이해.
1단계: 기본 노드(NodeA) 구성
1.1 NodeA에서 클러스터 초기화하기
기본 노드에 PostgreSQL을 설치한 후, 클러스터를 초기화합니다; 다음 명령어를 사용할 수 있습니다:
mkdir -p /home/pgedge/nodeA
initdb -D /home/pgedge/nodeA --no-locale -E UTF8
pg_ctl -D /home/pgedge/nodeA -l /home/pgedge/logs/nodeA.log start
1.2 postgresql.conf 파일에서 복제 구성하기
클러스터를 초기화한 후, 기본적으로 /home/pgedge/nodeA/postgresql.conf
에 위치한 postgresql.conf
파일을 편집합니다. 다음 매개변수 값을 설정합니다:
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10
synchronous_standby_names = '*'
synchronized_standby_slots = 'sb1_slot'
port = 5432
1.3 복제 접근을 허용하는 pg_hba.conf 파일 업데이트하기
pg_hba.conf 파일은 PostgreSQL 서버의 클라이언트 인증을 관리합니다. 복제 사용자에 대한 접근을 보장하기 위해 /home/pgedge/nodeA/pg_hba.conf
에 다음 항목을 추가합니다:
host replication replicator 127.0.0.1/32 md5
그런 다음, 구성을 다시 로드합니다:
pg_ctl -D /home/pgedge/nodeA reload
1.4 복제 사용자 생성하기
그런 다음, PostgreSQL에 로그인하여 복제 사용자를 생성합니다:
psql -d postgres -p 5432
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replicator_password';
1.5 테이블 생성 및 게시 설정하기
다음으로, 테이블을 생성하고 관련 게시물을 생성해야 합니다:
CREATE TABLE foo (c1 INT PRIMARY KEY);
GRANT SELECT ON foo TO replicator;
CREATE PUBLICATION mypub FOR TABLE foo;
2단계: 물리적 대기(NodeB) 구성하기
2.1 NodeB 초기화하기
PostgreSQL을 설치한 후, NodeB를 초기화합니다:
mkdir -p /home/pgedge/nodeB
initdb -D /home/pgedge/nodeB --no-locale -E UTF8
pg_ctl -D /home/pgedge/nodeB -l /home/pgedge/logs/nodeB.log start
2.1 기본 백업 생성하기
그런 다음, pg_basebackup을 사용하여 클러스터의 백업을 수행합니다:
mkdir -p /home/pgedge/nodeB
pg_basebackup -D /home/pgedge/nodeB -R -X stream -P -h localhost -p 5432 -U replicator
2.2 Node-B에서 postgresql.conf 구성하기
postgresql.conf
파일을 수정하세요(위치: /home/pgedge/nodeB/postgresql.conf
), 다음을 설정하세요:
port = 5433
primary_conninfo = 'host=localhost port=5432 user=replicator password=replicator_password dbname=postgres application_name=sb1_slot'
primary_slot_name = 'sb1_slot'
hot_standby_feedback = on
sync_replication_slots = on
2.3 장애 조치 슬롯 동기화 활성화
psql 클라이언트를 사용하여 NodeB에 로그인합니다:
psql -d postgres -p 5433
그런 다음, NodeB에 대한 복제를 구성하기 위해 다음 문을 사용하세요:
ALTER SYSTEM SET sync_replication_slots = on;
ALTER SYSTEM SET hot_standby_feedback = on;
ALTER SYSTEM SET synchronized_standby_slots = 'sb1_slot';
psql
클라이언트를 종료하고 NodeB를 다시 시작하세요:
pg_ctl -D /home/pgedge/nodeB restart
2.4 슬롯 동기화 확인
그런 다음, psql
을 사용하여 NodeB에 다시 연결하고 슬롯이 동기화되었는지 확인하세요:
SELECT slot_name, failover, synced FROM pg_replication_slots;
단계 3: 논리 구독자(NodeC) 설정
3.1 클러스터 초기화 및 NodeC 구성
PostgreSQL을 설치한 후, 클러스터를 초기화하세요; 다음 명령을 사용할 수 있습니다:
mkdir -p /home/pgedge/nodeC
initdb -D /home/pgedge/nodeC --no-locale -E UTF8
그런 다음, 다음 매개변수 값을 설정한 /home/pgedge/nodeC/postgresql.conf
파일을 편집하세요:
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10
sync_replication_slots = on
port = 5444
After editing the configuration file, start NodeC:
pg_ctl -D /home/pgedge/nodeC -l /home/pgedge/logs/nodeC.log start
3.2 NodeC에 구독 생성
NodeC에 구독을 생성하려면 다음 명령을 사용하세요:
CREATE SUBSCRIPTION foosub CONNECTION 'dbname=postgres host=localhost port=5432 user=replicator password=replicator_password' PUBLICATION mypub WITH (failover = true);
단계 4: 장애 조치 시뮬레이션 및 연속성 보장
다음 명령을 사용하여 장애 조치를 시뮬레이션하고 복제가 계속되고 데이터 무결성이 유지되는지 확인할 수 있습니다.
4.1 장애 조치 시뮬레이션
NodeA의 장애를 시뮬레이션하고, 이어서 NodeB의 스탠바이에서 프라이머리로의 승격을 시뮬레이션하려면 다음 명령을 사용하세요:
pg_ctl -D /home/pgedge/nodeA stop
pg_ctl -D /home/pgedge/nodeB promote
NodeC에서 구독 업데이트
NodeB를 홍보한 후에는 NodeC에 로그인하여 연결을 업데이트하여 NodeB가 이제 주 노드임을 반영하십시오:
ALTER SUBSCRIPTION foosub DISABLE;
ALTER SUBSCRIPTION foosub CONNECTION 'dbname=postgres host=localhost port=5433 user=replicator password=replicator_password';
ALTER SUBSCRIPTION foosub ENABLE;
4.3 데이터 연속성 확인
복제를 테스트하려면 psql
을 사용하여 주 노드인 Node-B에 로그인하십시오:
INSERT INTO foo VALUES (3), (4);
Node-C에서 복제 확인:
SELECT * FROM foo;
결론
PostgreSQL 17의 장애 조치 슬롯 기능을 통해 논리적 복제 환경에서 신속한 장애 조치가 가능합니다. 이 안내서에 나와 있는 단계를 따라 하면 주 서버 장애가 발생해도 데이터 흐름이 중단되지 않는 고가용성 클러스터를 생성할 수 있습니다.
구성을 최적화하고 PostgreSQL 17의 새로운 기능을 활용하여 중요한 응용 프로그램을 위한 견고하고 효율적인 데이터베이스 인프라를 구축할 수 있습니다.
Source:
https://dzone.com/articles/setting-up-failover-slots-in-postgresql-17