{ "version": "1.1", "id": "ghost-row-cleanup-order", "title": "유령 행을 지운 쪽과 그 시각", "question": "SIGKILL 로 끊긴 노드의 JGROUPS_PING 행은 누가, 언제 지우는가", "type": "sequence", "direction": "LR", "audience": [ "Keycloak 클러스터를 쿠버네티스에 올리는 엔지니어" ], "summary": "행을 지운 화살표는 죽은 노드가 아니라 남아 있는 코디네이터에서 나오고, 클러스터 뷰가 바뀐 초와 같은 초에 찍힌다.", "alt": "kubectl 이 강제 종료한 Keycloak 노드가 클러스터에서 빠지고, 남은 노드가 JGROUPS_PING 의 행을 지운 뒤 다른 이름의 새 노드가 합류하는 시간 순서.", "long_description": "왼쪽부터 kubectl, keycloak-0-60375, keycloak-1-36736, JGROUPS_PING, keycloak-0-16105 다섯 참여자가 생명선으로 선다. 1번 메시지에서 kubectl 이 keycloak-0-60375 를 --grace-period=0 --force 로 끊는다. 2번에서 07:40:28 에 남은 노드 keycloak-1-36736 의 뷰에서 그 노드가 빠진다. 3번이 이 그림의 중심이다 — 같은 07:40:28 에 JGROUPS_PING 의 행을 지우는 화살표가 keycloak-1-36736 에서 나온다. 강제 종료로 이미 끊긴 keycloak-0-60375 의 생명선에서는 테이블로 가는 화살표가 없다. 4번에서 20초 뒤 07:40:48 에 keycloak-0-16105 가 합류한다. 돌아온 노드의 이름은 접두사 keycloak-0 만 같고 접미사가 다르다.", "source_context": { "document": "docs/keycloak-session-store/final/document.md", "document_sha256": "88a081390dff22cd4171d5f9b534e46a37f6295c3b2652bc4c6fff0b578d5c6b", "anchor": { "kind": "heading", "value": "관측 (observed)", "line": 892 } }, "composition": { "profile": "sequence", "diagram_only": true, "reference_ids": [ "payment-approval-sequence" ], "rationale": "지배적 질문이 「누가 언제 지웠나」라 참여자 사이의 시간 순서가 논지다. 정적 구성도로 그리면 행을 지운 주체가 어느 생명선에서 나오는지가 사라진다.", "focus_node": "coordinator" }, "groups": [], "nodes": [ { "id": "kubectl", "label": "kubectl", "kind": "participant", "role": "participant", "description": "파드를 정상 종료와 강제 종료로 끊는 쪽.", "evidence": [ { "start_line": 886, "end_line": 888 } ], "assumption": false }, { "id": "dying", "label": "keycloak-0-60375", "kind": "participant", "role": "participant", "details": [ "SIGKILL" ], "emphasis": "warning", "description": "강제 종료로 끊긴 노드. 자기 행을 지우고 나갈 틈이 없다.", "evidence": [ { "start_line": 898, "end_line": 901 } ], "assumption": false }, { "id": "coordinator", "label": "keycloak-1-36736", "kind": "participant", "role": "participant", "details": [ "코디네이터" ], "emphasis": "primary", "description": "남아 있는 코디네이터. 정리 주체다.", "evidence": [ { "start_line": 914, "end_line": 916 } ], "assumption": false }, { "id": "pingtable", "label": "JGROUPS_PING", "kind": "participant", "role": "participant", "description": "노드 행이 등록되는 발견 테이블.", "evidence": [ { "start_line": 888, "end_line": 888 } ], "assumption": false }, { "id": "rejoined", "label": "keycloak-0-16105", "kind": "participant", "role": "participant", "details": [ "새 접미사" ], "description": "복구 뒤 올라온 노드. 접두사만 같다.", "evidence": [ { "start_line": 918, "end_line": 920 } ], "assumption": false } ], "edges": [ { "id": "m1", "from": "kubectl", "to": "dying", "label": "delete pod --force", "kind": "request", "order": 1, "evidence": [ { "start_line": 886, "end_line": 888 } ], "assumption": false }, { "id": "m2", "from": "dying", "to": "coordinator", "label": "이탈 07:40:28", "kind": "event", "style": "dashed", "order": 2, "evidence": [ { "start_line": 906, "end_line": 907 } ], "assumption": false }, { "id": "m3", "from": "coordinator", "to": "pingtable", "label": "행 삭제 07:40:28", "kind": "data", "emphasis": "primary", "order": 3, "evidence": [ { "start_line": 897, "end_line": 898 }, { "start_line": 914, "end_line": 916 } ], "assumption": false }, { "id": "m4", "from": "rejoined", "to": "coordinator", "label": "합류 07:40:48", "kind": "event", "style": "dashed", "order": 4, "evidence": [ { "start_line": 908, "end_line": 909 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "코디네이터 로그는 뷰 변경만 보여 주고 JGROUPS_PING 의 행이 어느 생명선에서 지워지는지는 보여 주지 않는다. 그 화살표 하나를 자리로 세우려고 sequence 를 골랐다." } }