介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
简单来说zookeeper=文件系统+监听通知机制。
安装
推荐docker
docker pull zookeeper
docker run -d -p 2181:2181 zookeeper
非docker
先安装jdk
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
cp conf/zoo_sample.cfg conf/zoo.cfg
bin/zkServer.sh start
使用
Zookeeper Golang客户端:go-zookeeper的基本使用
go get -u -v github.com/samuel/go-zookeeper
package main
import(
"fmt"
"time"
"github.com/samuel/go-zookeeper/zk"
)
func callback(event zk.Event) {
fmt.Println("*******************")
fmt.Println("path:", event.Path)
fmt.Println("type:", event.Type.String())
fmt.Println("state:", event.State.String())
fmt.Println("-------------------")
}
func main() {
// option := zk.WithEventCallback(callback)
var hosts = []string{"192.168.13.2:2181"}//server端host
// conn, _, err := zk.Connect(hosts, time.Second*5, option)
conn, _, err := zk.Connect(hosts, time.Second*5)
defer conn.Close()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("connect ok")
var path="/test"
var data=[]byte("hello zk")
var flags=int32(0)
//flags有4种取值:
//0:永久,除非手动删除
//zk.FlagEphemeral = 1:短暂,session断开则改节点也被删除
//zk.FlagSequence = 2:会自动在节点后面添加序号
//3:Ephemeral和Sequence,即,短暂且自动添加序号
var acls=zk.WorldACL(zk.PermAll)//控制访问权限模式
exist,sta,err := conn.Exists(path)
if err != nil {
fmt.Println(err)
return
}
if !exist {
p,err_create:=conn.Create(path,data,flags,acls)
if err_create != nil {
fmt.Println(err_create)
}
fmt.Println("create:",p)
}
_, _, ech, err := conn.ExistsW(path)
if err != nil {
fmt.Println(err)
return
}
go watchCreataNode(ech)
exist,sta,err = conn.Exists(path)
if err != nil {
fmt.Println(err)
return
}
if exist {
sta,err = conn.Set(path,[]byte("wjs"),sta.Version)
fmt.Println(sta,err)
}
b, sta, err := conn.Get(path)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))
fmt.Println(sta.Version)
//输出 create:/test
}
func watchCreataNode(ech <-chan zk.Event){
event:=<-ech
fmt.Println("*******************")
fmt.Println("path:", event.Path)
fmt.Println("type:", event.Type.String())
fmt.Println("state:", event.State.String())
fmt.Println("-------------------")
}