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 -D [data directory] -v -P -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' |
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에 변경사항이 잘 적용되는지 확인한다.출처
댓글 없음:
댓글 쓰기