에듀테크 프로젝트 대시보드
가십 프로토콜 (Gossip)
수천 대의 서버에 "새 설정값이 바뀌었다"는 소식을 어떻게 퍼뜨릴까? 중앙 서버가 전부에게 방송하면 그 서버가 죽는 순간 끝이다. 가십 프로토콜은 사람들 사이 소문이 퍼지듯, 각 노드가 매 라운드 무작위 이웃 몇 명에게만 정보를 전달한다. 그런데도 전체 확산은 약 log N 라운드면 끝난다.
초반엔 알고 있는 노드가 적어 느리게 퍼지고(지수적 증가), 중반에 폭발적으로 번지다가, 후반엔 대부분 이미 알고 있어 "헛수고 메시지"가 늘며 완만해진다. fanout이 b일 때 전체 도달까지 대략 log₍b+1₎ N 라운드 — 노드가 100배 늘어도 라운드는 2배만 늘어난다.
| 방식 | 동작 | 특징 |
|---|---|---|
| Push | 정보를 가진 노드가 무작위 상대에게 "이거 받아" | 확산 초반에 빠름. 후반엔 이미 아는 노드끼리 보내 낭비 ↑ |
| Pull | 모르는 노드가 무작위 상대에게 "새 거 있어?" 하고 물음 | 확산 후반에 빠름(남은 소수가 금방 채움). 초반엔 물어봐도 허탕 |
| Push-Pull | 연결되면 서로의 최신 상태를 양방향으로 교환·병합 | 초반·후반 모두 빠름. 실무 표준. 도달 시간 O(log N)에 가장 근접 |
# 모든 노드가 주기적으로(예: 1초마다) 독립 실행 def gossip_round(self): peers = random.sample(self.known_nodes, k=self.FANOUT) # 무작위 이웃 b명 for p in peers: # push-pull: 내 버전 벡터를 보내고 상대 것을 받아 병합 their_state = p.exchange(self.state, self.version) self.state = merge(self.state, their_state) # 예: 항목별 최신 timestamp 채택 def merge(a, b): return { key: max(a.get(key), b.get(key), key=lambda v: v.ts) for key in a.keys() | b.keys() }
핵심은 merge가 교환·결합·멱등이어야 한다는 것 — 누가 누구에게 몇 번 보내든 결과가 같다. 그래서 순서·중복·재시도에 안전하다. (→ CRDT의 semilattice 병합과 같은 아이디어)
| 시스템 | 가십으로 하는 일 |
|---|---|
| Cassandra / ScyllaDB | 클러스터 멤버십·스키마 버전·노드 상태(up/down) 전파 |
| Consul / Serf (SWIM) | 장애 감지 + 멤버 목록 동기화, 이벤트 브로드캐스트 |
| Amazon DynamoDB | 노드 링 멤버십과 파티션 정보 공유(Dynamo 논문) |
| Bitcoin / Ethereum | 새 트랜잭션·블록을 P2P 네트워크에 flooding 전파 |
| HashiCorp / Kubernetes(일부) | 대규모 노드 헬스·메타데이터 저비용 전파 |