만자의 개발일지

[Docker] 뗏목 합의 알고리즘이란 본문

Docker

[Docker] 뗏목 합의 알고리즘이란

박만자 2022. 6. 14. 19:01

본 내용은 도커 스웜에 대한 지식을 필요로 합니다.

들어가기에 앞서 도커 스웜에 대해 궁금하시다면 아래 글을 참고해 주세요.

https://yoo11052.tistory.com/181

 

[Docker] Docker Swarm이란

Container Orchestration 컨테이너 오케스트레이션이란 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하는 것을 말합니다. 컨테이너 오케스트레이션을 사용해 다음과 같은 작업을 자동화하고 관리

yoo11052.tistory.com

 

도커 스웜에서 매니저 노드는 클러스터의 모든 정보를 포함하고 있습니다. 때문에 매니저 노드가 죽게되면 클러스터도 다운되게 됩니다.
이러한 문제를 해결하기 위해 도커 스웜은 뗏목 합의 알고리즘을 이용한 멀티 매니저 노드 기능을 지원합니다.
멀티 매니저 노드 기능을 사용하면 여러 개의 매니저 노드를 생성하여 한 매니저 노드(리더 매니저 노드)가 갑자기 죽게 되더라도 다른 매니저 노드가 다시 서비스를 안정적인 상태로 복원할 수 있습니다. 
하지만 이를 위해서는 모든 매니저 노드가 동일한 상태를 유지하고 있어야 하는데, 이때 사용되는 알고리즘이 뗏목 합의 알고리즘 입니다.

 

뗏목 합의 알고리즘(Raft consensus algorithm)

뗏목이 여러 개의 나무로 이어져있어 일부 나무가 손상되어도 제 기능을 유지할 수 있듯이 뗏목 합의 알고리즘은 뗏목 처럼 여러 서버 중 일부 서버에 장애가 생겨도 제 기능을 유지하도록 하는 합의 알고리즘 입니다.

 

뗏목 합의 알고리즘을 이해하기 위해서는 다음 용어들을 먼저 이해해야 합니다.

  • 합의 알고리즘(Consensus Algorithm)
    • 다수의 참여자들이 동일된 의사 결정을 하기 위해 사용되는 알고리즘이다.
    • 한 서버에서 명령을 실행 하기 위해 다른 서버에게 합의를 요청하게 된다. 다른 서버들은 자신의 서버에 문제가 없는지 판단하고, 해당 명령을 실행하여 모두 동일한 상태를 유지하게 된다.
  • 장애 허용 분산 시스템(fault-tolerance distributed system)
    • 시스템 중 일부에 오류가 발생해도 정상적으로 작동할 수 있도록 하는 시스템이다.
    • 뗏목의 일부 나무가 손상되어도 제 기능을 유지하는 것과 같다.

 

뗏목 합의 알고리즘의 동작 원리

뗏목 합의 알고리즘에서는 다른 서버에게 합의를 요청할 때 상태 시스템과 로그를 사용합니다.

  • 로그
    • 시스템의 처리 내용과 이용 상황을 시간 흐름에 따라 기록한 것이다.
    • 로그에 있는 명령을 합의하는 데에 사용한다.
  • 상태 시스템
    • 각 상태를 조건에 따라 연결해 놓은 것이다.
    • 어떤 조건이 충족되거나 이벤트가 발생하면 현재 상태에서 다음 상태로 이동하는 동작을 수행한다.
    • 각 상태 시스템은 로그로부터 입력을 받는다.
    • 상태 시스템은 오류를 허용하려는 특징을 지닌다. 때문에 여러 서버 중 특정 서버에 장애가 생겨도, 클라이언트는 정상 작동하는 다른 상태 시스템과 상호작용할 수 있다.

 

먼저 한 서버가 명령을 실행할 때 명령을 실행해도 되는지 다른 서버에게 합의를 구합니다. 합의를 한 서버는 같은 명령을 실행하고 동일한 상태를 유지하게 됩니다. 이미 합의를 한 서버는 명령 실행을 위해 다시 합의를 구할 필요가 없습니다.

 

반면에 오류가 발생한 서버가 절반 이상이라면 해당 명령의 진행은 중단되지만, 오류가 발생한 서버가 명령으로 인한 잘못된 결과는 반환하지 않습니다.

 

뗏목 알고리즘 시나리오

1. 모든 서버가 정상적으로 작동하는 경우

한 서버(S5)가 어떤 조건이 충족되어 로그의 명령을 적용하고 다른 서버에게 합의를 요청하면, 다른 모든 서버는 해당 명령에 합의하고 해당 명령을 수행하여 모두 동일한 상태를 유지하게됩니다.

 

2. 일부 서버에 장애가 발생한 경우

일부 서버에만 장애가 발생한 경우, 장애가 발생한 서버는 합의를 할 수 없기 때문에 명령을 수행하지 못한체 그대로 남게되고, 합의한 서버들은 해당 명령을 수행하여 장애가 발생한 서버를 제외하고는 모두 동일한 상태를 유지하게 됩니다.

 

3. 절반 이상의 서버에 장애가 발생한 경우

장애가 발생한 서버가 절반 이상일 경우, 합의를 요청해도 결과가 반환되지 않습니다. 때문에 합의를 요청한 서버는 다음 로그로 넘어가면서 다른 서버들에게 계속 합의를 요구하게 됩니다.

 

도커 스웜에서는 매니저 노드의 절반 이상에 장애가 발생한 경우, 장애가 생긴 매니저 노드가 복구될 때까지 클러스터의 운영을 중단하게 됩니다.
만약 매니저 노드사이에 네트워크 파티셔닝과 같은 현상이 발생했을 경우 짝수 개의 매니저로 구성한 클러스터는 운영이 중단될 수도 있지만 홀수 개로 구성했을 경우에는 과반수 이상이 유지되는 쿼럼(quorum) 매니저에서 운영을 계속할 수 있습니다.
따라서 매니저 노드는 가능한 한 홀수 개로 구성하는 것을 권장합니다.

 

참고

Comments