zookeeper 사용하기

zookeeper는 hadoop의 서브 프로젝트로 분산 환경에서 노드들 간의 정보 공유, 락, 이벤트 등 다양한 용도로 사용됩니다. hadoop이나 neptune과 같은 대규모 분산 시스템에서는 아주 유용한 도구입니다. zookeeper의 활용이나 시스템 아키텍처는 zookeeper 사이트 보다는 구글의 chubby 논문(http://labs.google.com/papers/chubby-osdi06.pdf)을 참고하세요.
neptune의 경우 1.2 버전까지는 pleaides라는 자체 개발한 분산 락 서비스를 사용하였지만 1.3 부터는 zookeeper를 이용하고 있습니다.
분산된 환경을 구성하다 보면 특정 메타 정보를 여러 노드가 공유해야 될 필요가 있습니다. 대부분의 분산 환경에서는 메타 정보를 저장하는 노드에 SPOF(Single Point Od Failure)일 가능성이 높습니다. zookeeper는 3개 또는 5개의 노드가 하나의 zookeeper 셀을 구성하고 각 노드들의 모든 상태 정보는 공유되기 때문에 장애가 발생하지 않는 것이 보장됩니다. 따라서 공유 정보를 zookeeper에 저장하여 보관하면 SPOF를 없앨 수 있습니다.
이런 기능을 수행하기 위해 zookeeper의 기본 기능은 파일 시스템과 비슷한 형태의 스토리지를 제공합니다. 각 노드의 메모리 또는 로컬 파일시스템을 이용하기 때문에 스토리지 용량은 크지 않으며 I/O 속도에 최적화 되어 있지는 않습니다. zookeeper에 저장되는 단이를 znode라고 하는데 znode는 디렉토리와 비슷한 계층적 구조를 가지고 있으며 znode에는 byte[] 형태의 정보를 저장할 수 있습니다. 데이터를 저장할 수 있는 디렉토리 구조를 제공한다고 볼 수 있습니다. znode는 생성 옵션에 따라 메모리와 디스크에 저장되는데 메모리에 저장되는 znode는 생성한 클라이언트의 접속이 끊기면(세션이 종료되면) 자동으로 삭제됩니다.
zookeeper의 또 다른 기능은 각 znode의 변경 상황을 모니터링 할 수 있는 기능입니다. 특정 znode의 상태 정보 변경에 관심있는 zookeeper 클라이언트는 znode에 callback 메소드를 등록할 수 있으며 zookeeper 서버는 상태 정보가 변경되면 등록된 클라이언트로 이벤트를 전송해 줍니다. znode와 이벤트 기능을 이용하여 다양한 기능을 구현할 수 있습니다.
neptune의 경우 다음과 같은 용도로 zookeeper를 사용하고 있습니다.

1. master election: neptune master의 역할은 tablet 할당 역할만 수행하기 때문에 장애가 발생하여도 클러스터에 큰 문제는 없지만 보다 안정적인 서비스를 위해 자체 failover 기능을 가지고 있습니다. 여러 노드에 neptune master를 동시에 수행하게되면 zookeeper를 이용하여 특정 한 노드를 active한 master로 선출하고 나머지 노드는 standby 상태가 됩니다. active 한 노드에 장애가 발생한 경우 zookeeper로 부터 이벤트를 받고 다시 master election 과정을 거쳐 한 노드가 active master로 선출됩니다.

2. tablet server, change log server membership: neptune은 클러스터 운영중에 노드를 추가하거나 제거할 수 있습니다. 이런 노드 추가/제거에 대한 정보를 zookeeper로 부터 이벤트를 받아 처리합니다.

3. 공유정보 저장: root tablet의 위치, active한 master의 노드 정보 등을 zookpeeper에 저장합니다.

4. lock: 전체적인 i/o 스케쥴링을 위해 zookeeper의 znode를 이용하여 lock을 얻습니다.

첨부파일은 master election과 클러스터 member ship에 활용된 예제입니다. zookeeper를 먼저 실행시킨 후 Master를 실행하면 3개의 master가 수행되고 master1이 active master로 선출됩니다. master1을 kill 시키면 master2가 다시 active로 선출됩니다.
Slave를 수행하면 5초 주기로 Slave 객체가 만들어지는데 master 노드에서 추가되는 이벤트를 받는 것을 볼 수 있습니다.
zookeeper 실행은 다운로드 받은 후 압축을 해제한 다음 .conf/zoo_sample.cfg 내용을 수정한 다음 다음 명령으로 실행

java -cp .\zookeeper-3.1.1.jar;.\lib\log4j-1.2.15.jar;.\conf org.apache.zookeeper.server.quorum.QuorumPeerMain .\conf\zoo_sample.cfg

사용자 삽입 이미지



크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/348

Comments List

  1. typos 2009/05/21 18:40 # M/D Reply Permalink

    Good!!

  2. 전태연 2009/05/28 11:05 # M/D Reply Permalink

    갈아타셨군요. ㅋㅋ

  3. 비밀방문자 2011/03/08 10:24 # M/D Reply Permalink

    관리자만 볼 수 있는 댓글입니다.

  4. 김동환 2012/05/18 16:30 # M/D Reply Permalink

    zookeeper에 대한 질문이 있는데
    주키퍼는 분산서버 구현 시 로드 밸런싱 서버 방식이 아닌
    Naming Service 방식 즉 DNS 서버 방식으로 사용하는 걸로 알고 있습니다.

    로드 밸런싱 서버 같은 경우는 로드 밸런스가 여러개 WAS 중에서 가장 적은 부하가 걸린 WAS를 찾아내 클라이언트와 연결시켜주기 때문에 부하분산에 유리한 걸로 알고 있습니다.

    그렇다면 주키퍼는 부하 분산을 어떻게 하나요?
    DNS 서버처럼 라운드 로빈 방식으로 들어오는 클라이언트한테 순서대로 WAS를 연결시켜주는지요?

    1. 김형준 2012/05/18 19:24 # M/D Permalink

      zookeeper 자체는 단순히 메모리 기반으로 트리 구조의 데이터 저장소를 제공해주고 이 트리 구조에 노드가 변경되었을 때 이벤트를 알려주는 기능만 수행합니다. 이 기능을 이용하여 zookeeper를 사용하는 클라이언트가 알아서 해야 합니다.
      어플리케이션 서버들은 시작시 zookeeper에 자신의 ip를 저장하고 클라이언트는 ip가 저장된 디렉토리에 이벤트 리스너를 등록해 놓고 새로 서버가 추가되거나 제거 되는 것을 인식해서 처리하는 방식으로 구현할 수 있습니다.
      물론 좀 더 세밀하게 부하정보까지 zookeeper에 저장해서 이를 이용하는 구현도 가능합니다.

  5. 엄성권 2013/04/10 13:37 # M/D Reply Permalink

    저역시 김동환님과 같은 궁금증이 있었습니다.
    김형준님의 답변 대로라면 서버가 zookeeper에 자신의 부하정보를 함께 기록하고 클라이언트는 서버 목록에서 부하값(?)이 가장 적은것을 골라 접속하게 구현해주어야 겠군요.... 쉬운게 없네요.... ^^

    감사합니다.

Leave a comment
« Previous : 1 : ... 112 : 113 : 114 : 115 : 116 : 117 : 118 : 119 : 120 : ... 410 : Next »