outline: history 갱신 — pgpool DML 라우팅도 동일 버그, haproxy-pg override 영구 유지
This commit is contained in:
@@ -29,19 +29,25 @@ helm chart `gitea.inouter.com/kaffa/helm-charts` 의 `charts/outline/values.yaml
|
|||||||
1. helm-charts 레포 clone (Gitea PAT) → `charts/outline/values.yaml` 의 image tag 0.82.0 → 1.7.0 변경 → commit `outline: 0.82.0 -> 1.7.0 (OIDC SameSite fix)` push
|
1. helm-charts 레포 clone (Gitea PAT) → `charts/outline/values.yaml` 의 image tag 0.82.0 → 1.7.0 변경 → commit `outline: 0.82.0 -> 1.7.0 (OIDC SameSite fix)` push
|
||||||
2. ArgoCD App `outline` sync 트리거 → Deployment image 갱신
|
2. ArgoCD App `outline` sync 트리거 → Deployment image 갱신
|
||||||
|
|
||||||
## 부수 이슈 — 마이그레이션 라우팅
|
## 부수 이슈 — pgpool DDL/DML 라우팅
|
||||||
|
|
||||||
|
### 1차: 마이그레이션 ALTER TABLE 실패
|
||||||
|
|
||||||
신규 1.7.0 pod 기동 시 마이그레이션 `20250207120103-add-collectionId-to-subscriptions.js` 가 `cannot execute ALTER TABLE in a read-only transaction` 으로 실패. 누적 5회 CrashLoopBackOff.
|
신규 1.7.0 pod 기동 시 마이그레이션 `20250207120103-add-collectionId-to-subscriptions.js` 가 `cannot execute ALTER TABLE in a read-only transaction` 으로 실패. 누적 5회 CrashLoopBackOff.
|
||||||
|
|
||||||
|
### 2차: 운영 후 apiKeys UPDATE 실패
|
||||||
|
|
||||||
|
마이그레이션 완료 후 deploy env override 제거 + 운영 DATABASE_URL = `pgpool:9999` 로 복귀했는데, API 요청마다 발생하는 `UPDATE "apiKeys" SET "lastActiveAt"=$1 WHERE "id" = $2` 가 동일 사유로 실패 (PG error 25006). pgpool 이 DDL뿐 아니라 DML UPDATE 도 replica 로 라우팅.
|
||||||
|
|
||||||
### 원인
|
### 원인
|
||||||
|
|
||||||
- DATABASE_URL 이 `pgpool.db.svc.cluster.local:9999` 사용 → pgpool이 ALTER TABLE 을 stream replication 모드에서 replica로 라우팅
|
- DATABASE_URL 이 `pgpool.db.svc.cluster.local:9999` 사용 → pgpool이 ALTER TABLE 및 UPDATE 를 stream replication 모드에서 replica로 라우팅
|
||||||
- Patroni 자체는 healthy (Leader postgres-2 running, replicas streaming, lag=0)
|
- Patroni 자체는 healthy (Leader postgres-2 running, replicas streaming, lag=0)
|
||||||
- pgpool config 에서 DDL을 primary로 강제 라우팅하는 설정이 미적용으로 보임
|
- pgpool config 에서 write를 primary로 강제 라우팅하는 설정이 미적용으로 보임
|
||||||
|
|
||||||
### 우회
|
### 해결 (영구 override)
|
||||||
|
|
||||||
ArgoCD selfHeal=false 로 일시 전환 후 deployment env 에 직접 DATABASE_URL override 추가 (`haproxy-pg.db.svc.cluster.local:5432` — Patroni leader 전용 라우팅, K3s db ns LoadBalancer):
|
ArgoCD selfHeal=false 유지 + deployment env 에 직접 DATABASE_URL override 적용 (`haproxy-pg.db.svc.cluster.local:5432` — Patroni leader 전용 라우팅, K3s db ns LoadBalancer):
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
env:
|
env:
|
||||||
@@ -50,18 +56,16 @@ env:
|
|||||||
- (기존 env: DEFAULT_LANGUAGE/ENABLE_UPDATES/FILE_STORAGE/.../URL ...)
|
- (기존 env: DEFAULT_LANGUAGE/ENABLE_UPDATES/FILE_STORAGE/.../URL ...)
|
||||||
```
|
```
|
||||||
|
|
||||||
신규 pod에서 마이그레이션 정상 적용:
|
마이그레이션 정상 적용:
|
||||||
- `20250207120103-add-collectionId-to-subscriptions.js` (up) 완료
|
- `20250207120103-add-collectionId-to-subscriptions.js` (up) 완료
|
||||||
- 누적된 0.82.0 → 1.7.0 마이그레이션 모두 적용
|
- 누적된 0.82.0 → 1.7.0 마이그레이션 모두 적용
|
||||||
- "Listening on http://localhost:3000 / https://outline.inouter.com" 출력
|
- "Listening on http://localhost:3000 / https://outline.inouter.com" 출력
|
||||||
|
|
||||||
### 정리
|
운영 후 apiKeys UPDATE 에러도 해소됨.
|
||||||
|
|
||||||
마이그레이션 완료 후:
|
> 외부 secret(`outline-secrets`)은 ESO가 1h 주기로 Vault `secret/apps/outline` 동기화. ESO 사이클이 patch를 1h 안에 revert하므로 secret 직접 수정은 무의미 — deploy env override 가 정답.
|
||||||
- deployment env 에서 `DATABASE_URL` override 제거 (chart values 와 일치하도록)
|
|
||||||
- ArgoCD selfHeal 다시 활성화
|
> ArgoCD selfHeal 은 영구 false 유지 — 활성화하면 chart values 의 DATABASE_URL 이 patch 를 덮어 다시 깨짐. 후속으로 chart values 자체에 haproxy-pg 명시 또는 pgpool config 수정 필요.
|
||||||
- 운영 시점 DATABASE_URL 은 다시 `pgpool.db.svc.cluster.local:9999` (envFrom outline-secrets) 사용. SELECT/INSERT/UPDATE 는 pgpool 정상 라우팅
|
|
||||||
- 외부 secret(`outline-secrets`)은 ESO가 1h 주기로 Vault `secret/apps/outline` 동기화. ESO 사이클이 patch를 1h 안에 revert하므로 중간에 secret 직접 수정은 의미 없음 — deploy env override 가 정답
|
|
||||||
|
|
||||||
### pgpool DDL 라우팅 후속 과제
|
### pgpool DDL 라우팅 후속 과제
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user