← 목록
기타 2026-07-09 5KB 읽기 4분

Q피어 P2P 스플릿브레인 게이팅 + 포트 채번 (2026-07-09)

개요

Q피어(P2P 게이트웨이 메시, /Users/ef/crowny-gateway/게이트웨이Q/)의 적대검증 지적사항 수정: 동기화판정(gateway.yaml SHA)이 로그만 하고 페일오버 결정에 미강제였던 문제를 게이팅 로직으로 해소. Q피어는 현재 라이브 미배선(그림자 검증만), 라이브 게이트웨이(8080/8443/9100/9152)는 무접촉.

1. 포트 채번

  • Q피어 serve 기본포트 9152 → 9180 (gateway-peer로 crowny-ports.sh 채번, gateway.yaml SSOT 반영)
  • 사유: 9152는 게이트웨이관제(crowny-gateway-monitor) 라이브 점유 중, 9190은 heartbeatPort 기점유
  • 변경 파일: Q피어.한선(QP_PORT 기본값 주석+변수), Q피어.sh(PORT 기본 파라미터)
  • gateway.yaml에 crowny-gateway-peer(domain: gateway-peer, upstream :9180) 선언 항목 자동 추가(crowny-ports.sh set이 생성) — 라우팅 결선은 안 함, 선언만.

2. 스플릿브레인 게이팅 (3종)

Q피어.한선에 추가:

(a) SHA 드리프트 페일오버 제외: 전체프로브실행()/페일오버목록조회() 둘 다 — 자기 자신이 정족수상 "정상"(과반 일치)일 때만, 자기 해시와 불일치(동기화==옴)하는 피어를 페일오버풀에서 제외. 서로 다른 라우팅으로 갈리는 스플릿브레인 원천 차단.

(b) 자기자신·중복 노드ID 가드: _노드ID동일존재() 헬퍼 신설. 피어목록로드()에서 중복 노드ID 로드 자체를 스킵, 전체프로브실행()/페일오버목록조회() 양쪽 루프에서 자기ID와 일치하는 행 및 중복 행을 방어적으로 스킵(자기 페일오버·무한루프 방지). 페일오버목록조회()는 이제 자기ID 파라미터를 추가로 받는다(entrypoint 호출부 갱신).

(c) 정족수(quorum) 판정: 응답한(상태!=타) 피어 중 자기 SHA와 일치하는 수가 **과반(1치*2 > 응답수)**일 때만 자신을 "정상"(상태_티)으로 판정. 과반 미달(소수파/드리프트 의심)이면 상태_음으로 자기판정 보류하고 SHA 필터를 적용하지 않음(자기 판단을 못 믿으므로 응답피어 전원 반환) + 경고 로그로 상급자(허브/운영자) 이관 신호.

3. 그림자 검증 (루프백 4노드, 실측)

포트 9155(qA)/9156(qB)/9157(qC)/9160(qD), qA·qB·qD는 동일 gateway.yaml 내용(SHA 일치), qC는 드리프트(다른 내용).

시나리오결과
qA(다수파) probe응답피어=3 SHA일치=2 → 정족수=티 → qC를 페일오버풀에서 제외("가드a" 로그) → 활성=qB,qD
qC(소수파/드리프트) probe응답피어=3 SHA일치=0 → 정족수=음 → 경고 로그, SHA필터 미적용 → 활성=qA,qB,qD(전원)
qA failover 재로드(상태파일만)probe와 동일 필터 재현 — qC 제외, 활성=qB,qD
qC failover 재로드probe와 동일 — 정족수=음, 활성=qA,qB,qD
자기자신 행 포함 피어목록(qA 자신 포함)프로브 루프에서 자기 자신 스킵(가드b)
피어목록에 qB 중복행로드 단계에서 "중복 노드ID 무시(가드): qB" 스킵
합성 상태파일(자기행+중복행+타상태)재로드에서 "자기자신 노드ID 스킵" + "중복 노드ID 스킵" 동시 확인, 활성=qB만(qC는 상태=타로 원래도 제외)
컴파일: hanseonc_high Q피어.한선 — 경고/에러 없음, 11659 큐브 생성. 프로세스: 4개 shadow crownyc 인스턴스 kill 완료, 포트 9155/9156/9157/9160 반납, /tmp 검증 파일 정리 완료. 라이브 8080/8443/9100/9152는 검증 전후 프로세스 변동 없음(재확인).

관련 파일

  • /Users/ef/crowny-gateway/게이트웨이Q/Q피어.한선 (판정 정본, 수정)
  • /Users/ef/crowny-gateway/게이트웨이Q/Q피어.sh (기동 래퍼, 포트 기본값 수정)
  • /Users/ef/crowny-gateway/게이트웨이Q/피어목록.psv (미변경 — 테스트는 scratchpad 별도 파일 사용)
  • /Users/ef/crowny-gateway/gateway.yaml (crowny-gateway-peer 선언 항목 추가, crowny-ports.sh 자동)

잔여 이슈

  • Q피어는 여전히 라이브 미배선(허브의 실전파(push) 로직도 아직 없음 — 요구사항 3 범위 밖, 로그+4상 판정까지만).
  • 정족수 계산은 "응답 피어" 중 다수결이며 자기 자신은 표에 포함하지 않음(설계상 의도 — "과반 정상피어와 SHA 일치"라는 문구를 문자 그대로 반영). 응답 피어가 짝수이고 정확히 반반 갈리면 자기판정=음(보수적 방향)으로 수렴 — 실측 확인(qA 시나리오는 응답3/일치2로 홀수라 명확한 다수 사례).
  • 페일오버목록조회()의 자기ID 파라미터는 옵션(빈 문자열 허용, 자기가드 스킵)이지만 Q피어.sh 래퍼는 항상 NODEID를 넘기므로 실사용 경로에서는 항상 채워짐.