본문 바로가기

Etc/Zookeeper

Zookeeper Golang Client

Zookeeper Golang Client :

github.com/go-zookeeper/zk

 

go-zookeeper/zk

Native ZooKeeper client for Go. Contribute to go-zookeeper/zk development by creating an account on GitHub.

github.com

Zookeeper에서 제공하는 Client Library는 Java와 C 두 종류 밖에 없는듯 하다. Zookeeper 앙상블을 구성하고, Golang으로 작성된 프로그램에서 Zookeeper를 사용하기 위해 Client Library를 검색해 보았고, 가장 Star가 많길래.. 한번 사용해 보았다.

package zookeeper

import (
  "fmt"
  "log"
  "time"
    
  "github.com/go-zookeeper/zk"
)

/*
  connectAddr의 경우 zookeeper앙상블의 모든 zookeeper Server의 
  IP:Port형식을 String slice에 담아서 전달한다.
*/
func ConnectZooKeeper(connectAddr ...string) (*zk.Conn, error) {
	conn, _, err := zk.Connect(connectAddr, time.Second*10)
	if err != nil {
		log.Fatalf("err: %v\n", err)
	}

	return conn, err
}

func GetZnode(conn *zk.Conn, path string) ([]byte, *zk.Stat, error) {

	data, stat, err := conn.Get(path)

	return data, stat, err
}

func GetChildren(conn *zk.Conn, path string) ([]string, *zk.Stat, error) {

	data, stat, err := conn.Children(path)

	return data, stat, err
}

func Exist(conn *zk.Conn, path string) (bool, *zk.Stat, error) {

	exist, stat, err := conn.Exists(path)

	return exist, stat, err
}

 

CreateContainer()

  • flag에 TTL이포함되어야 한다. 그렇지 않으면 Invalid Flag Error

ACL

PermAll로 설정한 경우 (DigestACL은 user:passwd 설정) 리턴되는 ACL 형태

  • AuthACL()
    • [{Perms:31 Scheme:auth ID:}]
  • DigestACL()
    • [{Perms:31 Scheme:digest ID:user:MkkAAWC5ibFpYWKu1Zr/JdiwisA=}]
  • WorldACL()
    • [{Perms:31 Scheme:world ID:anyone}]

Method Postfix "W"의 의미

GetW(), ExistW(), ChildrenW()처럼 기존에 존재하는 메서드인 Get(), Exist(), Children()의 뒤에 W가 붙은 형태는 추가적으로 Watch를 설정하는 메서드

Create()

  • Parent Node까지 한번에 생성은 불가능하다.
    • "/parent" 노드가 없는 상황에서, "/parent/child" 노드 생성은 불가능

FLW

FLW는 Four-letter-word로 zookeeper에서 정의한 4글자 명령어이다. conf, ruok, srvr, stat.. 등이 있다.

Sync()

  • Zookeeper 앙상블에서 Leader, Follower간 Sync의 인자로 준 path 노드를 동기화하는 메서드