
ZooKeeper는 분산 시스템을 위한 코디네이터이다.
"분산 시스템"이란 복수의 컴퓨터가 네트워크를 통해 통신하며 하나의 목적을 위해 서로 간에 상호작용하는 것이다. 다수의 컴퓨터가 마치 하나인 것처럼 동작하는 시스템인 것이다.
분산 시스템을 구성할때 고려해야 할 사항들은 네트워크의 신뢰성, 지연, 대역폭, 안전성, 토폴로지에 대한 고려, 전송 비용, 네트워크 유형 등 고려해야 할 사항이 많다. 분산 서버들 간의 정보 공유, 동기화 분산 서버들의 상태 확인등이 필요하다.
분산 컴퓨팅에서 코디네이션의 예는 그룹 멤버십(Group Membership), 잠금제어(Locking), 공급/구독 (Publisher/ Subscriber), 리더선정(Leader Election), 동기화(Synchronization)등이 될 수 있다.
ZooKeeper는 클러스터 구성원 간의 데이터 공유를 위한 데이터 스토리지(영속 데이터/임시 데이터), 클러스터 멤버십 관리를 통한 데이터 변경 통지(Watch), 마스터 및 분산 락 등에 활용되는 시퀀스 노드 등을 제공한다. 이를 통해서 다음에 활용할 수 있다.
1) 설정 관리 (Configuration Management)
2) 분산 클러스터 관리 (Distributed Cluster Management)
3) 명명 서비스 (Naming Service: e.g. DNS)
4) 분산 동기화 (Distributed Synchronization : locks, barriers, queues)
5) 분산 시스템에서 리더 선출 (Leader election in a distributed system)
6) 중앙집중형 신뢰성 있는 데이터 저장소 (Centralized and highly reliable data registry)
ZooKeeper는 중앙화된 분산 코디네이터 클러스터라고 볼 수 있다.
ZooKeeper는 n개의 서버로 단일 주키퍼 클러스터를 구성하며 이를 서버 앙상블이라고 한다. 클라이언트는 앙상블에 속한 서버에 연결하여 서비스를 사용할 수 있다. 다음은 주키퍼 아키텍처이다.
주키퍼는 계층적인 namespace를 제공하며 namespace 내에 존재하는 개별 노드를 znode 라고 부른다. 모든 znode는 데이터(바이트 배열)을 가질 수 있으며 자식 znode를 가질 수 있다.
1) znode
절대 경로로 '/'로 구분된다. 상대 참조가 없으며 명칭에 유니코드 문자가 포함될 수 있다. 변경이 발생하면 버전 번호가 증가한다. 데이터는 항상 전체를 읽고 쓴다. znode는1M 이하의 데이터를 가질 수 있으며, 자식 노드를 가질 수 있다.
영속 종류에 따라
1) Persistent Nodes(영구 노드): 명시적으로 삭제되기 전까지 존재함
2) Ephemeral Nodes(임시 노드): 세션이 유지되는 동안 활성(세션이 종료되면 삭제됨), 자식 노드를 가질 수 없음
3) Sequence Nodes(순차 노드) : 경로의 끝에 일정하게 증가하는 카운터 추가됨, 영구 및 임시 노드 모두에 적용 가능
Sequence Node의 경우 자식 노드가 생성한 순서에 따라 일렬번호를 가진다. 예를 들어 /svc 노드의 자식 노드로 /nodes를 시퀀스 노드로 생성하면 다음과 같은 순서로 노드를 생성한다.
/svc/nodes0000000001
/svc/nodes0000000002
Persistent와 Ephemeral 에 보두 적용 가능하며 시퀀스 번호는 4byte 정수이다.
2) operations
주요 operation은 create, delete, exists, getChildren, getData, setData 등이 있다. 그리고 Java, C, Python, Ruby, Scala 등 언어별 바인딩을 제공한다.
3) watch
Znode가 변경 시 Noti를 클라이언트로 trigger 해주어, 주키퍼의 znode의 변화를 통지 받는다. 오퍼레이션 실행시 watcher 등록 (zk.getChildren("/mysvc/nodes",watcher)
이벤트 종류는 다음과 같다.
Watch는 일회성 이벤트 수신으로, 다시 Watch 하고 싶으면 재등록 해야 하며, 재등록 전에 발생한 변경은 수신하지 못한다. 클라이언트는 이벤트 수신 및 새로운 감시 요청을 전송하는 중 발생할 수 있는 지연에 대비해야 한다. 상태 변경 요청한 클라이언트가 성공 코드를 받은 이후에, watcher를 등록한 클라이언트에 통지된다. ZooKeeper의 변경 순서대로 Watch 이벤트를 수신한다.
4) 일관성 보장
1) 클러스터 관리
2) 리더 선출
. 부모 znode에 getChild로 WATCH 등록
. NodeChildrenChanged 이벤트 수신시, 현재 마스터가 없는지 확인
. 마스터에 해당 자식 znode가 없으면 부모 znode에 자식 znode를 구한뒤 시퀀스 번호가 가장 작은 znode를 마스터로 선택
.부모 znode에 getChild로 WATCH 등록
3) 분산 배타적 잠금
4) 기타 용도
이벤트 통지: WATCH 사용
pub/sub : SEQUENCE사용
분산카운터: SEQUENCE 또는 znode의 version 사용
1) ZooKeeper의 동작방식
2) Quorum : 가용성, 데이터 변경