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: 자식 노드가 변경 됨을 감지
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가 죽었을때는?
[그림14 Primary 장애 발생]
Zookeeper Server와 connection이 끊겨 해당 Ephemeral Node가 삭제된다.
[그림15 Primary에 해당되는 Ephemeral Node 삭제 됨]
이를 Watcher가 감지해 변경된 rs의 상태를 zookeeper에 갱신해준다.
[그림16 DELETED event를 감지하고 rs 상태 갱신]
죽었던 mongo server를 되살리게 된다.
[그림17 죽었던 기존 Primary를 되살림]
이를 감지해 다시 rs의 상태를 zookeeper에 갱신한다.
[그림18 rs 상태 갱신]
이처럼 watcher의 기능은 매우 활용도가 높으며, 이와 같은것 이외에도 활용가능성이 풍부한 기능이다.
[그림19 zookeeper 활용의 예]
그림 19와 같이 여러가지 서버를 관리해줄때 활용도가 높은 것이 바로 zookeeper이다. 현재 네이버 본사에서는 zookeeper을 사용하고 있다고 한다.
[그림20 zookeeper 활용의 예]
[그림21 zookeeper 활용의 예]
[그림22 zookeeper 활용의 예]
<출저: https://unagi44.wordpress.com/Developer Lee>
zookeeper은 이처럼 다양한 분야에서 많이 활용할 수 있다. watch의 기능을 이용해서 Node를 관리 할수도 있기 때문에 죽었었던 서버도 다시 되살릴 수 있다. Zookeeper이라고 하면 모르는 사람이 많을 수도 있는데 알고 나면 굉장히 유용한 것이라는 것을 알 수 있다. 다음 포스팅에서는 실제로 Watch기능이 어떤식으로 만들어지고 동작하는지에 대해 자세히 포스팅 해보도록 하겠다. 끝으로 Zookeeper에 대해 포스팅을 허락해준 친구에게도 고마움을 전한다.
'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 |