Swarm 모드에서의 Raft 합의

Swarm 모드에서의 Raft 합의

Docker Engine이 Swarm 모드로 실행되면, 매니저 노드들은 Raft Consensus Algorithm을 사용해서 클러스터 전체 상태를 관리해요. 이 합의 알고리즘 덕분에 여러 매니저 노드가 항상 동일한 상태를 유지할 수 있답니다. 그럼 왜 이런 합의 알고리즘이 필요한지, 어떤 특징을 갖는지 함께 살펴볼게요.

출처: 공식문서

본문

왜 합의 알고리즘이 필요할까요?

Swarm 모드가 합의 알고리즘을 사용하는 이유는 아주 간단해요. 클러스터에서 작업을 관리하고 스케줄링하는 모든 매니저 노드가 동일하고 일관된 상태를 저장하도록 하기 위해서예요. 클러스터 전체가 같은 상태를 유지하면, 예상치 못한 장애가 발생해도 어떤 매니저 노드든지 그 상태를 이어받아 서비스를 안정적으로 복구할 수 있거든요.

예를 들어볼게요. 클러스터에서 작업 스케줄링을 담당하는 리더 매니저가 갑자기 죽어버렸다고 해볼게요. 이때도 다른 매니저 노드가 스케줄링 작업을 이어받아서, 원하는 상태(desired state)에 맞게 작업 균형을 다시 맞출 수 있어요.

Raft 알고리즘의 핵심: 과반수 합의

분산 시스템에서 로그를 복제하기 위해 합의 알고리즘을 사용할 때는 특별한 주의가 필요해요. 이런 시스템은 장애가 발생해도 클러스터 상태를 일관되게 유지하기 위해, 노드들의 과반수(majority)가 값에 동의하도록 요구해요.

Raft는 최대 (N-1)/2 개의 장애를 허용하고, 클러스터에 제안된 값에 대해 (N/2)+1 개의 멤버, 즉 쿼럼(quorum)의 동의가 필요해요. 예를 들어 Raft를 사용하는 5개 매니저 클러스터에서 3개 노드가 사용 불가능해지면, 시스템은 더 이상 추가 작업을 스케줄링하는 요청을 처리할 수 없어요. 기존에 실행 중인 작업은 계속 돌아가지만, 매니저 집합이 건강하지 않으면 스케줄러가 장애에 대응해서 작업을 재조정할 수 없게 돼요.

Swarm 모드 합의 알고리즘의 분산 시스템 속성

Swarm 모드에서 합의 알고리즘을 구현한다는 것은, 분산 시스템에 내재된 다음과 같은 속성들을 갖는다는 뜻이에요.

  • 장애 허용 시스템에서 값에 대한 합의 (참고: FLP impossibility theoremRaft Consensus Algorithm paper)
  • 리더 선출 과정을 통한 상호 배제(mutual exclusion)
  • 클러스터 멤버십 관리
  • 전역적으로 일관된 객체 시퀀싱 및 CAS(compare-and-swap) 프리미티브

더 알아보기 (Learn more)