kafka broker, cluster, zookeeper

jc3wrld999
3 min readJul 15, 2023

--

zookeeper

분산시스템을 하다보면 가장 문제점 중 하나가 분산된 시스템간의 정보를 어떻게 공유할 것이고 클러스터에 있는 서버들의 상태를 체크할 필요가 있으며 또한 분산된 서버들간의 동기화를 위한 락(lock)을 처리하는 것들이 문제로 부딪힙니다.

이러한 문제를 해결하는 시스템을 코디네이션 서비스 시스템(coordination service)라고 하는데 Apache Zookeeper가 대표적입니다. 이 코디네이션 서비스는 분산 시스템 내에서 중요한 상태 정보나 설정 정보등을 유지하기 때문에 코디네이션 서비스의 장애는 전체 시스템의 장애를 유발하기 때문에 이중화 등을 통하여 고가용성을 제공해야 합니다.

분산 시스템을 코디네이션하는 용도로 디자인되어 있기 때문에 data access가 빨라야 하고 자체적으로 장애에 대한 대응성을 가져야합니다. 그래서 zookeeper는 자체적으로 클러스터링을 제공하며 장애에도 데이터 유실없이 fail over/fail back이 가능합니다.

Apache Zookeeper는 디렉토리 구조 기반으로 znode 라는 데이터 저장 객체를 제공하고 (key-value 식) 이 객체에 데이터를 넣고 빼는 기능만을 제공합니다. 디렉토리 형식을 사용하기 때문에 데이터를 계층화된 구조로 저장하기 용이합니다.

데이터 모델

데이터 모델은 간단합니다. 디렉토리 구조의 각 노드에 데이터를 저장할 수 있습니다.

노드는 아래와 같이 기능에 따라 몇가지 종류로 나뉘는데

  • persistent node: 노드에 데이터를 저장하면 일부러 삭제하지 않는 이상 삭제되지 않고 영구히 저장됩니다.
  • ephemeral node: 노드를 생성한 클라이언트의 세션이 연결되어 있을 경우만 유효합니다. 클라이언트 연결이 끊어지면 삭제됩니다. 클라이언트의 연결이 되어 있는지를 확인하는 용도로 사용할 수 있습니다. (클러스터를 구성할 때 클러스터 내에 서버가 들어오면 이 ephemeral node 로 등록하면 됩니다.)
  • sequence node: 노드를 생성할 때 자동으로 sequence 번호가 붙는 노드입니다. 주로 분산락을 구현하는데 이용됩니다.

watcher

zookeeper 클라이언트가 특정 znode 에 watch 를 걸어놓으면 해당 znode가 변경되었을 때 클라이언트로 callback 호출을 날려서 클라이언트에 해당 znode가 변경되었음을 알려줍니다. 그리고 해당 watch는 삭제됩니다.

Zookeeper 활용 시나리오

zookeeper는 단순히 디렉토리 형태의 데이터 저장소이지만 노드의 종류별 특성과 watcher 기능들을 활용하면 다양한 시나리오에 활용할 수 있습니다.

  1. 큐: watcher와 sequence node를 사용하면 큐를 구현할 수 있는데 queue라는 node를 만든 후에 이 노드의 child node를 sequence node로 구성하면 새롭게 생성되는

--

--