물리 스트리밍 복제(physical streaming replication)로 primary 하나와 standby 하나를 묶는다. 아래는 PostgreSQL 12 에서 확인한 설정이다.
| 설정 | 12 이하 | 13 이상 |
|---|---|---|
| WAL 보관량 | wal_keep_segments (세그먼트 개수) |
wal_keep_size (MB) |
wal_keep_segments 는 13에서 없어졌다.[1] 13 이상에 그대로 쓰면 기동하지 않는다. 세그먼트 하나가 기본 16MB 이므로 wal_keep_segments = 32 는 wal_keep_size = 512MB 에 해당한다.
postgresql.conf 다.
listen_addresses = '*'
port = 5432
max_connections = 100
shared_buffers = 256MB
dynamic_shared_memory_type = posix
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
log_line_prefix = '%m [%p] '
log_timezone = 'Asia/Seoul'
datestyle = 'iso, ymd'
timezone = 'Asia/Seoul'
lc_messages = 'ko_KR.UTF-8'
lc_monetary = 'ko_KR.UTF-8'
lc_numeric = 'ko_KR.UTF-8'
lc_time = 'ko_KR.UTF-8'
default_text_search_config = 'pg_catalog.simple'
wal_buffers = 8MB
max_wal_size = 1GB
min_wal_size = 80MB
checkpoint_completion_target = 0.9
# 복제 관련
wal_level = replica
max_wal_senders = 2
wal_sender_timeout = 60s
# 12 이하
wal_keep_segments = 32
# 13 이상은 위 줄 대신 아래를 쓴다
# wal_keep_size = 512MB
wal_level 은 replica 면 된다. 공식 문서가 "standby 서버의 접속을 받으려면 wal_level 이 replica 이상이어야 한다"고 적고 있다.[1:1] logical 로 두어도 동작하지만 논리 복제를 쓰지 않는다면 WAL 을 더 쓸 뿐 이득이 없다.
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'secret';
pg_hba.conf 에 standby 접속을 연다.
host replication replicator standbyIP/32 md5
postgres 계정으로 실행한다. 데이터 디렉터리가 비어 있어야 한다.
pg_basebackup -h masterIP -U replicator -p 5432 -D /var/lib/pgsql/12/data/ -Xs -P -R
암호:
25527/25527 kB (100%), 1/1 테이블스페이스
| 옵션 | 뜻 |
|---|---|
-Xs |
WAL 을 스트리밍으로 함께 받는다 |
-P |
진행률 표시 |
-R |
standby 로 동작하도록 설정을 써 준다 (12 이상은 standby.signal 생성) |
primary 에서 복제 상태를 본다.
SELECT client_addr, state, sync_state FROM pg_stat_replication;
standby 에서 복구 모드인지 본다.
SELECT pg_is_in_recovery();