2.2 formation, group, node
monitor 하나로 여러 PostgreSQL 서비스를 관리할 수 있습니다. 따라서 pg_auto_failover의 관리 단위는 세 단계로 나뉩니다. formation은 함께 관리하는 서비스 묶음입니다. group은 같은 데이터를 가진 노드 집합입니다. node는 PostgreSQL 인스턴스 하나와 해당 keeper를 뜻합니다. 상태 머신은 group 단위로 동작합니다. failover도 group 안에서만 발생합니다.
세 단계 구조
일반 PostgreSQL 서비스는 formation 하나와 group 0 하나로 구성됩니다. monitor를 만들면 default formation이 자동으로 생깁니다. 실습에서 monitor를 시작한 직후의 pgautofailover.formation 테이블은 다음과 같았습니다.
default|pgsql|postgres|t|0
컬럼은 순서대로 formation id, kind(pgsql), 기본 dbname입니다. 그다음은 secondary 허용 여부와 number_sync_standbys입니다. number_sync_standbys 초기값은 0입니다. 두 번째 quorum standby(세 번째 노드)가 참여하면 monitor가 1로 올립니다(5.1). 서비스를 하나 더 운영하려면 pg_autoctl create formation으로 formation을 추가합니다. 노드를 만들 때는 --formation을 지정합니다.
pg_autoctl create formation --formation billing --kind pgsql --dbname billing
pg_autoctl create postgres --formation billing ...
formation마다 group이 독립적으로 상태 머신을 실행합니다. 따라서 한 formation의 failover는 다른 formation에 영향을 주지 않습니다. 반면 monitor가 멈추면 모든 formation의 orchestration도 함께 중단됩니다.
group과 Citus
group 번호는 Citus를 위해 존재합니다. Citus formation에서는 coordinator가 group 0입니다. 각 worker는 별도의 group을 가집니다. worker group마다 primary와 standby가 있습니다. 각 group은 독립적으로 failover합니다. 이 노트에서는 Citus 운영을 다루지 않습니다. 일반 PostgreSQL에서는 group 0만 사용합니다.
v1.3까지 group 하나에는 노드 두 대만 둘 수 있었습니다. v1.4부터는 group 안의 노드 수에 제한이 없습니다. group 안의 모든 노드는 같은 system identifier를 가져야 합니다. 물리 복제로 연결되어 같은 데이터를 가지기 때문입니다.
node 이름과 node id
노드에는 세 가지 이름이 있습니다.
| 이름 | 예 | 용도 |
|---|---|---|
| node name | node1 | 사람이 부르는 이름. --name으로 지정, pg_autoctl set node metadata --name으로 변경 |
| hostname | node1 | 다른 노드와 monitor가 접속할 주소. --hostname으로 지정 |
| node id | 1 | monitor가 등록 순서대로 부여하는 숫자 |
synchronous_standby_names와 replication slot에는 node id가 들어갑니다. application name은 pgautofailover_standby_%d 형식입니다. %d는 node id입니다. 문서에서는 이 방식으로 노드 이름을 바꿔도 primary 연결 문자열을 그대로 유지할 수 있다고 설명합니다.
primary_conninfo = 'application_name=pgautofailover_standby_2 host=node1 port=5432 user=pgautofailover_replicator sslmode=require'
primary_slot_name = 'pgautofailover_standby_2'
node id는 재사용되지 않습니다. 실습에서 node3을 drop node로 삭제한 뒤 다시 등록했습니다. 이름은 node3이지만 id는 4가 되었습니다.
node3 | 4 | node3:5432 | 4: 0/50000F8 | read-only | secondary | secondary
공식 문서는 노드 이름에 역할을 넣지 말라고 권합니다. pg-primary, pg-replica 같은 이름은 첫 failover 이후 실제 역할과 맞지 않습니다. 이 노트의 실습도 node1, node2처럼 역할이 없는 이름을 사용합니다.
monitor에 저장되는 테이블
v2.2 monitor의 pgautofailover 스키마에는 테이블이 세 개 있습니다.
Schema | Name | Type | Owner
----------------+-----------+-------+----------
pgautofailover | event | table | postgres
pgautofailover | formation | table | postgres
pgautofailover | node | table | postgres
node 테이블의 각 행은 노드 하나를 나타냅니다. 이 테이블은 목표 상태, 보고 상태, health를 담습니다. candidate priority, replication quorum, 보고된 LSN도 담습니다.
SELECT nodeid, nodename, nodehost, goalstate, reportedstate, health,
candidatepriority, replicationquorum, reportedlsn
FROM pgautofailover.node
ORDER BY nodeid;
nodeid | nodename | nodehost | goalstate | reportedstate | health | candidatepriority | replicationquorum | reportedlsn
--------+----------+----------+-----------+---------------+--------+-------------------+-------------------+-------------
1 | node1 | node1 | primary | primary | 1 | 50 | t | 0/9055360
2 | node2 | node2 | secondary | secondary | 1 | 50 | t | 0/9055360
3 | node3 | node3 | secondary | secondary | 1 | 50 | t | 0/9055360
pg_autoctl show state는 이 테이블을 읽기 쉽게 출력한 결과입니다. 전체 조회 명령은 6.1에 있습니다.
정리
일반 PostgreSQL 서비스는 default formation의 group 0 하나로 운영합니다. 상태 머신과 failover는 group 단위로 동작합니다. 복제 관련 이름에는 node id를 사용합니다. monitor 하나에 formation을 여러 개 두면 관리 대상이 늘어납니다. 하지만 모든 formation은 같은 monitor의 가용성에 의존합니다.