본문 바로가기
Programming/Zookeeper

ZooKeeper 활용해보기

by ★용호★ 2016. 9. 25.

가장 간단하게 ZooKeeper를 활용하기 위해서 서비스 중인 서버의 연결 상태를 체크하기 위한 용도로 구현을 해보기로 했다. 먼저 서비스 중인 각각의 서버를 Worker라 부르고 이를 모니터링하는 서버를 Monitor라고 부르기로 했다.

Znode 구성

Worker는 서버 구동 시 ZooKeeper의 /workers 노드의 하위에 Ephemeral 모드로 추가가 된다. 그리고 Monitor는 /workers 노드를 watch하고 있다가 변경사항이 발생하면 하위 노드까지 Watch를 수행한다. 



결과적으로 아래 그림과 같은 형태가 되고 Worker1,2가 추가되거나 제거되는 경우 이벤트가 발생하여 Monitor가 인지하게 된다. 


이를 통해 굉장히 쉽게 서버 상태를 모니터링할 수 있는 기능을 운영툴에 추가 했다. 더 나아가서 각각의 node에는 데이터를 저장할 수 있으므로 여러 상황에 대한 상태를 정의해서 thrift나 json형식으로 저장 후 모니터링 하고 있는 툴에서 해당 정보를 받아 처리하면 다방면으로 활용할 수 있을 것 같다.


Java로 구현을 해보며

구현을 하다보니 ZooKeeper 라이브러리의 몇가지 특성을 알 수 있었다.

우선 내부적으로 통신을 담당하는 쓰레드와 큐를 활용하여 이벤트를 처리하는 쓰레드가 존재하고 있었고 연결이 실패하더라도 내부적으로 try/catch를 사용하여 Exception 처리를 하고 있기 때문에 프로그램이 죽지 않고 계속 재연결 시도를 하게 된다. 이를 제어할 수가 없어서 연결에 실패하면 프로그램을 바로 종료시키고 싶어도 그럴 수 없었다. 옵션으로 그러한 기능이 제공하는 지는 조금 더 검토를 해봐야할 것 같다.

그리고 연결에 실패하더라도 create 라던지 연결 후에 수행해야하는 작업들에 대해서 에러가 발생하지는 않고, 이벤트를 처리하는 쓰레드에서 해당 작업을 큐로 관리하여 연결 후에 처리를 해주는 방식을 사용하고 있었다. 그래서 사용하는 쪽에서는 따로 예외처리를 하지 않아도 내부적으로 문제 없이 처리가 되었다.

현재 watch를 하고 있는 Monitor 쪽에서 계속 해서 ping 패킷을 로그로 남기고 있는데 log level을 올려서 단순 ping 패킷에 대한 로그는 보이지 않도록 해야할 것 같다.

'Programming > Zookeeper' 카테고리의 다른 글

ZooKeeper API  (3) 2016.09.25
ZooKeeper 설치  (0) 2016.09.25
ZooKeeper 개요  (0) 2016.09.25

댓글