데이터베이스 복제
김상기
이 장에서는 PostgreSQL 데이터베이스 서버를 복제하는 방법과 데이터베이스 운영자 시각에서의 모니터링, 응용 프로그램 개발자 시각에서의 복제 환경 데이터베이스 서버를 이용하는 방법, 시스템 관리자 시각에서의 고가용성까지 다룬다.
여기서 소개하는 각 데이터베이스 서버에 대한 용어 정리부터 한다.
- 운영 서버 Active Server: 서비스를 제공하는 응ᅟ용 프로그램이 접속 가능한 서버
- 대기 서버 Standby Server: 운영 서버 장애시 운영 서버를 대체 하기 위한 용도로 대기 하는 서버, 이 서버는 응용 프로그램이 접속 가능할 수도 있고 (읽기 전용 Select Only 보조 서버), 접속이 불가능할 수도 있다(순수 대기 서버)
- 주 서버 Master Server: 스트리밍 복제 관점에서 트랜잭션 로그(Write Ahead Log 이하 WAL)를 전달 해 주는 서버 (송신 서버)
- 보조 서버 Slave Server: 스트리밍 복제 관점에서 WAL를 전달 받는 서버 (수신 서버), 현재 PostgreSQL 물리적 WAL 스트리밍 복제 기법에서는 이 서버는 읽기 전용 서버가 된다.
복제 기법 소개
운영 서버의 자료를 또 다른 서버에 동기화 하는 것을 복제 Replication이라 한다. WAL 로그를 복제 대상 서버로 보내고 그것을 재실행 해서 자료를 동기화 하는 기법이다.
WAL 그대로 전달하는 물리적 복제와 WAL를 플러그인을 통해서 논리적으로 디코딩 해서 전달하는 논리적 복제로 나뉜다. 전자는 일반적으로 WAL 스트리밍 복제라고 하며, 후자는 논리적 디코딩을 이용한 복제라고 한다.
WAL 물리적 스트리밍 복제
WAL 물리적 스트리밍 복제는 다음과 같은 한계점을 가진다.
- 주 서버와 보조 서버의 하드웨어 아키텍쳐, OS, PostgreSQL 버전까지 모두 같아야 한다.
- 보조 서버에서는 오직 select 쿼리만 실행할 수 있다.
- 비동기식 복제인 경우 주 서버와 보조 서버간 자료 불일치가 있을 수 있다.
구축 방법
주 서버 사전 준비
보조 서버를 pg_basebackup 명령으로 구축하려면, 먼저 주 서버의 postgresql.conf 파일과 pg_hba.conf파일에 다음 설정을 해야 한다. 또한 여기서 구축하는 방법에서는 복제 슬롯을 이용해서 주 서버가 보관해야할 아직 전송하지 않은 WAL 를 모두 보관하는 방식을 택했다.postgresql.conf 설정값 변경 사항
wal_level = replica #(또는 logical) (이 값을 바꾼다면 주 서버를 재실행해야 한다.) max_wal_senders = 5 #(보조 서버 수보다 2~3 여유를 더 두는 것이 좋다, 이 설정도 서버 재실행이 필요함) max_replication_slots = 5 #(max_wal_senders 값과 같게, 이 설정도 서버 재실행이 필요함) track_commit_timestamp = on hot_standby = on #(복사될 postgresql.conf 파일 수정 최소화를 위해 미리 지정해 둔다) max_standby_streaming_delay = -1 #(자료 차이가 나도 끝까지 포기하지 않는다) hot_standby_feedback = on
pg_hba.conf 설정 추가 사항
host replication postgres 192.168.0.10/32 trust #(보조서버 IP와 인증 방법 지정)
대부분의 설정이 주 서버 재시작을 해야 반영되는 것이기 때문에, 이런 WAL 스트리밍 복제 기능을 염두해 두고 서버를 구축한다면, 미리 설정을 바꾸어 놓는 것이 좋을 것이다.
주 서버 재시작보조 서버 구축
보조 서버 실행
테스트