오늘은 Apache Zookeeper에 관해 설명하고자한다.

주키퍼는 Apache 재단의 오픈소스 프로젝트 중 하나이다.

홈페이지를 보면  zookeeper: A Distributed Coordination Service for Distributed Applications
분산 어플리케이션을 위한 분산 협력 서비스라고 써있다. 

zookeeper의 뜻은 사육사란 뜻인데, Apache에서 다양한 프로젝트들을 보면 hadoop(코끼리), hive(꿀벌) 등 각 프로젝들이 동물로서 표현된다.
이러한 동물들을 관리해주는 사육사라고 생각하면 된다.
 zookeerper 이미지 : 




그럼 이제 좀 더 자세히 알아보자.

주키퍼의 설계 목표는 간단하고, 복제되고, 순서가 있고, 빠르다 .
자세한 내용은 위 링크를 참조하면 된다.

 설계 목표를 정리해보면, 주키퍼는 간단하게 설계되었다. 아래와 같은 그림의 형태로 계층형 네임스페이스를 가지고 데이터를 저장한다.
이때, 데이터를 메모리상에서 유지하여 높은 처리량과 낮은 지연률을 가능하게 하였다.

( 이 그림을 보면 계층형 구조로 된 것을 볼 수 있는데, 각 계층의 네임스페이스를 znode라고 한다 - 이곳에 데이터를 저장 가능하다  )

두번째,  아래 그림처럼 서버들끼리 연결되어 서로 데이터가 복제되는데, 주키퍼 서비스는 메모리와 영속적인 저장소에 트랜잭션 로그, 스냅샷을 유지한다.
( 영속적이란 말이 좀 이상한데, 별도의 지워지지않은 파일시스템 같은곳에 기록한다는 말 ) 
서버의 과반수가 살아있음 서비스를 유지할 수 있다. 


세번째, 주키퍼는 각 업데이트 순서를 기록하는데, 이 숫자는 주키퍼 트랜잭션에 쓰인다.  ( 이를 통해 동기화가 가능 ) 

네번째, 주키퍼는 읽는 작업에서 빠르다. 쓰는 작업보다 읽기에 적합하다. 
( 내 생각엔 쓰는건 위에서 복제를 통해 데이터를 공유하는 과정이 있어서 느린 듯싶다 ) 


주키퍼 구성요소인데, 쓰기 요청을 받음 브로드캐스트를 통해 연결된 서버들에게 데이터를 보내고 데이터베이스에 저장된다.
읽기 요청이 된, 그 데이터베이스에 요청을 보낸 후 응답을 받는다. 


주키퍼에 데이터를 저장할 때, ephemeral(하루살이) 모드를 설정 할 수 있는데, 이렇게 설정할 경우 znode 에 저장 된 데이터는 자동으로 읽고 쓰여지는 것을 막는다.
즉, 세션이 종료되면 데이터가 날라감 

또한, 주키퍼의 watch기능을 제공한다. znode에 watch을 set하면, 그 znode에 변화가 일어나면 trigger된다. 
( 실제, 지속적으로 상태를 감시 해야 되는 서비스 같은 경우 znode에 상태를 기록하고 읽는 식으로 구현할 수도있다 )  


지금까지 설명한 부분이 zookeeper의 핵심 내용들이다. 실제 zookeeper은 "분산 어플리케이션을 위한 분산 협력 서비스"라 설명되고 있지만, 분산 파일 시스템이라고 생각해도 무방할 거 같다.
보는것과 같이 간단하지만 분산 파일 시스템으로서 watch기능, 동기화 등 많은 기능을 제공하기에 사용하기 편리하고 유용할 것이다.

실제 kafka에서도 metadata부분을 zookeeper에 기록하는 식으로 구성을 해놨다. 분산된 노드에서, 공유 된 파일 시스템이 필요하면 zooekeeper을 고려하면 충분히 비용을 아낄 수 있을 거라 생각한다.
하지만 zookeeper는 light하게 쓰는 것을 권장한다. (개인적생각)  
데이터를 메모리에 올려놓아서 높은 처리량과 낮은 지연률을 자랑하지만, 큰 데이터를 기록하긴 안 좋은거같다.






+ Recent posts