분산 애플리케이션을 위한 분산 코디네이션 서비스
분산 애플리케이션을 위한 동기화, 설정, 그룹, 네이밍에 대한 추상화된 수준의 서비스를 제공
이를 API로 제공해 사용하기 쉽고, 데이터 모델도 디렉토리 구조를 이용하고 있어 이해하기 쉽다는 장점
분산 시스템에 있어서 코디네이션 기능은 매우 중요하지만, Lock, Race condition, Deadlock 등의 이유로 구현하기 까다로움. Zookeeper를 이용하면 코디네이션은 주키퍼에게 맡기는 형태로 쉽게 구현이 가능
ZNodes
파일 시스템과 유사한 shared hierarchical namespace를 통해 분산 프로세스가 상호작용할 수 있게 함
네임스페이스는 zookeeper용어로 데이터 레지스터로 구성. 저장용으로 설계된 파일시스템과 달리 데이터가 메모리에서 처리되기 때문에(파일형태로 저장해서 휘발되지는 않음), High throughput과 low latency를 제공
비기능적 특징
Zookeeper의 요구사항
High Performance
High Available
Strictly Ordered Access
복제된 구성요소
Zookeeper는 ensemble(앙상블)이라는 호스트 집합을 통해서 복제
Persistent store(disk)에 트랜잭션 로그, 스냅샷, 메노리 내 상태 이미지를 유지
Cluster를 구성하는 서버들 중 과반수(Quorum)이상이 유지된다면, 일부 장애나 문제가 있어서 전체 Zookeeper 서비스는 유지됨(홀수로 구성하며(과반수), 최소 설치 대수는 3대)
클라이언트는 Zookeeper 연결에 대해 다음 기능을 수행할 수 있음
request
response
watch event
heartbeat
클라인언트는 연결된 서버(Zookeeper)에 대한 TCP 연결이 끊어지면, Cluster 내의 다른 서버에 연결함
Ordered
Performace
Replication & read
Request Processor를 제외하면 Zookeeper 서비스를 구성하는 각 서버는 각 구성요소의 자체 복사본을 복제함
복제된 데이터베이스는 전체 데이터 트리를 포함하는 in-memory 데이터베이스임. update는 복구를 위해 디스크에 기록되고, 쓰기는 메모리 내 데이터베이스에 적용되기 전 디스크에 serialization됨
Contract Protocol
모든 Zookeeper 서버는 클라이언트에 서비스를 제공
클라이언트는 cluster 중 하나의 서버에 연결을 요청
read request는 각 서버 데이터베이스의 로컬 복제본에서 처리
서비스 상태를 변경하는 write 요청은 contract protocol에 의해 처리됨
Zookeeper 클러스터의 서버는 역할에 따라 leader와 follower로 나뉨
leader : 데이터의 수정 권한을 가진 노드
follower : leader가 아닌 노드
Messaging Layer
Messaging Layer는 실패 시 리더를 교체하고 팔로워를 리더와 동기화하는 작업을 담당
메시지 계층은 atomic(원장성 보장)하기 때문에 Zookeeper는 로컬 복제본이 절대 분기되지 않도록 보장(Split-brain 장지)
리더는 write 요청을 수신하면 변경이 적용될 때 시스템 상태를 계산하고 이를 새로운 상태를 캡처하는 트랜잭션으로 변환
Quorum이란
Quorum은 주키퍼 클러스터의 앙상블을 이루고 있는 모든 서버 중 과반수 서버로 이루어진 그룹을 의미
Quorum을 이루는 노드들은 반드시 running 상태여야 하며, 클라이언트 요청을 처리하는 최소한의 서버 노드로 구성되어야 함
주키퍼에서 데이터 변경(write)가 성공했다면, Quorum을 구성하는 노드들은 변경 트랜잭션이 반영된 상태를 유지
Namespace Structure
파일 시스템과의 차이점은 Zookeeper Namespace의 각 노드(znode)는 하위 노드뿐만 아니라 해당 노드와 연결된 데이터를 가질 수 있음. 쉽게 말해 파일 자신이 디렉토리가 될 수 있는 파일시스템으로 이해하면 쉬움
하나의 znode의 크기는 수 bytes ~ 수 KB 이하로 유지하는 것을 권장
주로 설정 정보나 적은 수의 metadata 등의 빠른 동기화 용도 위주로 사용됨
Versioning
Atomic Operation
Namespace의 각 znode에 저장된 데이터는 automic read/write operation을 수행.
read는 znode와 연결된 모든 데이터를 가져오고, write는 모든 데이터를 덮어씀
각 znode에는 수행할 수 있는 작업을 제한하는 ACL(엑세스 제어 목록)이 존재
Ephemeral nodes
Conditional Update & Watch
Client가 특정 znode에 watch 설정하면, 해당 znode(child 포함)에 업데이트가 발생하면 watch가 trigger되고, client의 watch가 해제됨
Client API로 watch에 대한 callback 함수를 등록해서 원하는 operation을 수행할 수 있음
3.6.0 version부터는 trigger 이후에도 watch가 유지되도록 할 수 있음