본문 바로가기
데이터베이스

[postgreSQL] replication slots

by hayz 2024. 12. 27.

postgreSQL 에는 replication slot 이라는 개념이 있다. 

 

replication slots 이란

이 개념은 stanby 서버가 primary 의 wal 파일을 전달받지 못하는 상황을 방지하기 위한 목적으로 존재한다. 

우선 postgreSQL 에서 replication 을 맺는 방법을 알아야 하는데, 기본적으로 WAL(Wrtie-Ahead Log) 를 이용한 방식으로 전달한다. 데이터 변경을 모두 WAL 을 통해서 파일이 쌓이게 되고, standby 서버는 이 WAL 파일을 전달 받아서 primary 와의 동기화를 보장하게 된다. 하지만 어떤 이유로 standby 가 잠시 WAL 을 전송받지 못하는 경우에는 문제가 발생할 수 있다.

왜냐하면 WAL 파일은 primary 에서 주기적으로 정리(wal_keep_size 에 의해)하기 때문에, 제때 전달받지 못하면 데이터가 누락 될 수 있기 때문이다. 이런 경우를 대비해서 postgreSQL 에서는 replication slot 개념을 이용해서 전달받지 못한 WAL 파일이 삭제되는 것을 방지하고 유지될 수 있도록 남기게 해주는 방법이다. 다만,, standby 가 계속 못 받아서 WAL 이 한계 없이 계속 쌓이게 된다면 디스크가 full 차는 경우도 예상해 볼 수 있다. 하지만 또 이런 경우를 대비해서 max_slot_wal_keep_size 파라미터를 통해 최대로 가지고 있을 수 있는 값을 정할 수 있다.  

 

wal 파일 전달 방법(출처: https://kimdubi.github.io/postgresql/postgresql_replication/)

 

archive_mode

그런데.. replication slot 의 max 도 다 차서 실제로 WAL 파일이 지워지기 까지 하는 상황이 올 수도 있다. 이럴때는 archive mode 를 사용해서 실제로 WAL 파일을 archive 영역에 보관해두고 계속 쌓아가는 방식을 이용하는 건데, standby 에 문제가 생겼을때 restore_command 를 통해서 복구할 수 있다. 

 

 

archive_mode = on
archive_command = 'cp %p /mnt/server/archivedir/%f'

restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"'  # Windows

 

그래서 보통 archive 는 DB 가 존재하는 서버에 두지 않고 (디스크 full 위험 때문에) NFS 이나 S3 같은 별도의 외부 저장소 공간을 통해 업로드하고 복구에 사용한다. 

댓글