Repository navigation
[Test] OpenSQL Primary 분할 시 성공 응답 보존과 멱등 재전송 검증 - #548
Merged
Merged
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
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. Comment |
Gimini-3
marked this pull request as ready for review
October 17, 2026 15:24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
목적
살아 있는 OpenSQL Primary가 앱에서는 접근 가능하지만 두 Standby·etcd 다수와는 통신하지 못하는 네트워크 분할을 재현했습니다. 시험 목적을 세 가지로 분리했습니다.
201을 받은 쓰기가 Primary 승격 후에도 남는가?201보존과 장애 중 요청 가용성은 각각 어떤가?결론: 비동기 회차는
201632건 중 40건이 승격 후 누락돼 데이터 보존 기준에 실패했습니다. 동기 strict 회차에서는 최초201누락이 0건이었지만 장애 중 HTTP 오류·결과 불명이 발생했습니다. 동기 모드의 멱등 본 시험에서 751건 전체를 재전송한 뒤에는 최종 DB 751건, 요청 ID당 1행, 중복 0건이었습니다. 재전송을 포함한 복구 성공이며 장애 중 무중단 처리를 뜻하지 않습니다.테스트 환경
synchronous_mode=None; 동기 회차와 멱등 본 시험synchronous_mode=on,synchronous_mode_strict=true0e81a60에 고정. 클라우드 앱 A/B의 정확한 배포 소스 커밋은 확정하지 못함테스트 방법
1. 비동기 모드 — 최초 성공 응답의 보존
실행 ID:
partnet01· 위치: GCP 격리 환경 · 방법: 일반 쓰기 API에 5 req/s × 150초로 751건을 보냈습니다. 분할 중에도 앱에서 옛 Primary에 접속할 수 있게 두고, DB 밖에 기록한 요청별 최초 HTTP 응답과 승격 후 새 Primary의 요청 ID 원장을 대조했습니다.사전 성공 기준: 최초
201응답 ID의 DB 누락 0건, 중복 0건. 비동기 시험 보고서·개별 로그.2. 동기 strict 모드 — 보존과 가용성의 분리
syncpart01: GCP 격리 환경에서 일반 쓰기 API에 5 req/s × 150초, 별도 요청 751건을 보냈습니다. 최초201이 승격 후 보존되는지와 HTTP 실패 수를 각각 확인했습니다. 동기 strict 시험 보고서.ha501base01·진단ha502diag01: 멱등 쓰기 API의 정상 기준선(76건)과 분할 중 오류 단계 관측(241건)을 별도 실행으로 준비했습니다.ha503part01: 같은 GCP 경로의 멱등 쓰기 API에 5 req/s × 150초로 새 합성 ID 751개를 보냈습니다. 당시 Primary와 두 peer의 통신을 약 77초 차단했습니다. 재전송 전에 최초 응답 원장과 새 Primary의 DB 원장을 고정하고, 앱 실패 단계·LB healthy 수를 별도 수집했습니다. 본 시험·진단 보고서.사전 성공 기준: 미전송 0건, 최초
201의 DB 누락·중복 0건, 복구 후 단일 Primary. HTTP 실패와 결과 불명은 성공 응답에 합치지 않고 별도로 집계해 가용성을 판정했습니다.3. 같은 요청 재전송 — 최종 처리와 멱등성
실행 ID:
ha503replay01· 위치: 같은 GCP 격리 환경 · 방법: 네트워크 복구 후ha503part01의 동일한 751개 ID·payload를 30 req/s로 각각 한 번씩 재전송했습니다. 재전송 결과와 최종 DB의 ID별 행 수를 대조했습니다. 별도ha503conflict01에서는 기존 ID에 다른 payload를 보내 충돌 처리와 DB 불변을 확인했습니다.사전 성공 기준: 기존 585개 ID는
200, DB에 없던 166개 ID는201, 최종 751개 ID 모두 1행씩, 다른 payload는409. 재전송 시험 보고서, ID별 최종 대조.관측 결과
partnet01201632, 실패 HTTP 114, 결과 불명 5201중 40건 누락. 재전송하지 않은 별도 실행syncpart01201586,50077,50381, 결과 불명 7201누락·중복 0ha503part01201585,500112,50346, 결과 불명 8201누락·중복 0; 나머지 166개 ID는 DB에 없음ha503replay01200, 없던 166건201; 기타·불명·미전송 0ha503conflict01409원장 관계: ①의 751건과 ②의 각 751건은 서로 다른 시험·요청 ID입니다. ③만 ②의
ha503part01과 정확히 같은 751개 ID를 재전송했습니다. 비동기 회차의 누락 40건이 이 재전송으로 복구됐다는 뜻이 아닙니다. 동기 본 시험의 최초 실패·결과 불명 166건도 첫 시도에 처리된 것이 아니라 재전송 때 새로 처리됐습니다.본 시험
ha503part01의500112건은 모두 앱의 허용 목록 진단 이벤트와 연결됐습니다. 트랜잭션 시작 108건, 커밋 대기 4건입니다.50346건에는 대응하는 앱 진단 이벤트가 없고 같은 장애 구간에 LB healthy 0/2 표본 2개가 있었지만, 요청별 LB 로그를 수집하지 않아 각503의 반환 주체는 확정하지 않았습니다. 최초 HTTP 원장, 재전송 전 DB, 재전송 후 DB.검증 과정에서 확인된 사항
ha502diag01의40120건은 권한 확인 단계의 DB 연결 오류 이벤트와 연결됐습니다. 이를 토큰 만료로 단정하지 않습니다.final_pass=true,idempotency_pass=true,initial_201_missing_before_retry=0,final_missing_sent_ids=0,db_duplicate_ids_after_retry=0을 산출했습니다. 이는 해당 합성 시험 계약의 결과이지 모든 사용자 요청에 대한 일반 보장이 아닙니다.