1.安装和配置
a.官网下载:http://mirrors.cnnic.cn/apache/zookeeper/
b.在conf目录下修改zoo_sample.cfg的配置文件,重命名为zoo.cfg
其内容如下:
# The number of milliseconds of each tick 心跳间隔 毫秒每次
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take 初始化时,连接到服务器的间隔次数,总时间10*2=20秒
initLimit=10
# The number of ticks that can pass between
# sending a request and getting anacknowledgementZK Leader 和follower 之间通讯的次数,总时间5*2=10秒
syncLimit=5
# the directory where the snapshot isstored. //镜像数据位置
#存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
dataDir=D:\\data\\zookeeper
#错误日志位置
dataLogDir=D:\\logs\\zookeeper
# the port at which the clients willconnect 客户端连接的端口---服务器端的监听端口
clientPort=2181
注:如果启动有报错提示cfg文件有错误,可以用zoo_sample.cfg内内容替代也是可以的
进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个Java进程
D:\machine\zookeeper-3.3.6>cd bin
D:\machine\zookeeper-3.3.6\bin>
D:\machine\zookeeper-3.3.6\bin >zkServer.cmd
启动后jps可以看到QuorumPeerMain的进程
D:\machine\zookeeper-3.3.6\bin >jps
启动客户端运行查看一下
D:\machine\zookeeper-3.3.6\bin>zkCli.cmd-server 127.0.0.1:2181
2.集群
在 一台机器上通过伪集群运行时可以修改 zkServer.cmd 文件在里面加入
set ZOOCFG=..\conf\zoo1.cfg 这行,另存为 zkServer-1.cmd
如果有多个可以以此类推
还需要 在对应的
/tmp/zookeeper/1,
/tmp/zookeeper/2,
/tmp/zookeeper/3
建立一个文本文件命名为myid,内容就为对应的zoo.cfg里server.后数字
在dataDir 指定目录下创建myid 的文件,内容对应1 2 3 即可。这个的数字是唯一的,在1-255 之间,用来表示自身的id
启动3个zkServer-1.cmd,zkServer-2.cmd,zkServer-3.cmd 就OK了,如果要多服务器配置,只需要要将 3份分开放到不同服务器就OK
依次启动的时刻有错误信息,因为你启动server1 的时候 2 和 3 没找到,但是后面都启动了 就没问题了。
3.JAVA 操作zookeeper :
3.1 导入依赖:
- <dependency>
- <groupId>org.apache.zookeeper</groupId>
- <artifactId>zookeeper</artifactId>
- <version>3.4.6</version>
- </dependency>
3.2 JAVA 实现:
- // 根节点
- public static final String ROOT = "/root-ktv";
- public static void main(String[] args) throws Exception {
- // 创建一个与服务器的连接
- ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, new Watcher() {
- // 监控所有被触发的事件
- public void process(WatchedEvent event) {
- System.out.println("状态:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
- }
- });
- // 创建一个总的目录ktv,并不控制权限,这里需要用持久化节点,不然下面的节点创建容易出错
- zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
- // 然后杭州开一个KTV , PERSISTENT_SEQUENTIAL 类型会自动加上 0000000000 自增的后缀
- zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
- // 也可以在北京开一个, EPHEMERAL session 过期了就会自动删除
- zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- // 同理,我可以在北京开多个,EPHEMERAL_SEQUENTIAL session 过期自动删除,也会加数字的后缀
- zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
- // 我们也可以 来看看 一共监视了多少家的ktv
- List<String> ktvs = zk.getChildren(ROOT, true);
- System.out.println(Arrays.toString(ktvs.toArray()));
- for(String node : ktvs){
- // 删除节点
- zk.delete(ROOT+"/"+node,-1);
- }
- // 根目录得最后删除的
- zk.delete(ROOT, -1);
- zk.close();
- }
zookeeper 的结构图和其他的一些功能,可参考: http://www.blogjava.net/shenh062326/archive/2011/10/29/zookeeper_yuling.html