ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • zookeeper 노드를 만들어 보자
    카테고리 없음 2023. 4. 19. 09:55
    이번시간엔 주키퍼의 노드를 만들어 보자 일단 주키퍼 예제는 여기 있다. 주키퍼 설치는 여기 그냥 간단하게 노드 한개만 만들어 볼 예정이다.
      public static void main(String[] args) throws IOException {
        String host = "wonwoo.ml:18813,wonwoo.ml:18815,wonwoo.ml:18819";
        String rootNode = "/zk_test";
        String childNode = "/zk_test/netty2";
        String data = "http://localhost:9091";
        ZookeeperWatcher zookeeperWatcher = new ZookeeperWatcher(host, rootNode, childNode, data);
        zookeeperWatcher.make();
        zookeeperWatcher.run();
    
      }
    
    host는 주키퍼가 설치 되어 있는 서버이고 root 노드는 말그대로 root노드이다. childNode는 root의 child를 의미한다. 그리고 노드의 남길 data를 정의했다. 주키퍼는 비동기 콜백 형태로 되기 때문에 쓰레드를 락 걸고 했다.
    public class ZookeeperWatcher implements Watcher, AsyncCallback.StringCallback {
    
      private ZooKeeper zooKeeper;
      private String rootNode;
      private String childNode;
      private String data;
      boolean dead = true;
    
      ZookeeperWatcher(String hostPort, String rootNode, String childNode, String data) throws IOException {
        this.rootNode = rootNode;
        this.childNode = childNode;
        this.data = data;
        zooKeeper = new ZooKeeper(hostPort, 6000, this);
      }
    
      public void make() {
        zooKeeper.create(rootNode, "root".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, this, "root");
      }
    
      @Override
      public void process(WatchedEvent event) {
    
      }
    
      @Override
      public void processResult(int rc, String path, Object ctx, String name) {
        KeeperException.Code code = KeeperException.Code.get(rc);
        if (code == KeeperException.Code.OK) {
          System.out.println(code);
          if ("root".equals(ctx)) {
            zooKeeper.create(childNode, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, this, null);
          }
        } else {
          dead = false;
          closing();
        }
      }
    
      public void run() {
        try {
          synchronized (this) {
            while (dead) {
              wait();
            }
          }
        } catch (InterruptedException e) {
        }
      }
    
      public void closing() {
        synchronized (this) {
          notifyAll();
        }
      }
    }
    
    나머지는 나중에 더 살펴보고 이번시간엔 make와 processResult를 알아 볼 것이다. 그냥 대충 만들었다. make 함수의 zooKeeper.create는 아시다시피 노드를 생성 하는 것이다. 여기서 중요한건 노드가 생성한다고 하면 callback으로 성공인지 실패인지 등등 알려준다. 그게 바로 processResult 함수이다. 성공인지 실패인 알 수 있다. 그리고 노드를 만들 때 영원히 노드를 남길 것인지 아니면 세션이 있을 때만 남길 것인지 정할 수 있다. create할때 CreateMode.PERSISTENT 속성을 넣으면 영원히 CreateMode.EPHEMERAL 속성은 해당 세션이 살아 있을 경우에 지속된다. 한번 테스트 해보자 main를 돌려보면 zk_test와 그 자식 netty2가 생겨났을 것이다. zk_test에는 root라는 data가 netty2에는 localhost:9091 데이터가 생성 된 것을 볼 수 있다. 그 다음에는 netty2라는 노드는 세션이 살아 있을 때만 생성 했으니 세션이 끊어 버리면 사라질 것으로 예상된다. 한번 종료해보자 그럼 netty2는 사라졌다. 한 5초 이내로 사라진다. 아주 바로는 사라지지 않는다. 이것으로 주키퍼의 node생성에 대해 알아봤다. 나중에는 vertx나 netty를 연동해서 실제 서버가 잘 돌고 있는지 알아볼 예정이다. 언제가 될지는...

    댓글

Designed by Tistory.