2019년 9월 11일 수요일

PostgreSQL Replication 설정 방법

PostgreSQL Replication 개요

서버 1대로 DB 를 운영 중일때, 만약 서버에 문제가 생기면 서비스를 정작적으로 수행할 수 없게 된다.
이럴 경우를 대비해서 예비 서버를 준비해 놓는다.
문제 발생 시, 예비 서버를 사용해서 서비스를 지속적으로 수행할 수 있도록 해야 한다.
이렇게 하기 위해서는 메인 서버에 갱신되는 DB 의 내용을 예비 서버에도 동일하게 유지시켜 줘야 하는데, 이럴 때 구축하는 것을 replication 이라고 한다.

replication 기능을 내부적으로 가지고 있는 DB 도 있고, 가지고 있지 않은 DB 도 있다.
다행히도 PostgreSQL 에도 replication 이라는 기능을 내부적으로 가지고 있다.

PostgreSQL replication 을 구성하는 방식에는 Log-Shipping, Streaming 2가지 방식이 있다.
  • Log-Shipping 방식은 pg_xlog 디렉토리 안의 WAL 파일 자체를 전달하는 방식이다.
  • Streaming 방식은 로그 내용을 전달하는 방식이다.

PostgreSQL의 Replication 구축

PostgreSQL replication Streaming 방식을 구축하는 과정을 기술해 본다.
  • 메인 서버를 master server 라고 지칭하겠다.
  • 예비 서버를 stand-by server 라고 지칭하겠다.

Master 서버의 postgresql.conf 파일 수정하기

자신에게 맞는 편한 editor 를 사용해서 편집하면 된다. postgresql.conf 에는 여러가지 환경설정 값을 수정할 수 있다.

listen_addresses = '*'
wal_level = replica
max_wal_senders = 2
wal_keep_segments = 32

listen_addresses
  • default 값은 'localhost' 로 되어 있다.접속을 허용하는 ip 주소를 입력하는 항목이다.
  • '*' 의 의미는 외부의 모든 ip 주소의 접속을 허용하겠다는 의미이다.
  • 인증, 권한 관리는 pg_hba.conf 파일에서 진행하면 되므로 '*' 를 입력하자.

wal_level
  • 9.6 이전 버전에서는 archive 와 hot_standby 옵션이 있었다. 지금도 설정 가능하만, relica 와 동일하게 취급된다.WAL 에 기록되는 정보의 양을 결정하는 항목이다.
  • minimal, replica, logical 중 1가지를 선택할 수 있다.
  • default 값은 minimal 로 되어 있다.
  • minimal 은 충돌 또는 즉시 셧다운으로부터 복구하기 위해 필요한 정보만 기록하는 것이다.
  • replica 은 WAL 아카이브에 필요한 로깅과 대기 서버에서 읽기 전용 쿼리에 필요한 정보를 추가한다.
  • logical은 논리적 디코딩을 지원하는 데 필요한 정보를 추가한다.

max_wal_senders
  • master server 에서 postgresql 을 실행하면 생성되는 process 들 중에서,WAL 파일을 전송할 수 있는 최대 서버수를 결정하는 항목이다. default 값은 0 으로 되어 있다.
  • WAL sender 역할을 하는 process 의 갯수를 의미한다.
  • replication 이 실행되면 아래 샘플 화면처럼 sender process 가 실행되어 있는걸 확인할 수 있다. 이때 sender process 개수를 의미한다.
kimchki   10225     1  0 11:23 pts/1    00:00:00 /home/kimchki/postgresql/bin/postgres
kimchki   10227 10225  0 11:23 ?        00:00:00 postgres: checkpointer process
kimchki   10228 10225  0 11:23 ?        00:00:00 postgres: writer process
kimchki   10229 10225  0 11:23 ?        00:00:00 postgres: wal writer process
kimchki   10230 10225  0 11:23 ?        00:00:00 postgres: autovacuum launcher process
kimchki   10231 10225  0 11:23 ?        00:00:00 postgres: stats collector process
kimchki   10243 10225  0 11:23 ?        00:00:00 postgres: wal sender process kimchki 10.0.2.2(58506) streaming 0/F60001E8

wal_keep_segments
  • master server 에 보관할 WAL 파일의 수를 결정하는 항목이다.
  • default 값은 0 으로 되어 있다.
  • WAL 파일의 갯수가 32개가 되었을 때, 33번째 파일이 생성되는것이 아니라, 1번째 WAL 파일부터 다시 overwrite 하게 된다.

max_wal_senders, wal_keep_segments

  • max_wal_senders, wal_keep_segments 는 상황에 맞춰 설정하면 된다.

Master 서버의 pg_hba.conf 파일 수정하기

host    replication     kimchki        0.0.0.0/0            trust
  • kimchki 사용자가 접속할 수 있게 해준다.
  • 주석표시로 되어 있는데, 주석표시를 제거해 준다.
  • 또한, IP 도 0.0.0.0/0 으로 변경해서 모든 IP 를 접속할 수 있게 해준다.

Master 서버의 PostgreSQL 재시작하기

변경된 설정 파일을 적용하기 위해 master 서버의 PostgreSQL을 restart 시킨다.

Stand-by 서버 설정하기

Stand-by 서버 postgresql.conf 파일을 백업해 놓고 postgresql data 폴더 안에 있는 모든 파일을 삭제 한다.
왜냐하면 master 서버 PostgreSQL data 를 가져와야 하기 때문이다. (비우지 않으면 다음 단계에서 해당 디렉토리가 비어있지 않다는 에러 메세지가 나올것이다.)

서버 데이터 복제하기

master 서버 PostgreSQL data 를 stand-by 서버 PostgreSQL에 넣어야 한다. 왜냐하면 현재의 data 상태를 맞춰야 그 다음부터는 log 를 통해 data 를 동기화할 수 있기 때문이다.

pg_basebackup 프로그램을 사용하면 data 를 넣을 수 있다. (running 중인 PostgreSQL data 를 backup 해 주는 역할)

stand-by 서버에 접속한다.

shell 에서 아래 명령어를 수행한다.

% pg_basebackup -h MASTER_IP -[data directory] ---X stream
  • -D 옵션에는 stand-by 서버 PostgreSQL data 를 저장할 디렉토리를 입력한다.-h 옵션에는 master 서버 IP address 를 입력한다. 해당 디렉토리는 비어 있는 디렉토리여야 한다. master 서버 PostgreSQL data 를 통채로 가져올 것이기 때문이다.
  • -v 옵션은 부가적인 정보를 표기해 준다.
  • -P 옵션은 전송 진행 상황을 표기해 준다.
  • -X 옵션은 WAL 도 같이 backup 하라는 옵션이다.
  • stream 방식은 백업이 생성되는 동안 트랜잭션 로그도 같이 한다는 의미이다. 이렇게 하면 서버에 대한 두 번째 연결이 열리고 백업을 실행하는 동안 트랜잭션 로그 스트리밍이 병렬로 시작된다. 따라서 max_wal_senders 매개 변수로 구성된 두 개의 연결을 사용한다.
  • fetch 방식은 트랜잭션 로그 파일은 백업이 끝날 때 수집된다. 따라서 wal_keep_segments 매개 변수를 높게 설정해야 백업이 끝나기 전에 로그가 제거되지 않는다.

pg_basebackup을 수행 후 아래와 같은 결과를 통해 정상적으로 수행되었음을 확인 할 수 있다.

pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
transaction log start point: 0/F7000028 on timeline 1
pg_basebackup: starting background WAL receiver
transaction log end point: 0/F7000130
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed
2569818/2569818 kB (100%), 1/1 tablespace

Stand-by 서버 postgresql.conf 파일 설정

백업해 놓았던, stand-by 서버 postgresql.conf 파일을 PostgreSQL data 디렉토리에 overwrite 한다.
왜냐하면 PostgreSQL data 디렉토리에 있는 postgresql.conf 파일은 master 서버 postgresql.conf 파일이기 때문이다.
stand-by 서버 postgresql.conf 파일을 아래와 같이 수정하여 stand-by 기능을 활성화 시킨다.
hot_standby = on

Stand-by 서버 recovery.conf 설정

postgresql.conf 파일과 같은 경로에 recovery.conf 파일을 새롭게 생성하고 아래 내용을 입력한다.
standby_mode = on
primary_conninfo = 'host=MASTER_IP port=5432 user=kimchki password=password'
stand-by 기능을 활성화 시킨다.
primary_conninfo 에 master 서버 postgresql 정보를 입력한다. 이 정보를 이용해서 master 서버 PostgreSQL에 접속해서 실시간으로 WAL 내용을 전달 받는다.

wal sender 및 receiver process 확인

master 서버에 보면 wal sender process 가 생성된것을 확인할 수 있다.
kimchki   10225     1  0 11:23 pts/1    00:00:00 /home/kimchki/postgresql/bin/postgres
kimchki   10227 10225  0 11:23 ?        00:00:00 postgres: checkpointer process
kimchki   10228 10225  0 11:23 ?        00:00:00 postgres: writer process
kimchki   10229 10225  0 11:23 ?        00:00:00 postgres: wal writer process
kimchki   10230 10225  0 11:23 ?        00:00:00 postgres: autovacuum launcher process
kimchki   10231 10225  0 11:23 ?        00:00:00 postgres: stats collector process
kimchki   10243 10225  0 11:23 ?        00:00:00 postgres: wal sender process kimchki 10.0.2.2(58506) streaming 0/F60001E8

stand-by 서버에 보면 wal receiver process 가 생성된것을 확인할 수 있다.
kimchki   21547     1  0 11:23 pts/2    00:00:00 /home/kimchki/postgresql/bin/postgres
kimchki   21548 21547  0 11:23 ?        00:00:00 postgres: startup process   recovering 0000000100000000000000F6
kimchki   21549 21547  0 11:23 ?        00:00:00 postgres: checkpointer process
kimchki   21550 21547  0 11:23 ?        00:00:00 postgres: writer process
kimchki   21551 21547  0 11:23 ?        00:00:00 postgres: stats collector process
kimchki   21552 21547  0 11:23 ?        00:00:00 postgres: wal receiver process   streaming 0/F60001E8

Replication 동작 확인

master 서버 PostgreSQL에 data 변경을 하고, stand-by 서버 PostgreSQL에 변경사항이 잘 적용되는지 확인한다.



출처

댓글 없음:

댓글 쓰기

화곡 어쩌라고, 굴사냥

석화찜(굴찜)을 먹으러 여의도로 갔다 그런데 재료가 모두 소진되었다고 마감이라고 한다 응? 다들 굴에 미쳤나? 굴을 찾아 헤매다 보니, 화곡까지 가게 되었다. 화곡은 처음 가본다. 첫인상은 "술집 겁네 많네" 피똥쌀때까지 마실 수 있...