From fa94725b47e1b30b7a9d83772a56bd38a29c3e88 Mon Sep 17 00:00:00 2001 From: kaffa Date: Sat, 11 Jul 2026 12:52:26 +0900 Subject: [PATCH] =?UTF-8?q?n8n=20=EC=9E=A5=EC=95=A0:=20pgpool=20stale=20pr?= =?UTF-8?q?imary=20=EA=B0=90=EC=A7=80=20+=20pcp.conf=20=EB=88=84=EB=9D=BD?= =?UTF-8?q?=20=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6-07-11-pgpool-stale-primary-n8n-outage.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 history/2026-07-11-pgpool-stale-primary-n8n-outage.md diff --git a/history/2026-07-11-pgpool-stale-primary-n8n-outage.md b/history/2026-07-11-pgpool-stale-primary-n8n-outage.md new file mode 100644 index 0000000..93d71fc --- /dev/null +++ b/history/2026-07-11-pgpool-stale-primary-n8n-outage.md @@ -0,0 +1,49 @@ +--- +title: pgpool stale primary detection — n8n 장기 장애 (2026-07-11) +updated: 2026-07-11 +tags: [history, incident, n8n, pgpool, postgresql-ha] +--- + +## 증상 + +- `https://n8n.inouter.com` 접속 시 BunnyCDN 오리진 pull은 성공하나 HTTP 503, body `{"code":503,"message":"Database is not ready!"}` +- n8n 파드 로그에 `Database connection timed out`, `Pruning failed`, `Failed to hard-delete executions` 반복 + +## 원인 + +pgpool-II 두 파드(`db` ns) 모두 `show pool_nodes` 기준 **실제 Patroni Leader(node 1, 10.100.3.185)를 `status=down`으로 오인식**, 3개 백엔드 전부 `role=standby`로 표시되어 write 가능한 노드가 없는 상태였음. + +- pod `pgpool-f6fcdb947-pvx45` (2026-05-19 기동): node 1 `down` since **2026-06-05 15:53:45** — 5주 이상 방치 +- pod `pgpool-f6fcdb947-lmwg5` (2026-05-22 기동): node 1 `down` since 2026-06-25 20:52:59 + +Patroni 자체는 정상 (`patronictl list` — postgres-2 Leader, TL23, replica lag 0). 즉 Patroni failover/switchover 이후 pgpool이 새 primary를 재탐지하지 못하고 stuck된 것으로 추정. + +`failover_on_backend_error = off`, `failover_command = ''` 설정([[../infra/data/postgresql-ha|postgresql-ha]] 참조 — Patroni가 promotion 전담)이라 pgpool은 자동으로 상태를 갱신하지 않고, 수동 개입(PCP 또는 재시작) 필요. + +### PCP 관리 인터페이스 불능 + +`pcp_attach_node`로 수동 재연결 시도 시: +``` +FATAL: failed to authenticate PCP user +DETAIL: could not open /opt/pgpool-II/etc/pcp.conf. reason: No such file or directory +``` +pgpool 배포에 `pcp.conf`가 아예 생성되어 있지 않음 — PCP 기반 노드 관리가 애초에 불가능한 상태. `pgpool-secrets`에 `pcp_user`/`pcp_password`는 존재하나 서버측 conf 파일 부재로 무용. + +## 조치 + +1. `kubectl -n db rollout restart deployment pgpool` — 재시작 후 `show pool_nodes`에서 node 1 `role=primary, status=up`으로 정상 인식 확인 +2. n8n 파드는 pgpool 재시작 후에도 기존 끊긴 커넥션을 계속 사용해 timeout 지속 → `kubectl -n n8n rollout restart deployment n8n`으로 해결 +3. `https://n8n.inouter.com` HTTP 200 복구 확인 + +## TODO / 재발 방지 + +- [ ] pgpool 이미지/차트에 `pcp.conf` 생성 로직 추가 (Helm values 또는 ConfigMap) — PCP로 즉시 재연결 가능하게 +- [ ] Patroni switchover/failover 시 pgpool 자동 재탐지 여부 조사 (health_check_period=10s인데 왜 자동 복구 안 됐는지 원인 미상 — 재현 필요) +- [ ] pgpool `show pool_nodes`의 `status=down` & `role≠primary` 상태를 감지하는 모니터링/알림 추가 (5주간 미인지 상태로 방치됨) +- [ ] n8n 자체도 DB 재연결 실패 시 자동 재시작(liveness probe on DB connectivity) 검토 + +## 관련 + +- [[../infra/data/postgresql-ha]] — pgpool-II 구성, Patroni 클러스터 +- [[../services/n8n]] — n8n 서비스 개요 +- [[2026-04-16-pgpool-full-migration]] — pgpool 전면 전환 이력