클러스터

단일 Wippy 노드는 완전한 런타임입니다. 클러스터는 여러 노드를 하나의 조율된 시스템으로 묶습니다. 프로세스는 어느 노드에서든 이름으로 등록하고 도달할 수 있으며, 락과 그룹을 통해 조율하고, 공유 합의 코어에 의존할 수 있습니다 — 코드에서 스폰, 전송, 슈퍼비전 방식을 바꿀 필요 없이.

클러스터링은 선택 사항입니다(cluster.enabled). 이 페이지는 코드가 바라보는 모델을 설명합니다. 토폴로지, 설정, 운영에 대해서는 클러스터 가이드를 참고하세요.

모델

노드는 gossip(SWIM)을 통해 서로를 발견합니다 — 노드가 시드 노드를 지정하여 참여하면, 멤버십과 장애 감지가 코디네이터 없이 수렴합니다. gossip 위에는 소규모의 경계가 명확한 Raft 코어가 있습니다. 고정된 투표자 집합이 선형화 가능한 합의를 제공하고, 나머지 노드들은 gossip을 사용합니다. 대부분의 노드는 합의 부하를 부담하지 않으므로 클러스터는 확장 가능하면서도, 합의가 필요한 항목에 대해서는 단일 신뢰 소스를 유지합니다.

클러스터가 코드에 제공하는 것은 세 가지 개념으로 요약됩니다: 이름, 라우팅, 조율 프리미티브.

이름 지정

프로세스는 일반적으로 PID로 주소가 지정됩니다. 클러스터에서는 이름으로 등록하여 어디서든 그 이름으로 도달할 수도 있습니다. 중요한 결정은 스코프 — 원하는 일관성 보장과 그에 따른 비용 간의 트레이드오프입니다:

스코프 가시성 보장 사용 사례
Local 이 노드 즉시, 조율 없음 노드 로컬 헬퍼
Eventual 클러스터 전체 gossip 이후 수렴; 충돌은 해결되고 패자에게 알림 서비스, 그룹, 제한된 프레즌스 이름
Consistent 클러스터 전체 Raft를 통한 선형화 가능한 싱글턴 표준 클러스터 전체 네임드 서비스
Strong 클러스터 전체 Consistent에 더해 모든 라이브 노드가 이름이 활성화되기 전에 확인 컨트롤 플레인 싱글턴과 락

스코프는 일관성 대 비용 축에서 엄격한 순서를 형성합니다 — Local < Eventual < Consistent < Strong. 필요한 보장을 충족하는 가장 약한 스코프를 선택하세요. 이름은 process.registry를 통해 등록되며, 소유 프로세스가 종료되거나 해당 노드가 이탈할 때 자동으로 해제됩니다.

라우팅

이름 지정은 이름이 올바른 프로세스에 안정적으로 도달할 때만 유용합니다. 라우팅이 둘을 연결하며, 몇 가지 일관된 규칙을 따릅니다:

  • 읽기는 로컬입니다. 모든 노드는 자체 복제본 또는 gossip으로 전파된 캐시에서 이름을 확인합니다 — 이름 조회를 위한 네트워크 왕복이 없습니다. 이로써 해석이 빠르게 유지되고 파티션 중에도 동작합니다.
  • 해석은 고정된 순서를 따릅니다. 이름은 Consistent(Raft), 그 다음 Eventual(gossip), 그 다음 Local 순으로 플레인을 가로질러 해석됩니다 — 따라서 클러스터 전체 이름이 같은 문자열의 로컬 이름보다 우선합니다.
  • 쓰기는 권한 노드로 라우팅됩니다. Consistent 또는 Strong 등록은 Raft 리더를 통해 이루어지며, 리더가 아닌 노드는 쓰기를 전달하고 결과를 기다립니다. 커밋되면 활성 바인딩이 gossip으로 전파되어 Raft 코어에 속하지 않은 노드를 포함한 모든 노드가 이후 이름을 로컬에서 해석할 수 있습니다.
  • 메시징은 PID로 라우팅됩니다. 이름으로 process.send를 호출하면 PID로 해석되고 릴레이가 소유 노드에 메시지를 전달합니다. 코드는 프로세스가 이 노드에 있든 다른 노드에 있든 동일한 방식으로 주소를 지정합니다 — 위치는 투명합니다.

결과적으로: 어느 노드가 권한을 갖는지 생각하지 않고 이름을 등록하고 조회할 수 있으며, 메시지는 로컬에서와 동일한 방식으로 클러스터 전체에서 대상을 찾습니다.

프리미티브

클러스터링은 소규모의 빌딩 블록을 노출합니다. 각각은 자체 페이지에서 전체 문서를 제공합니다. 개념적으로는 다음과 같은 것을 구축할 수 있게 합니다:

  • 멤버십과 식별 — 라이브 노드 집합과 이 노드의 신원 및 역할. 피어를 발견하거나 작업을 샤딩할 때 사용합니다. system.clustersystem.node를 참고하세요.
  • 합의 상태 — 진단과 리더 인식 로직을 위한 Raft 리더, 텀, 이 노드의 역할. system.raft를 참고하세요.
  • 클러스터 전체 이름 — 이름과 스코프로 프로세스를 등록하고 해석하는, 다른 모든 것이 기반으로 삼는 토대. process.registry를 참고하세요.
  • 분산 락 — 최대 하나의 보유자를 가진 클러스터 전체 상호 배제로, 보유자가 죽으면 자동으로 해제됩니다. system.lock를 참고하세요.
  • 프로세스 그룹 — Erlang 스타일로 네임드 그룹에 참여하고 모든 노드의 모든 멤버에게 브로드캐스트합니다. 프로세스 그룹을 참고하세요.

이것들은 의도적으로 프리미티브합니다. 락과 네임드 싱글턴은 Strong 이름 스코프 위에, 프로세스 그룹은 gossip 위에 구축되며, 모두 위에서 설명한 동일한 멤버십과 라우팅 위에 있습니다 — 따라서 각각이 자체적인 분산 방식을 발명하는 대신 예측 가능하게 조합됩니다.

참고