Skip to content

[Test] OpenSQL HA 대시보드와 실제 쓰기·장애 리허설 - #449

Merged
Gimini-3 merged 6 commits into
developfrom
test/448
Oct 9, 2026
Merged

Gimini-3 merged 6 commits into
developfrom
test/448

Conversation

@Gimini-3

@Gimini-3 Gimini-3 commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

🔍️ 작업 내용

Closes #448

GCP OpenSQL HA 경로의 HTTP 쓰기와 장애를 같은 시간축에서 볼 수 있도록 Grafana 대시보드를 구성하고, 정상 기준선·OpenProxy A 중단·primary PostgreSQL 프로세스 종료를 각각 독립 실행으로 기록했습니다. 이어서 OpenProxy TCP 관측과 실행 ID별 HTTP 2xx·3xx·4xx·5xx 누적 카드, 화면 가독성 및 비식별 증거 검증을 추가했습니다.

✨ 상세 설명

왜 필요한가

기존에는 k6 원장·Patroni 상태·앱 지표를 따로 읽어야 했고, up=1이나 프록시 TCP 연결을 실제 쓰기 성공으로 오해하기 쉬웠습니다. 지금 화면은 구성요소 상태와 사용자가 받은 HTTP 응답을 나란히 보여주되, 데이터 보존은 별도의 요청 ID–DB 행 대조로 판정합니다.

GCP 부하 VM의 k6 ── run_id·request_id ──▶ 내부 LB ──▶ 앱 A/B
       │                                               │
       ├─ 안전 이벤트 원장 ────────────────────────────┼─▶ OpenProxy A/B ─▶ OpenSQL primary
       │                                               │                       │
       └─ 결과별·상태코드 대역별 Counter ──Remote Write─┐│                       │
                                                       ▼                       │
                                      Prometheus → Grafana                     │
                                                       ▲                       │
                                      앱·Patroni 지표·TCP probe ────────────────┘

화면 = 수집·역할·HTTP 결과의 시간축
최종 정합성 = DB 밖 request_id 원장 ↔ 복구 후 primary의 행 수

변경 범위

영역 변경 내용
Grafana 현재 primary·timeline, 앱 A/B와 DB 역할 타임라인, OpenProxy 포트 연결, 실행 ID별 상태코드 누적 카드와 결과별 응답/초를 18패널에 배치. PRIMARY 주황색, 짧은 Hikari timeout 창, 작은 보조 그래프 등 시연 가독성 조정
OpenProxy 관측 관측 VM에서 두 포트로 연결하는 Blackbox TCP 모듈·Prometheus scrape 예시 추가. 포트 연결을 SQL 성공이나 앱의 실제 프록시 사용으로 표현하지 않음
k6·원장 HTTP 2xx·3xx·4xx·5xx 무태그 Counter와 실행 ID별 Remote Write 대조 추가. 응답 없는 요청은 unknown으로 따로 기록하고, 201 이외의 2xx도 예상 밖 응답으로 남김
시험 근거 기존 장애 실행 4건의 한국어 요약과 후속 로컬·GCP 실행별 로그, 비식별 안전 이벤트·요청별 DB 행 수·1초 계측을 목적과 실행 ID별로 분리
HTTP 응답 수신
  ├─ 201 ───────────▶ 2xx 카드 +1, 201/초, 원장 acknowledged
  ├─ 200·3xx·4xx ─▶ 해당 카드 +1, 기타 예상 외 응답/초, 원장 failed
  ├─ 500·503 ──────▶ 5xx 카드 +1, 해당 오류/초, 원장 failed
  └─ 응답 없음 ─────▶ 코드 카드에는 미포함, unknown/초와 원장에 기록

각 Counter는 상태코드·URL·JWT 태그를 넣지 않는다.
실행 ID는 Remote Write에만 붙여 원본 JSONL 비식별 검증을 유지한다.

실제 측정 결과

실행 부하·사건 클라이언트 결과 요청 ID–DB 대조
ha448base01 100 req/s·60초 정상 201 6,001/6,001, 미전송 0 201 누락·중복 0
ha448proxy01 100 req/s·120초, OpenProxy A 중단·복구 201 11,994, 500 7, 미전송 0 201 누락·중복 0; 500의 DB 반영 0
ha448proc01 30 req/s·180초, primary postmaster SIGKILL 201 5,161, 500 230, 401 4, 결과 불명 5 201 누락·중복 0; 불명 중 3건 반영
hadash1009b01 30 req/s·60초, 확장된 화면 정상 기준선 201 1,801/1,801, 2xx·3xx·4xx·5xx 카드 1,801·0·0·0 DB 1,801행, 누락·중복 0
ha449smk0001 1 req/s·5초, 원격 지표 연결 스모크 201 5/5, 미전송 0, k6 종료 0 DB 5행, ID별 누락·중복 0
ha449run0001 30 req/s·60초, 새 화면 정상 리허설 201 1,801/1,801, 미전송 0, p95 53.42ms; Grafana 2xx 1,801·나머지 0 DB 1,801행·1,801개 ID, 누락·중복·고아 0
primary 프로세스 종료 실행
  k6 전송 ─▶ HTTP 500·401 또는 응답 없음 ─▶ Patroni가 같은 노드의 DB 재시작
                                                       │
                                                       ▼
                                                201 응답 다시 관측

복구 뒤 request_id별 대조:
  201 5,161건 ─▶ 각 1행, 누락·중복 0
  결과 불명 5건 ─▶ 3건은 이미 DB에 반영

따라서 “응답 없음 = 쓰기 실패”가 아니며,
멱등 계약 없는 무조건 재시도는 중복을 만들 수 있다.

첫 장애 실행 당시 대시보드는 8패널이었고, 후속 확장 후 18패널입니다. OpenProxy·primary 장애를 새 상태코드 카드 구성으로 재실행한 결과는 아닙니다. 첫 후속 접속 시험은 HTTP 403 6건으로 실패했고, 별도 합성 계정으로 다시 검증한 6건과 정상 기준선 1,801건을 각각 다른 실행으로 남겼습니다.

검증·근거

검사 결과
OpenSQL Python 테스트 134/134 통과
Grafana HA 정적 테스트 11/11 통과
기존 운영 Grafana 검사 36패널·32 PromQL, 성공
Dashboard JSON·Blackbox YAML·압축 증거·스테이징 공백 검사 통과. 이번 추가 1초 CSV는 값 변경 없이 LF 줄바꿈으로 정규화
공개 파일의 개인 경로·사설 주소·JWT·토큰·개인키 패턴 검사 탐지 0파일. 검사 패턴 밖의 모든 노출 가능성까지 보증하지는 않음

Java 제품 코드는 변경하지 않아 Gradle 전체 테스트는 이번 PR에서 실행하지 않았습니다. 원본 k6 JSONL과 비공개 인프라 식별자가 포함될 수 있는 파일은 부하 VM에 보존하고, 저장소에는 사전 비식별 검사를 통과한 후속 실행의 안전 이벤트·DB 대조·1초 숫자 계측만 추가했습니다.

🛠️ 추후 리팩토링 및 고도화 계획

  • 이 PR에서 자동 재시도나 제품 쓰기 경로의 멱등성은 추가하지 않았습니다. 결과 불명 요청은 DB 대조 없이 재전송하지 않습니다.
  • TCP probe는 관측 VM에서 OpenProxy 포트까지의 연결만 측정합니다. 앱→프록시 실제 사용 경로, OpenProxy B 장애, 리더 VM 상실 및 비동기 복제 RPO 경계는 별도 검증 범위입니다.
  • 이번 정상 리허설에서 새 카드·응답/초·활성 VU가 실제로 표시되고 Prometheus 최종 합계와 DB 요청 ID가 일치함을 확인했습니다. 새 카드와 응답/초 그래프가 장애 중 함께 움직이는지는 추후 별도 실행 ID의 짧은 리허설로 확인합니다. 이 PR의 기존 장애 결과를 새 화면의 실측처럼 표시하지 않습니다.

📸 스크린샷 (선택)

인증된 관측 VM의 Grafana에서 실제 렌더링을 확인했습니다. 접근 제한과 내부 주소 비노출을 위해 공개 스크린샷은 첨부하지 않았습니다.

💬 리뷰 요구사항

  • up과 TCP probe_success의 표시 문구가 실제 측정 경계를 과장하지 않는지 확인 부탁드립니다.
  • 상태코드 카드의 실행 ID 필터와 unknown 별도 분류, 원장·Remote Write 최종 합계 대조를 중점적으로 봐 주세요.
  • 이슈 #448의 장애 실행은 포함되지만, 새 18패널 화면에서 장애를 재실행하지 않은 한계를 유지했습니다.

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: DocGrid/docgrid/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: b478f576-1cbc-422b-a5fd-122bf8caa57d

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Gimini-3

Gimini-3 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author

후속 대시보드 수정을 765a87b에 반영했습니다.

  • 실행 ID 목록 기준을 201 Counter에서 k6_vus로 바꿔 201이 0건인 실행도 선택할 수 있게 했습니다.
  • 2xx·3xx·4xx·5xx 카드에 동일한 VU 기반 0 대체를 적용하고, 0건·지표 부재가 성공처럼 보이지 않도록 기본 색을 회색으로 바꿨습니다.
  • 기존 hadash1009sm01(HTTP 403 6건·201 0건)을 실제 관측 Grafana에 수정 JSON으로 다시 표시했습니다. 실행 ID 선택 가능, 누적 카드 0·0·6·0건을 확인했습니다. 이는 기존 실행 재조회이며 새 장애·부하 시험은 아닙니다.
  • 로컬 대시보드 검사 11/11, Prometheus 합성 PromQL 판정 7/7, GitHub Monitoring Validation 통과. 실행별 기록은 회귀 요약에 분리해 두었습니다.

결과 불명은 여전히 HTTP 코드 대역 카드에 포함되지 않으며, 자동 새로고침만으로 새 실행 ID가 드롭다운에 나타나는지는 별도 리허설이 필요합니다.

@Gimini-3
Gimini-3 merged commit e501bf9 into develop Oct 9, 2026
2 checks passed
@Gimini-3 Gimini-3 self-assigned this Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Test] OpenSQL HA 대시보드와 실제 쓰기·장애 리허설

1 participant