뗏목이 여러 개의 나무로 이어져있어 일부 나무가 손상되어도 제 기능을 유지할 수 있듯이 뗏목 합의 알고리즘은 뗏목 처럼 여러 서버 중 일부 서버에 장애가 생겨도 제 기능을 유지하도록 하는 합의 알고리즘 입니다.
뗏목 합의 알고리즘을 이해하기 위해서는 다음 용어들을 먼저 이해해야 합니다.
뗏목 합의 알고리즘의 동작 원리
뗏목 합의 알고리즘에서는 다른 서버에게 합의를 요청할 때 상태 시스템과 로그를 사용합니다.
먼저 한 서버가 명령을 실행할 때 명령을 실행해도 되는지 다른 서버에게 합의를 구합니다. 합의를 한 서버는 같은 명령을 실행하고 동일한 상태를 유지하게 됩니다. 이미 합의를 한 서버는 명령 실행을 위해 다시 합의를 구할 필요가 없습니다.
반면에 오류가 발생한 서버가 절반 이상이라면 해당 명령의 진행은 중단되지만, 오류가 발생한 서버가 명령으로 인한 잘못된 결과는 반환하지 않습니다.
뗏목 알고리즘 시나리오
한 서버(S5)가 어떤 조건이 충족되어 로그의 명령을 적용하고 다른 서버에게 합의를 요청하면, 다른 모든 서버는 해당 명령에 합의하고 해당 명령을 수행하여 모두 동일한 상태를 유지하게됩니다.
일부 서버에만 장애가 발생한 경우, 장애가 발생한 서버는 합의를 할 수 없기 때문에 명령을 수행하지 못한체 그대로 남게되고, 합의한 서버들은 해당 명령을 수행하여 장애가 발생한 서버를 제외하고는 모두 동일한 상태를 유지하게 됩니다.
장애가 발생한 서버가 절반 이상일 경우, 합의를 요청해도 결과가 반환되지 않습니다. 때문에 합의를 요청한 서버는 다음 로그로 넘어가면서 다른 서버들에게 계속 합의를 요구하게 됩니다.
도커 스웜에서는 매니저 노드의 절반 이상에 장애가 발생한 경우, 장애가 생긴 매니저 노드가 복구될 때까지 클러스터의 운영을 중단하게 됩니다.
만약 매니저 노드사이에 네트워크 파티셔닝과 같은 현상이 발생했을 경우 짝수 개의 매니저로 구성한 클러스터는 운영이 중단될 수도 있지만 홀수 개로 구성했을 경우에는 과반수 이상이 유지되는 쿼럼(quorum) 매니저에서 운영을 계속할 수 있습니다.
따라서 매니저 노드는 가능한 한 홀수 개로 구성하는 것을 권장합니다.