4.4 PostgreSQL 파라미터 관리
단독 PostgreSQL에서 GUC는 postgresql.conf와 ALTER SYSTEM의 영역이다. Patroni 클러스터에서는 사정이 다르다. 복제와 failover가 성립하려면 일부 파라미터가 노드 사이에서 맞아야 하고, Patroni는 그 파라미터들을 4.3의 설정 우선순위 바깥에서 직접 통제한다.
세 갈래의 강제 제어
첫째 갈래는 primary와 replica가 같은 값을 가져야 하는 파라미터다. local이나 환경변수에 적어도 효과가 없고 DCS(dynamic configuration)로만 바뀐다.
| 파라미터 | 기본값 | 최솟값 |
|---|---|---|
max_connections | 100 | 25 |
max_locks_per_transaction | 64 | 32 |
max_worker_processes | 8 | 2 |
max_prepared_transactions | 0 | 0 |
wal_level | hot_standby | 허용값: hot_standby, replica, logical |
track_commit_timestamp | off | 없음 |
wal_level의 기본값 표기 hot_standby는 PostgreSQL의 replica와 동의어다.
둘째 갈래는 전 노드 동일이 필수는 아니지만 마찬가지로 DCS로만 변경을 허용하는 파라미터다.
| 파라미터 | 기본값 | 최솟값 |
|---|---|---|
max_wal_senders | 10 | 3 |
max_replication_slots | 10 | 4 |
wal_keep_segments | 8 | 1 |
wal_keep_size | 128MB | 16MB |
wal_log_hints | on | 없음 |
셋째 갈래는 patroni.yml의 다른 키에서 유도되는 파라미터다. listen_addresses와 port는 postgresql.listen(또는 PATRONI_POSTGRESQL_LISTEN)에서, cluster_name은 scope에서 오고, hot_standby는 on으로 고정된다.
ALTER SYSTEM보다 우선하는 커맨드라인 인자
위 파라미터들은 postgresql.conf에 기록될 뿐 아니라 postgres 프로세스의 커맨드라인 인자로도 전달된다. PostgreSQL에서 커맨드라인 인자는 postgresql.auto.conf보다 우선하므로, DBA가 ALTER SYSTEM으로 max_connections를 바꿔도 Patroni가 정한 값을 이기지 못한다. 예외는 wal_keep_segments와 wal_keep_size 둘로, 커맨드라인 전달 대상에서 빠져 있다.
postgresql.conf 관리 시퀀스
Patroni는 postgresql.conf를 자기 소유로 다시 쓴다. 처리 순서는 다음과 같다.
custom_conf가 설정되어 있으면 그 파일을 base 설정으로 쓴다. 기존 postgresql.base.conf와 postgresql.conf는 무시하며, Patroni는 custom_conf 파일을 감시하지도 백업하지도 않는다.custom_conf가 없고 postgresql.base.conf가 이미 있으면 그 파일이 base다.- 둘 다 없으면 원본 postgresql.conf를 postgresql.base.conf로 rename해 base로 삼는다.
- dynamic configuration의 파라미터를 새 postgresql.conf에 덤프하고, 그 안에 base 설정을 include하는 라인을 넣는다.
최종적으로 파라미터는 네 겹으로 적용되며 아래로 갈수록 우선한다.
flowchart TD
BASE["postgresql.base.conf<br/>또는 custom_conf"]
CONF["postgresql.conf<br/>dynamic 설정 덤프"]
AUTO["postgresql.auto.conf<br/>ALTER SYSTEM"]
CMD["커맨드라인 인자<br/>Patroni 강제 값"]
BASE --> CONF --> AUTO --> CMD
이 구조로 네 가지 요구가 공존한다. base는 Patroni 밖에서 설정 파일을 관리하던 기존 도구의 자리, postgresql.conf는 전 노드 공통 설정, auto.conf는 ALTER SYSTEM으로 넣는 노드별 설정, 커맨드라인은 Patroni 운영에 필수인 파라미터의 강제 지점이다.
pg_hba와 pg_ident 생성
postgresql.pg_hba와 postgresql.pg_ident에 적은 라인으로 Patroni가 두 파일을 생성한다. 단 PostgreSQL의 hba_file 또는 ident_file GUC가 기본값이 아닌 경로를 가리키면 Patroni는 해당 설정을 무시한다. 파일을 직접 관리하겠다는 선언으로 해석하는 것이다.
pending_restart 플래그
재시작이 필요한 파라미터가 바뀌면 Patroni는 pg_settings의 context와 실제 적용 값을 비교해 그 노드의 멤버 정보에 pending_restart 플래그를 설정한다. 노드 상태에는 "restart_pending": true로 나타난다. 플래그는 해당 노드를 재시작하면 리셋된다. 재시작 자체는 DBA가 patronictl restart로 실행한다(Part VII).
shared memory 파라미터의 증감 절차
max_connections, max_prepared_transactions, max_locks_per_transaction, max_wal_senders, max_worker_processes는 shared memory 크기를 결정하며, standby가 primary보다 작은 값을 가질 수 없다. 그래서 변경 방향에 따라 재시작 순서가 달라진다.
값 변경
patronictl edit-config로 dynamic configuration의 값을 바꾼다. 전 노드에 pending_restart 플래그가 붙는다.
순서대로 재시작
증가라면 standby들을 먼저 patronictl restart로 재시작하고 primary를 마지막에 재시작한다. 감소라면 반대로 primary를 먼저 재시작하고 standby를 나중에 재시작한다.
감소를 순서 없이 전 노드에 한꺼번에 적용해도 보호 장치가 있다. standby는 pg_controldata 기준으로 primary가 새 값을 따라잡을 때까지 감소를 무시하고 원래 값으로 재시작한다. primary보다 낮은 값으로 recovery를 시작하다 FATAL로 crash loop에 빠지는 상황을 막기 위한 동작이다.
patronictl restart로 실행한다. systemctl restart patroni처럼 Patroni 데몬 자체를 재시작하면 의도치 않은 failover로 이어질 수 있다.role별 override
같은 GUC라도 primary와 replica에 다른 값을 주고 싶을 때는 role별 키를 쓴다. parameters_primary, parameters_replica, parameters_standby_leader는 base인 parameters와 병합된 뒤 겹치는 키만 덮어쓴다.
반면 pg_hba_primary, pg_hba_replica, pg_hba_standby_leader는 병합이 아니라 완전 대체다. role별 키가 정의된 role에서는 base pg_hba가 통째로 무시되므로, replication 라인을 포함해 필요한 라인을 전부 다시 적어야 한다. pg_ident의 role별 변형도 같은 규칙을 따른다.
postgresql:
parameters:
work_mem: 64MB
parameters_replica: # parameters와 merge, work_mem은 유지됨
max_standby_streaming_delay: 300s
pg_hba:
- host all all 10.0.0.0/24 scram-sha-256
- host replication replicator 10.0.0.0/24 scram-sha-256
pg_hba_replica: # 완전 대체, replication 라인도 다시 적는다
- host all all 10.0.0.0/24 scram-sha-256
- host all batch_reader 10.1.0.0/24 scram-sha-256
- host replication replicator 10.0.0.0/24 scram-sha-256정리
- Patroni는 복제 성립에 필요한 파라미터를 DCS 전용으로 묶고, 커맨드라인 인자로 전달해
ALTER SYSTEM까지 무력화한다.wal_keep_segments와wal_keep_size만 커맨드라인 전달에서 빠진다 - postgresql.conf는 base(include) 위에 dynamic 덤프를 얹는 구조로 재작성되고, 원본은 postgresql.base.conf로 rename된다
- shared memory 파라미터는 증가 시 standby 먼저, 감소 시 primary 먼저 재시작한다. 잘못된 순서의 감소는 standby가 무시한다
- role별 override에서
parameters계열은 merge,pg_hba와pg_ident계열은 완전 대체다