현재 테스트 중입니다: 완료되면 GitHub 코드를 오픈할 예정입니다.

프로토콜 — 서버 ↔ 서버 (클러스터)

클러스터 모드에서만 사용되는 피어 RPC 프로토콜입니다. 노드들은 Raft 합의로 하나의 락 상태를 공유합니다 — 모든 락 상태 변경(획득·반납·만료)이 리더의 제안 → 과반 복제 → 커밋을 거친 뒤에만 적용되므로, 분단·장애조치 중에도 상호배제가 유지됩니다. 개념 설명은 동작 원리를 참고하세요.

흐름 — 획득 한 건이 커밋되기까지

클라이언트
리더
팔로워 1
팔로워 2
A · 획득 (key)
AppendEntries (Grant)
AppendEntries (Grant)
OK
과반 도달 → 커밋, 모든 노드가 적용
A · 획득됨 (token)
요청응답합의 RPC (Raft)

리더는 락 명령을 복제 명령으로 만들어 AppendEntries에 실어 보내고, 자신을 포함한 과반이 받아 적으면 커밋합니다(3노드면 리더 + 팔로워 1로 충분 — 나머지 응답은 기다리지 않습니다). 클라이언트 응답은 커밋 이후에만 나가므로, 응답을 받았다면 그 락은 과반에 새겨진 상태입니다.

포트·주소 규칙

  • 클라이언트 주소(cluster_self)와 Raft 주소(cluster_raft_self)는 서로 다른 명시적 주소입니다. 임의의 외부 포트 매핑에서도 정확한 피어 identity를 검증해야 하므로 +1000 자동 파생은 사용하지 않습니다.
  • cluster_peers의 항목은 NodeId@incarnation@client_addr@peer_addr 형식입니다. M 리다이렉트에는 client_addr만 실려 나가며, Raft RPC는 peer_addr로 접속합니다.
  • 방화벽에서는 클라이언트 포트와 Raft 포트를 구분하고, Raft 포트는 인증된 피어만 접근하는 private network에 제한합니다.
  • listener 역할은 포트로 구분하지만, 인증 뒤 peer hello에서 cluster_id, wire version, source/target NodeId와 process incarnation을 다시 검증합니다. 접속 수립 순서와 인증·TLS 규칙은 접속 수립 · 인증을 참고하세요.

목차

참고