ZooKeeper 는 데이터를 디렉터리 구조로 저장하고 데이터가 변경되면 클라이언트에게 어떤 노드가 변경됐는지 콜백을 통해 알려준다.
데이터를 저장할 때 해당 세션이 유효한 동안 데이터가 저장되는 Ephemeral Node라는 것이 존재하고 데이터를 저장하는 순서에따라 자동으로 일련번호(Sequence number)가 붙는 Sequence Node라는 것도 존재한다. 조금 과장하면 이러한 기능이 ZooKeeper 기능이 전부다.
ZooKeeper 는 디렉터리 구조로 데이터를 저장한다. Peersistent를 유지하기 위해 트랜잭션 로그와 스냅샷 파일이 디스크에 저장되어 시스템을 재시작해도 데이터가 유지된다. 각각의 디렉터리 노드를 znode라고 명명하며 한 번 설정한 이름은 변경할 수 없고 스페이스를 포함할 수도 없다.
그림 1 ZooKeeper의 데이터 모델(이미지 출처)
데이터를 저장하는 기본 단위인 노드에는 Persistent, Ephemeral, Sequence Node가 있다.
Persistent Node는 한 번 저장되고 나면 세션이 종료되어도 삭제되지 않고 유지되는 노드다.
Ephemeral Node는 특정 노드를 생성한 세션이 유효한 동안 그 노드의 데이터가 유효한 노드다. 좀 더 자세히 설명하면 ZooKeeper Server에 접속한 클라이언트가 특정 노드를 Ephermeral Node로 생성했다면 그 클라이언트와 서버 간의 세션이 끊어지면 해당 노드는 자동으로 삭제된다.
Sequence Node는 노드 생성 시 sequence number가 자동으로 붙는다. 이 기능을 활용해 분산 락 등을 구현할 수 있다.
그림 2 ZooKeeper의 서버 구성도(이미지 출처)
ZooKeeper 서버는 일반적으로 3대 이상 홀수로 구성한다. 서버 간 데이터 불일치가 발생하면 데이터 보정이 필요한데 이때 과반수 룰을 적용하는 것이 데이터 정합성 측면에서 유리하다. ZooKeeper 서버는 Leader와 Follower로 구성되어 있다. 서버들끼리 자동으로 Leader를 선정하며 모든 데이터 저장을 주도한다.
클라이언트에서 서버(Follower)로 데이터 저장을 시도할 때 Follower -> Leader -> Follower 로 데이터를 전달하는 구조이고 모든 서버에 동일한 데이터가 저장된 후 클라이언트에게 성공/실패 여부를 알려주는 동기 방식으로 작동한다. 즉, 모든 서버는 동일한 데이터를 각각 가지고 있고 클라이언트는 어느 서버에 연결되더라도 동일한 데이터를 가져간다.
사용/운영 시 주의사항이 있다. ZooKeeper 서버를 캐시 용도로 사용해 서비스를 오픈했다가 장애가 발생하는 사례도 종종 있다. 데이터의 변경이 자주 발생하는 서비스에서 ZooKeeper 를 데이터 저장소로 사용하는 것은 추천하지 않는다. ZooKeeper 에서 추천하는 Read : Write 비율은 10:0 수준이다.
ZooKeeper 서버가 제대로 실행되지 않을 때가 있는데 대부분 서버간의 데이터 불일치로 인한 데이터 동기화 실패가 그 원인이다. 이때는 데이터를 초기화한 후 서버를 실행하면 된다.
- "zkServer.sh stop"
- "zkCli.sh"
- "ls / 명령으로 ZooKeeper 에서 삭제하려는 컨텐츠 확인
- "delete /znode" 또는 삭제하려는 패스를 "delete /패스명" 과 같이 입력
https://d2.naver.com/helloworld/294797