반응형
SMALL




1. watch 


Watch 기능은 Zookeeper 클라이언트가 특정 znode에 Watch를 설정해 놓아야 사용할 수 있다.


[그림1 원하는 znode에 Watch 설정]


아래와 같은 데이터 형태에서 /app1/p_2 znode에 Watch를 설정하여 Watcher를 생성했다고 가정해보자.

[그림2 /app1/p_2 znode에 Watch 설정]


/app1/p_2 znode가 변경이 되면 watch를 설정한 client에게 event change를 알려준다.

[그림3 /app1/p_2 znode가 변경됨을 알림]


event change를 알리고 나면 해당 Watcher는 삭제된다.

[그림4 event change를 알리고 해당 Watcher 삭제]


Watcher가 감지하는 znode의 ‘변경’ event는 4가지 종류가 있습니다.

NODE_CREATED: 노드가 생성 됨을 감지

NODE_DELETED: 노드가 삭제 됨을 감지

NODE_DATA_CHANGED: 노드의 데이터가 변경 됨을 감지

NODE_CHILDREN_CHANGED: 자식 노드가 변경 됨을  감지 

여기서 주목할 점은 특정 znode에 Watch를 설정해야 한다는 것

Watch를 설정해 생성된 Watcher가 해당 znode의 변경을 알아내 Watch를 설정한 클라이언트에게 event를 전달하면 해당 Watcher는 삭제된다는 것

즉 한 번 설정해 놓으면 지속적으로 감시해주는 Watch 기능이 아니라 event change가 발생하면 이를 알려주고 삭제돼버리는 one time trigger라는 점을 반드시 기억해야한다.


그럼 event에 대해 조금 더 알아보면 리눅스에서 event type를 확인하는 방법은 다음과 같다.

1. 처음에 node를 치고

2. 그다음 >에 var zookeeper = require('node-zookeeper-client');를 입력해준다. 그러면 undefined가 생성될 것이다.

3. 그다음 >에 zookeeper.Event를 치면 event type 4가지를 확인할 수 있다.

아래 그림과 같이 /app1/p_2 znode에 Watcher를 생성했다고 가정해보면

[그림5 /app1/p_2 znode에 Watcher 생성]


만약 /app1/p_2 znode가 변경이 되면 Watch를 설정한 해당 Client에게 알려주고 Watcher는 사라지게 된다. 위에서 설명한 것 다시한번 설명하고 있다.

[그림6 event change를 알리고 해당 Watcher 삭제]


변경 사항이 해당 znode의 ‘삭제’였다면 아래 그림과 같이 진행된다.

[그림7 event change를 알리고 해당 Watcher 삭제]


아래와 같이 /app1/p_2 znode가 없는 상태라고 가정해보면

[그림8 /app1/p_2 znode가 없는 상태]


존재하지 않는 znode라도 Watch 설정이 가능하다. 즉 /app1/p_2 znode에 Watch를 설정할 수 있다.

[그림9 /app1/p_2 znode에 Watch 설정]


/app1/p_2 znode가 생성된다면 NODE_CREATED event를 Watch를 설정한 Client에게 전달하고 Watcher는 삭제된다.


[그림10 event change를 알리고 해당 Watcher 삭제]


2. mongo rs server


“mongod” Command를 통해 mongo rs server를 생성한다.

[그림11 mongo rs: Primary1, Secondary2, Arbiter1]


이 때, 함께 Zookeeper Server에 Ephemeral Node를 생성해준다.

[그림12 각 mongo rs 멤버에 해당되는 Ephemeral Node 생성]


해당 znode가 생성된 것을 Watcher가 감지하고 zookeeper에 rs의 상태를 rs mongo server에게 받아와 갱신한다.

[그림13 znode  생성 감지 및 rs 상태 갱신]


에러가 생겨 특정 mongo server가 죽었을때는?

스크린샷 2015-09-10 오후 3.09.35

[그림14 Primary 장애 발생]


Zookeeper Server와 connection이 끊겨 해당 Ephemeral Node가 삭제된다.

스크린샷 2015-09-10 오후 3.09.41

[그림15 Primary에 해당되는 Ephemeral Node 삭제 됨]


이를 Watcher가 감지해 변경된 rs의 상태를 zookeeper에 갱신해준다.

[그림16 DELETED event를 감지하고 rs 상태 갱신]


죽었던 mongo server를 되살리게 된다.


[그림17 죽었던 기존 Primary를 되살림]


이를 감지해 다시 rs의 상태를 zookeeper에 갱신한다.

[그림18 rs 상태 갱신]


이처럼 watcher의 기능은 매우 활용도가 높으며, 이와 같은것 이외에도 활용가능성이 풍부한 기능이다.

스크린샷 2015-09-10 오후 3.10.47

[그림19 zookeeper 활용의 예]


그림 19와 같이 여러가지 서버를 관리해줄때 활용도가 높은 것이 바로 zookeeper이다. 현재 네이버 본사에서는 zookeeper을 사용하고 있다고 한다.

스크린샷 2015-09-10 오후 3.10.54

[그림20 zookeeper 활용의 예]



[그림21 zookeeper 활용의 예]


[그림22 zookeeper 활용의 예]


<출저: https://unagi44.wordpress.com/Developer Lee>


zookeeper은 이처럼 다양한 분야에서 많이 활용할 수 있다. watch의 기능을 이용해서 Node를 관리 할수도 있기 때문에 죽었었던 서버도 다시 되살릴 수 있다. Zookeeper이라고 하면 모르는 사람이 많을 수도 있는데 알고 나면 굉장히 유용한 것이라는 것을 알 수 있다. 다음 포스팅에서는 실제로 Watch기능이 어떤식으로 만들어지고 동작하는지에 대해 자세히 포스팅 해보도록 하겠다. 끝으로 Zookeeper에 대해 포스팅을 허락해준 친구에게도 고마움을 전한다.

               

                                                     




반응형
LIST

'mongoDB > zookeeper' 카테고리의 다른 글

zookeeper의 watcher 기능 실습 2  (0) 2016.09.16
zookeeper의 watcher 기능 실습 1  (0) 2016.09.11
zookeeper의 특성과 간단한 실습  (0) 2016.09.08
zookeeper의 필요성  (4) 2016.09.06
블로그 이미지

만년필석사

,