====== ZooKeeper ====== * [[http://zookeeper.apache.org/|Apache ZooKeeper]] * [[http://curator.apache.org/|Curator]] Zookeeper 관련 편리 프레임워크 ===== Curator ===== * [[https://issues.apache.org/jira/browse/CURATOR-209|[CURATOR-209] Background retry falls into infinite loop of reconnection after connection loss - ASF JIRA]] Curator 무한 loop 버그. **2.10.0** 이상 버전 사용할 것. ===== 주의점 ===== * 데이터의 변경이 자주 발생하는 서비스에서 ZooKeeper를 데이터 저장소로 사용하는 것은 추천하지 않는다. ZooKeeper에서 추천하는 Read : Write 비율은 10 : 1 이상이다. * ZooKeeper 서버가 제대로 실행되지 않을 때가 있는데, 대부분 서버간의 데이터 불일치로 인한 데이터 동기화 실패가 그 원인이다. 주로 베타 테스트 후 운영 직전에 ZooKeeper 서버를 증설해서 사용하는데, 이럴 때 기존에 테스트했던 서버와 신규로 투입한 서버의 데이터 차이로 인해 이런 현상이 종종 발생한다. 이때는 데이터를 초기화한 후 서버를 실행하면 된다. * zoo.cfg라는 설정(configuration) 파일의 ZooKeeper 서버 목록을 꼼꼼히 확인해야 한다. 서버 목록이 정확히 맞지 않아도 서버가 실행되긴 하지만, 로그 파일을 확인하면 ZooKeeper 서버가 지속적으로 재시작할 때도 있고 데이터를 엉뚱한 곳에 저장하기도 한다. * **Watch**는 한번만 적용되는 이벤트이다. 이벤트를 받은 뒤 계속 Watch하려면 Watch를 다시 걸어줘야한다. * 단일 znode에 너무 많은 Watch가 걸리면 트래픽이 과하게 걸릴 수 있다. * Zookeeper GC에 대비하여 충분한 Session Timeout 을 지정해야 한다. * Swapping이 일어나지 않게 Heap 크기를 조정한다. * Zookeeper Transaction Log용으로 독립 디스크를 할당하는 것이 좋다. 트랜잭션 로그는 성능에 매우 치명적인 영향을 끼친다. * 클라이언트 A의 변경사항이 반영되기 전에 클라이언트 B에서 과거 데이터를 읽는 현상이 발생할 수 있다. 완벽한 동기화가 필요하다면 클라이언트 B에서 값을 읽기전에 ''sync()'' 메소드를 호출해 주어야 한다. * Zookeeper에 대한 접속이 끊긴 상태에서 이벤트가 발생하면 재접속 후에는 그 전에 발생한 이벤트를 받지 못한다. 따라서 ''watch''를 사용할 때 매우 주의해야한다. * Zookeeper 서버가 다운됐거나 네트워크가 끊겼을 경우에 대해 Client가 올바로 반응하는지 철저히 테스트하라. * 서버의 서버목록과, 클라이언트의 서버 목록을 맞추라. ===== Zookeeper docker ===== * [[https://hub.docker.com/_/zookeeper/|Zookeeper Docker]] docker run -d --restart always --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 zookeeper ===== zkCli ===== Zookeeper CLI $ZOOKEEPER_HOME/bin/zkCli.sh -server [hostname]:[port] ===== ZooInspector ===== * ''$ZOOKEEPER_HOME/contrib/ZooInspector''에 함께 들어있는 Zookepper GUI 툴 * 실행 스크립트 #!/bin/sh # 버전과 디렉토리 적절히 변경 ZOOKEEPER_HOME=/applications/java/zookeeper-3.4.6/ ZOOINSPECTOR_HOME=${ZOOKEEPER_HOME}/contrib/ZooInspector cd $ZOOINSPECTOR_HOME java -cp $ZOOINSPECTOR_HOME/zookeeper-3.4.6-ZooInspector.jar:$ZOOINSPECTOR_HOME/lib/*:$ZOOKEEPER_HOME/*:$ZOOKEEPER_HOME/lib/* \ org.apache.zookeeper.inspector.ZooInspector ===== 문서 ===== * [[http://zookeeper.apache.org/doc/r3.4.2/zookeeperTutorial.html|Programming with ZooKeeper - A basic tutorial]] * [[http://www.slideshare.net/scottleber/apache-zookeeper|Apache ZooKeeper]] 괜찮은 PPT * [[http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper|Introduction to Apache ZooKeeper]] * [[http://creatorw.tistory.com/52|: 1. 주키퍼(zookeeper) 란?]] * [[https://cwiki.apache.org/confluence/display/ZOOKEEPER/ZooKeeperPresentations|Zookeeper Presentations]] * [[http://www.slideshare.net/iFunFactory/apache-zookeeper-55966566|Apache ZooKeeper 로
 분산 서버 만들기]] * [[http://examples.javacodegeeks.com/enterprise-java/apache-hadoop/apache-hadoop-zookeeper-example/|Zookeeper Example]] * [[https://dzone.com/articles/distributed-lock-using|Distributed Lock using Zookeeper - DZone Big Data]]