An audit against the standard the series set — concepts, procedure, commands, architecture diagram, evidence table, terminal output — found the three new experiments met it while twelve of the original ones had no diagram at all: A-0, A-1, A-3, A-4, A-5, A-6, A-8, B-0, B-2, B-7, C-2, D-2. Each now has one drawn from what that experiment actually found, not filler: A-0 shows sharing going through PostgreSQL rather than between the caches; A-3 the gap between the 200 and the WAL flush, with both failed injections; A-5 the three silent injection failures; A-6 the two places latency is multiplied; B-0 the repository keyed by principal with no session id; B-2 the primary key that causes the overwrite; D-2 why the rolling update stopped the accident halfway. Also corrected the index's stale claim of 11 experiments without a screenshot — it is 14, and the reason is recorded: those experiments were measured from terminals, the database and logs, and the observability stack does not scrape Redis, the BFF or PostgreSQL, so there is no console to photograph. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
56 lines
3.7 KiB
XML
56 lines
3.7 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 860 400" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif">
|
|
<style>
|
|
.box{fill:#fff;stroke:#8c959f;stroke-width:1.4;rx:6}
|
|
.dead{fill:#fff5f5;stroke:#cf222e;stroke-width:1.6;stroke-dasharray:5 3;rx:6}
|
|
.ok{fill:#f6fdf6;stroke:#1a7f37;stroke-width:1.6;rx:6}
|
|
.warn{fill:#fff8f0;stroke:#bf8700;stroke-width:1.5;rx:6}
|
|
.t{font-size:12px;fill:#1f2328}
|
|
.tb{font-size:12.5px;fill:#1f2328;font-weight:600}
|
|
.s{font-size:10.5px;fill:#656d76}
|
|
.ttl{font-size:14px;fill:#1f2328;font-weight:600}
|
|
.r{stroke:#cf222e;stroke-width:1.6;fill:none}
|
|
.g{stroke:#1a7f37;stroke-width:1.6;fill:none}
|
|
.k{stroke:#8c959f;stroke-width:1.3;fill:none}
|
|
</style>
|
|
<defs>
|
|
<marker id="a" markerWidth="8" markerHeight="8" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 z" fill="#8c959f"/></marker>
|
|
<marker id="ar" markerWidth="8" markerHeight="8" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 z" fill="#cf222e"/></marker>
|
|
<marker id="ag" markerWidth="8" markerHeight="8" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 z" fill="#1a7f37"/></marker>
|
|
</defs>
|
|
<text x="20" y="26" class="ttl">A-3 — 200 을 받은 로그인 153건 중 4건이 DB 에 없다</text>
|
|
<text x="20" y="44" class="s">버그가 아니라 synchronous_commit OFF 의 대가를 실측한 것이다</text>
|
|
<rect x="30" y="74" width="180" height="70" class="box"/>
|
|
<text x="46" y="96" class="tb">클라이언트</text>
|
|
<text x="46" y="116" class="s">로그인 요청</text>
|
|
<text x="46" y="134" class="s">200 + 토큰 수신</text>
|
|
<rect x="250" y="74" width="200" height="70" class="box"/>
|
|
<text x="266" y="96" class="tb">Keycloak</text>
|
|
<text x="266" y="116" class="s">트랜잭션마다</text>
|
|
<text x="266" y="134" class="s">SET LOCAL synchronous_commit OFF</text>
|
|
<rect x="490" y="74" width="180" height="70" class="warn"/>
|
|
<text x="506" y="96" class="tb">PostgreSQL</text>
|
|
<text x="506" y="116" class="s">COMMIT 을 즉시 반환</text>
|
|
<text x="506" y="134" class="s">WAL 은 아직 메모리에</text>
|
|
<rect x="710" y="74" width="120" height="70" class="box"/>
|
|
<text x="726" y="96" class="tb">디스크</text>
|
|
<text x="726" y="116" class="s">wal_writer_delay</text>
|
|
<text x="726" y="134" class="s">200ms 뒤 기록</text>
|
|
<path d="M212 108 L246 108" class="k" marker-end="url(#a)"/>
|
|
<path d="M452 108 L486 108" class="k" marker-end="url(#a)"/>
|
|
<path d="M672 108 L706 108" class="r" stroke-dasharray="4 3" marker-end="url(#ar)"/>
|
|
<text x="676" y="164" class="s" fill="#cf222e">이 구간이 비어 있다</text>
|
|
<rect x="620" y="180" width="210" height="40" class="dead"/>
|
|
<text x="636" y="205" class="t" fill="#cf222e">✂ 여기서 강제 종료</text>
|
|
<rect x="30" y="250" width="380" height="96" class="dead"/>
|
|
<text x="46" y="272" class="tb">결과 — RPO 는 0 이 아니다</text>
|
|
<text x="46" y="296" class="t">클라이언트가 200 받은 로그인 153 건</text>
|
|
<text x="46" y="316" class="t">그중 DB 에 실제로 존재 149 건</text>
|
|
<text x="46" y="336" class="t" fill="#cf222e">★ 유실 4 건</text>
|
|
<rect x="430" y="250" width="400" height="96" class="box"/>
|
|
<text x="446" y="272" class="tb">주입도 두 번 실패했다</text>
|
|
<text x="446" y="294" class="s">kubectl delete --force 는 크래시가 아니다 — 런타임이 SIGTERM 을 보내</text>
|
|
<text x="446" y="310" class="s">PostgreSQL 이 정상 플러시했고 유실이 0 이었다</text>
|
|
<text x="446" y="332" class="s">kill -9 1 도 무시된다 — PID 1 은 자기 네임스페이스의 SIGKILL 을 받지 않는다</text>
|
|
<text x="30" y="372" class="s">백엔드 프로세스를 죽여 postmaster 가 reinitialize 하게 만들자 비로소 "not properly shut down / redo starts" 가 찍혔다</text>
|
|
</svg>
|