[zookeeper] 쿼럼과 과반수 투표 (quorums & majority voting)

👷‍♂️

Zookeeper를 구성하는 경우 과반수 선출(majority voting/quorums)을 위해 zookeeper server의 수를 홀수로 구성할 것을 권고한다. 개발/테스트 환경을 위해서 1대로 구성하는 경우가 아니라면, 보통 3대로 구성하며 더 failure에 대해 견고하게 구성하고자 한다면 5대로 앙상블ensemble을 구성하게 된다.


Zookeeper를 짝수로 구성하면 어떤 문제가 생길까?

결론적으로 말하면 그렇다고 해서 문제가 생기지는 않는다. 다만 4대로 구성하는 경우는 결함failure 에 대한 수준이 3대로 구성한 것과 다르지 않으며, 6대로 구성한 경우도 5대로 구성한 경우와 다르지 않다.

예를들어, zookeeper server 4대로 운영하던 중 leader역할을 수행하던 zookeeper 서버에 장애(N/W, machine issue, etc..)가 발생하여 3대가 남았다고 가정해보자. 이 경우 follower 역할을 수행하던 남은 zookeeper server 중 랜덤한 한대가 leader 역할을 수행하게 된다. 이는 전체 앙상블을 이루던 4대 중 과반수인 3대가 정상적으로 서비스 되기 때문이다. 만약 추가적으로 1대의 zookeeper server가 문제가 발생해 2대의 zookeeper server만 남는 경우라면 과반수(>=3)을 넘지 못함으로 문제가 없는 것으로 판단되었던 다른 2대의 zookeeper server도 서비스를 종료하게 된다.

전체 4대의 zookeeper server로 구성했을 때 과반수는 3이기 때문에 1대의 zookeeper server 장애까지 내결함성fault-tolerance를 갖게 된다. 마찬가지로 전체 3대로 구성했을 때 과반수는 2가 되며, 동일하게 1대의 zookeeper server 장애까지 내결함성을 갖는다. 4대의 구성과 3대의 구성으로 인한 결함 허용 수준이 1대로 다르지 않기 때문에 홀수로 zookeeper 앙상블을 구성하라고 권고하는 것이다.

결과적으로 결함 허용수준(F) 에 따라서 다음과 같이 앙상블을 구성하는 zookeeper server 수(N)을 결정하면 된다. $$ N = 2*F+1 $$


Zookeeper는 과반수 투표majority voting 를 언제 사용하는 것인가?

zookeeper의 주요 기능인 atomic broadcast를 수행하기 위해서 majority quorums을 사용한다. 이는 분산처리 환경에서 데이터 저장, 조회, 처리를 위해서 필요한 기능으로, 빠르게 대량의 데이터를 처리하기 위해서는 올바른 데이터를 가지고 있는 과반수의 node들이 필요하게 된다.

예를들어 조회하는 데이터가 올바른지 확인하기 위해 quorum을 구성하고 있는 zookeeper server들의 데이터를 확인하게 되는데, 이때 과반수가 동일한 값을 가지고 있다고 한다면 그 값이 유효하다고 판단한다. 마찬가지로 데이터를 쓸 때에도 과반수의 zookeeper server에 해당 값이 write/update 되도록 보장해야 한다.

또한 새로운 리더 선출 작업leader activation(election)을 수행할 때에도 atomic broadcast를 사용하여 majority voting을 수행하여 올바른 데이터(과반수와 동일한 데이터)를 갖는 zookeeper server를 leader로 선출하게 된다.


Majority voting을 수행하지 않는 경우 어떻게 될까?

zookeeper는 분산 환경으로 구성되는 서비스이기 때문에 서로 다른 랙rack 또는 데이터센터datacenter에 구성할 수도 있다. 만약 majority voting을 사용하지 않게 되면 분산 환경에서 장애가 발생하는 경우 데이터에 대한 일관성consistency가 깨질 수 있다.

예를들어 2곳의 데이터 센터에 zookeeper 앙상블이 구성되어 있고 각각 3대의 zookeeper server를 가지고 있다고 가정해보자. (실제로 이렇게 짝수로 구성하진 않을 것이다. 그 이유는 위에 설명했다)

HDFS나 Kafka와 같은 서비스와 연계하여 잘 운영하다가, 스위치 장애와 같은 N/W 문제로 인해 데이터센터 간 통신이 되지 않는 상태에서 데이터센터 내부의 통신은 정상적일 수 있다. 이때 만약 majority voting을 사용하지 않는다면 하나의 zookeeper 앙상블에서 각 센터에 하나씩 2개의 leader가 선출될 수 있다.

이러한 상태에서 운영이 된다면 하나의 앙상블 이미지를 가지고 있어야 하는 zookeeper에서 두 개의 이미지(서로 다른 데이터 스냅샷)를 가지고 있는 것임으로 데이터간 정합성이 맞지 않게 된다. 이는 나중에 N/W 장애가 정상화 된다고 하더라도 데이터의 consistency가 맞지 않기 때문에 더 큰 서비스 문제가 발생할 수 있다.

그렇기 때문에 과반수정책/majority voting을 사용하게 되면 zookeeper 앙상블을 나눴을 때 무조건 한쪽만 과반수를 넘거나, 아니면 둘 다 과반수를 넘지 않게 된다. 서비스에 대한 가용성은 좀 떨어질 수 있겠지만 zookeeper는 서비스의 특성상 데이터 정합성consistency가 훨씬 중요하기 때문에 이를 무시한다.


참고 - https://youtu.be/XdTpygAO9SU - https://zookeeper.apache.org/doc/r3.4.6/zookeeperInternals.html