10.4 용어집
v2.2 기준 용어입니다. 상태 이름은 monitor 스키마의 pgautofailover.replication_state enum(v2.2 pgautofailover.sql)에 정의된 22개 값을 모두 담았습니다. 설명은 v2.2 failover-state-machine.rst와 이 노트의 실측 로그를 바탕으로 작성했습니다.
구성 요소와 개념
| 용어 | 설명 |
|---|---|
| monitor | pgautofailover extension이 설치된 PostgreSQL 인스턴스와 이를 관리하는 pg_autoctl. 노드 상태를 기록하고 목표 상태를 결정하는 주체 |
| keeper | 데이터 노드에서 pg_autoctl run으로 실행되는 프로세스. 로컬 PostgreSQL을 자식 프로세스로 실행하고 monitor가 정한 목표 상태로 전환 |
pg_autoctl | monitor와 keeper 모두에서 사용하는 명령행 도구 |
| formation | 함께 관리하는 PostgreSQL 서비스의 논리적 묶음. 기본값 default. monitor 하나가 여러 formation을 관리 |
| group | 같은 데이터를 가진 노드 집합(primary 하나와 standby들). 일반 구성에는 group 0 하나가 있고, Citus는 worker마다 group이 있음 |
| node | monitor에 등록된 PostgreSQL 인스턴스 하나. 역할이 바뀔 수 있으므로 이름에 역할을 넣지 않도록 문서에서 권장 |
| reported state | keeper가 node_active()로 보고한 현재 상태 |
| assigned state, goal state | monitor가 노드에 지정한 목표 상태 |
node_active() | keeper가 1초마다 호출하는 monitor 함수. 현재 상태를 보고하고 목표 상태를 수신 |
| health check | monitor가 각 노드에 PostgreSQL 연결을 시도하여 도달 가능 여부를 확인하는 작업 |
| candidate priority | 0~100, 기본 50. failover 후보 선정 우선순위. 0이면 자동 승격 대상에서 제외 |
| replication quorum | 노드별 boolean, 기본 true. true인 standby만 synchronous_standby_names에 포함 |
| number_sync_standbys | formation 설정. primary가 커밋할 때마다 기다릴 동기 standby 수. N으로 설정하려면 quorum 참여 standby가 N+1개 이상 필요 |
| Business Continuity | 2노드 구성의 설계 목표. 노드 하나를 잃어도 서비스를 계속하는 것을 데이터 이중화보다 우선 |
상태
| 상태 | 설명 |
|---|---|
unknown | enum의 기본 자리 값 |
init | 처음 등록된 노드. monitor가 존재만 알고 있는 상태 |
single | group에 노드가 하나뿐인 상태. 일반 PostgreSQL처럼 동작하며 failover는 없음 |
wait_primary | primary 역할이지만 정상적인 동기 standby가 없는 상태. 동기 복제를 끄고(synchronous_standby_names = '') 쓰기를 받음. 자동 failover 불가 |
join_primary | standby 합류를 준비하던 primary 상태. deprecated, 현재는 primary를 사용 |
primary | 정상적인 standby가 따라잡은 상태. failover가 가능한 유일한 primary 상태 |
apply_settings | primary가 복제 설정 변경(synchronous_standby_names)을 적용하는 중 |
wait_standby | standby로 지정된 후 primary가 접속을 허용하기를 기다리는 상태 |
catchingup | pg_basebackup 또는 pg_rewind 후 primary를 따라잡는 중. 승격 불가 |
secondary | primary와의 WAL 차이가 enable_sync_wal_log_threshold(16MB) 이내인 hot standby. 승격 후보 |
maintenance | 운영자가 maintenance로 전환한 노드. pg_autoctl이 관리하지 않음 |
wait_maintenance | secondary가 maintenance로 전환되기 전, primary가 비동기 방식으로 바뀌기를 기다리는 상태 |
prepare_maintenance | primary를 maintenance로 전환하기 전 단계. 이어서 failover가 발생 |
draining | primary가 새 쓰기를 멈추고 남은 WAL을 standby로 보내는 단계. PostgreSQL을 정지하는 방식으로 구현 |
demote_timeout | monitor가 강등을 지정했지만 keeper가 확인하지 않아 시간 초과를 기다리는 상태. 고립된 primary가 스스로 이 상태에 들어가기도 함 |
demoted | 강등 완료. keeper가 PostgreSQL을 멈추고 실행되지 않도록 함 |
prepare_promotion | 승격 후보가 승격을 준비하는 상태. primary 정지를 monitor와 동기화 |
stop_replication | 후보를 promote하되 default_transaction_read_only = on으로 쓰기를 막고 이전 primary의 강등을 기다리는 상태 |
report_lsn | standby가 2대 이상일 때 선출에 사용할 최신 LSN을 보고하는 상태. 복제를 멈춘 뒤 보고 |
fast_forward | priority에 따라 선정되었지만 LSN이 뒤처진 후보가 더 앞선 standby에서 부족한 WAL을 받아 오는 단계 |
join_secondary | 선출되지 않은 standby가 새 primary를 따르기 위해 기다리는 상태 |
dropped | pg_autoctl drop node로 제거 중인 노드. 상태 보고 후 monitor에서 삭제 |
monitor GUC (v2.2 기본값)
| GUC | 기본값 | 뜻 |
|---|---|---|
pgautofailover.health_check_period | 5000 ms | health check 간격 |
pgautofailover.health_check_timeout | 5000 ms | health check 연결 타임아웃 |
pgautofailover.health_check_max_retries | 2 | 실패로 표시하기 전 재시도 횟수 |
pgautofailover.health_check_retry_delay | 2000 ms | 재시도 간격 |
pgautofailover.node_considered_unhealthy_timeout | 20000 ms | 마지막 보고 후 이 시간이 지나고 health check도 실패하면 unhealthy |
pgautofailover.primary_demote_timeout | 30000 ms | 새 primary를 열기 전 이전 primary의 강등을 기다리는 시간 |
pgautofailover.startup_grace_period | 10000 ms | monitor 시작 후 failover를 시작하지 않는 유예 시간 |
pgautofailover.promote_wal_log_threshold | 16777216 | standby가 이 바이트 이상 뒤처지면 승격하지 않음 |
pgautofailover.enable_sync_wal_log_threshold | 16777216 | standby가 이 바이트 이내로 따라잡아야 동기 복제를 다시 켬 |
main 브랜치에는 pgautofailover.guard_data_loss와 pgautofailover.replication_stall_timeout이 추가되었지만 v2.2에는 없습니다.
keeper 설정 ([timeout] 섹션, v2.2 실측 값)
| 키 | 값 | 뜻 |
|---|---|---|
network_partition_timeout | 20 | primary가 monitor와 standby 모두에 이 시간(초) 동안 연결되지 않으면 스스로 강등 |
prepare_promotion_catchup | 30 | 이름상 승격 전 WAL을 따라잡는 대기 시간(초)이지만 v2.2에서는 파싱만 하고 사용하지 않음 |
prepare_promotion_walreceiver | 5 | 이름상 승격 전 walreceiver 대기 시간(초)이지만 v2.2에서는 사용하지 않음(소스 TODO) |
postgresql_restart_failure_timeout | 20 | PostgreSQL 재시작을 시도하는 시간(초) |
postgresql_restart_failure_max_retries | 3 | PostgreSQL 재시작 최대 시도 횟수 |
내부 사용자와 이름
| 이름 | 설명 |
|---|---|
autoctl_node | keeper가 monitor에 접속할 때 사용하는 사용자 |
autoctl | monitor의 pg_auto_failover DB 소유자 |
pgautofailover_monitor | monitor의 health check 사용자 |
pgautofailover_replicator | 복제, pg_basebackup, pg_rewind에 사용하는 사용자 |
pgautofailover_standby_<nodeid> | replication slot 이름이자 application_name. synchronous_standby_names에 이 이름이 포함됨 |
postgresql-auto-failover.conf | pg_autoctl이 관리하는 PostgreSQL 설정 파일. postgresql.conf 맨 위에서 include |