[zookeeper]

nooyji·2022년 7월 5일
0

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

이러한 문제를 해결하는 시스템을 코디네이션 서비스 시스템 (coordination service) 라고 하는데, Apache Zookeeper 가 대표적이다. 이 코디네이션 서비스는 분산 시스템 내에서 중요한 상태 정보나 설정을 통하여 고가용성을 제공해야 한다. ZooKeeper 는 이러한 특성을 잘 제공하고 있는데, 그런 이유로 이미 유명한 분산 솔루션에 많이 사용되고 있다. NoSQL 의 한 종류인 Apache HBase, 대용량 분산 큐 시스템인 Kafka 등이 그 대표적인 사례이다.
분산 시스템을 코디네이션 하는 용도로 디자인이 되었기 때문에, 데이터 access 가 빨라야 하며, 자체적으로 장애에 대한 대응성을 가져야 한다. 그래서 Zookeeper 는 자체적으로 클러스터링을 제공하며, 장애에도 데이터 유실 없이 fail over / fail back 이 가능하다.

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

데이터 모델

디렉토리 구조의 각 노드에 데이터를 저장할 수 있다.

Persistent Node : 노드에 데이터를 저장하면 일부러 삭제하지 않는 이상 삭제되지 않고 영구히 저장된다.

Ephemeral Node : 노드를 생성한 클라이언트의 세션이 연결되어 있을 경우만 유효하다. 즉 클라이언트 연결이 끊어지는 순간 삭제된다. 이를 통해서 클라이언트가 연결이 되어 있는지 아닌지를 판단하는데 사용할 수 있다. (클러스터를 구성할 때 클러스터 내에 서버가 들어오면, 이 Ephemeral Node 로 등록하면 된다.)

Sequence Node : 노드를 생성할 때 자동으로 sequence 번호가 붙는 노드이다. 주로 분산락을 구현하는데 이용된다.

Watcher

Watch 기능은 ZooKeeper 클라이언트가 특정 znode 에 watch 를 걸어놓으면, 해당 znode 가 변경이 되었을 때, 클라이언트로 callback 호출을 날려서 클라이언트에 해당 znode 가 변경이 되었음을 알려준다. 그리고 해당 watcher 는 삭제된다.

ZooKeeper 활용 시나리오

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

  1. 큐 : Watcher 와 Sequence node 를 이용하면, 큐를 구현할 수 있는데, Queue 라는 Node 를 만든 후 이 노드의 Child node 를 sequence node 로 구성하면, 새롭게 생성되는 메세지들은 이 sequence node 로 순차적으로 생성된다. 이 큐를 읽는 클라이언트가 이 큐 node 를 watch 하도록 설정하면, 이 클라이언트는 새로운 메세지가 들어올 때 마다 call back 을 받아서, 마치 메세지 Queue 의 pub/sub 과 같은 형태의 효과를 낼 수 있다. 대용량 메세지나 애플리케이션 성격상의 메세지는

원문 : https://bcho.tistory.com/1016

0개의 댓글