본문 바로가기

대용량 플랫폼

[강한구] Zookeeper 삽질기

서버를 구성하는데 zookeeper를 사용하기로 했습니다.

zookeeper의 특징중에 하나가 simple 입니다......정말 simple입니다.
event처리, 분산 lock처리, watches구현등, 사용하는 개발자가 자신의 목적에 맞게 구현을 해야합니다.

처음 접한 zookeeper..... 개념없이 무식하게 덤벼들어 삽질했던,
그래서 시작하는 다른분들은 저와 비슷한 삽질을 안했으면 하는 마음에 간단한 내용이지만 글을 씁니다.


1. watches에는 두가지 종류가 있습니다.
  zookeeper에는 node마다 watches를 붙일수 있습니다.
  watches란 node가 생성되거나, 삭제되거나, data변경이 일어나는걸 감시하는 일종의 trigger 역할을 합니다.
  일회성이기 때문에 event가 감시후, event가 발생한 node에 다시 watches를 붙여야 합니다.

  처음에는 watches가 마냥 좋은건줄 알고 모든 node에 watches를 붙였습니다.  그랬더니 경우의 수가 너무 많아지고, 
  심지어는 무한 이벤트를 발생시키더군요;;

  watches는 data watches와 child watches가 있습니다.  data가 수정되면 data watches가,
  node가 생성되면 children watches가 마지막으로 node가 삭제되면 child watches, data watches가 동작합니다.


2. node는 네가지 종류가 있습니다.

Enum Constant Summary
EPHEMERAL 
          The znode will be deleted upon the client's disconnect.
EPHEMERAL_SEQUENTIAL 
          The znode will be deleted upon the client's disconnect, and its name will be appended with a monotonically increasing number.
PERSISTENT 
          The znode will not be automatically deleted upon client's disconnect.
PERSISTENT_SEQUENTIAL 
          The znode will not be automatically deleted upon client's disconnect, and its name will be appended with a monotonically increasing number.

EPHEMERAl은 session이 끊어지면 자동으로 node가 지워지는 노드입니다. 자식node 을 가질수 없습니다.
PERSISTENT은 session이 끊어져도 node가 삭제되지 않는 노드입니다. 자식 node를 가질수 있습니다.
SEQUENTIAL도 있는데 node를 만들면 지정한 path 뒤에 숫자를 차례대로 기록합니다. 
zookeeper를 이용한 분산락  : http://creatorw.tistory.com/entry/5-%EC%A3%BC%ED%82%A4%ED%8D%BCzookeeper-%ED%99%9C%EC%9A%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%9C-%EC%83%9D%EA%B0%81


3. zookeeper를 cluster구성시 sessionTimeout을 정하는 방법은 따로있다.
  이것때문에 시간 많이 잡아먹었다. client에서 zookeeper Server와 통신을 하기 위해서는 최초 session을 만들어야 한다.  
  이때 sessionTimeOut을 인자로 받는다......  자꾸 sesstion Timeout이 발생했다.
  server-client는 hear beat 로 연결을 유지하고 있는데, 서버가 죽었다거나 통신에 장애가 생겨서 사용자가 정한  
  sessionTimeOut값을 넘어가면 session Timeout이 발생한다.  해당 sessionID는 못쓰기 때문에
  새로운 session을 만들어야한다.(ZooKeeper를 다시 생성해야 한다.)

Zookeeper Server를 3대로 구성하고 있었고 sessionTimeOut을 5초로 주었다.
하지만~!! 내부적으로는 각각의 서버가 5초를 가지고 있는게 아니었다.
두둥.......connectTimeout을  설정한 값을 저장하는게 아니라 그걸 서버수로 나눈값을 가지고 있다.(찾아주신 연철님 땡큐~ㅋㅋ)
시간을 늘리면서 문제를 해결한 씁쓸한 경험.....;;



마지막으로 session 생성은 asynchronous 하기 때문에 session이 생성되기도 전에 ZooKeeper생성자가 종료 됩니다
그래서 생성자 호출후 바로 사용하면 error가 발생할수도 있습니다.
방법으로는 생성자를 호출하고 몇초 기다리거나, watches에서 event발생시 세션을 사용하게 하면 됩니다.



zookeeper node를 확인 할수 있는 eclipse plug-in
http://www.massedynamic.org/mediawiki/index.php?title=Eclipse_Plug-in_for_ZooKeeper 

개발하면서 정말 많은 도움이 됐던 url
https://cwiki.apache.org/confluence/display/ZOOKEEPER/Index 


이번 계기를 통해서 깨달은 귀중한 것 한가지.
문서만 잘 읽어도 엥간한건 다 해결할 수 있다~!!! ㅋㅋㅋㅋㅋㅋ