2023. 8. 29. 17:34ㆍ에러대응
에러 상황
pgpool2 를 통해 로드밸런싱을 설정하던 중 발생했던 문제
Aug 29 07:46:19 ip-172-31-44-88 pgpool[3790]: 2023-08-29 07:46:19: pid 3790: FATAL: invalid configuration, failover_when_quorum_exists is not allowed in native replication mode
Aug 29 07:46:19 ip-172-31-44-88 systemd[1]: pgpool2.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED
Aug 29 07:46:19 ip-172-31-44-88 systemd[1]: pgpool2.service: Failed with result 'exit-code'.
ubuntu@ip-172-31-44-88:~$ sudo systemctl status pgpool2.service
× pgpool2.service - pgpool-II
Loaded: loaded (/lib/systemd/system/pgpool2.service; enabled; vendor preset: enabl>
Active: failed (Result: exit-code) since Tue 2023-08-29 07:46:19 UTC; 3s ago
Docs: man:pgpool(8)
Process: 3790 ExecStart=/usr/sbin/pgpool -n (code=exited, status=3)
Main PID: 3790 (code=exited, status=3)
CPU: 8ms
Aug 29 07:46:19 ip-172-31-44-88 systemd[1]: Started pgpool-II.
Aug 29 07:46:19 ip-172-31-44-88 pgpool[3790]: 2023-08-29 07:46:19: pid 3790: FATAL: in>
Aug 29 07:46:19 ip-172-31-44-88 systemd[1]: pgpool2.service: Main process exited, code=>
Aug 29 07:46:19 ip-172-31-44-88 systemd[1]: pgpool2.service: Failed with result 'exit-c>
해결 과정
오류를 해석해보면
구성이 잘못되었습니다. replication_mode 에서는 failover_when_quorum_exists 가 허용되지 않습니다.
pgpool.conf 에 설정을 잘못 한듯 하다.
sudo vi /etc/pgpool2/pgpool.conf
## ... 중략
replication_mode = on
## ... 중략
master_slave_mode = on
## ... 중략
failover_when_quorum_exists = on
## ... 중략
나의 경우는 이 3가지가 전부 on 으로 켜져있었다.
즉 replication_mode 와 master_slave_mode 가 둘다 켜져있어 충돌이 발생한 것으로 보인다.
SOLVE
replication_mode = off
master_slave_mode = on
failover_when_quorum_exists = on
또는
replication_mode = on
master_slave_mode = off
failover_when_quorum_exists = off
배운점
failover_when_quorum_exists 옵션은 master_slave_mode 와 함께 사용될 때만 의미가 있다.
위처럼 replication_mode = on 과 master_slave_mode = on 을 같이 설정할 경우 failover_when_quorum_exists = on 은 문제를 일으킨다.
replication_mode 와 master_slave_mode 를 함께 쓰는건 권장되지 않는다.
추가적으로
replication_mode :
이 모드는 여러 postgreSQL 서버같의 데이터 복제를 위해 사용된다. load_balance_mode 도 함께 활성화되면, 읽기 쿼리는 여러 백엔드 서버간에 분산된다.
master_slave_mode :
이 모드는 일반적으로 하나의 마스터와 하나 이상의 슬레이브 간에 복제를 설정할 때 사용된다. 마스터는 쓰기작업을 처리하고, 슬레이브는 주로 읽기 작업을 처리한다.
failover_when_quorum_exists :
pgpool2 의 고가용성 설정에 사용된다. 이 모드는 master-slave 모드에서만 유효하며 클러스터 내에 쿼럼(과반수의 노드)이 존재하는 경우에만 장애복구를 수행하도록 제어한다.
on 일 경우 쿼럼이 존재할 때만 장애 복구를 수행한다. 이를 통해 split-brain 상황을 방지할 수 있다. 즉 데이터의 일관성을 유지하기 위한 설정
off 일 경우 쿼럼의 유무와 관계 없이 장애 복구를 수행한다.
split-brain 상황 :
클러스터 내부의 노드들이 네트워크 파티션 또는 다른 종류의 통신 문제로 인해 분리되며 각각이 독립적으로 동작하는 상황
데이터 불일치, 리소스 중복 사용, 서비스 중복이 되는 상황.