ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。因为ZooKeeper的开源特性,后来咱们的开发者在分布式锁的基础上,摸索了出了其余的使用方法:配置维护、组服务、分布式消息队列、分布式通知/协调等。node
简单的数据结构:共享的数型结构,相似文件系统,存储于内存。linux
能够构建集群:避免单点故障,3-5台机器就能够组成集群,超过半数正常工做就能提供服务。apache
顺序访问:对于每一个读请求,zk会分配一个全局惟一的递增编号,利用这个特性能够实现高级协调服务。bash
高性能:基于内存操做,服务于非事物请求,适用于读操做为主的业务场景。服务器
可去官网下载一个稳定的版本,而后进行安装:www.apache.org/dyn/closer.…网络
解压后在zookeeper的conf目录下建立配置文件zoo.cfg,里面的配置信息可参考统计目录下的zoo_sample.cfg文件,咱们这里配置为:数据结构
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper-data/
clientPort=2181
复制代码
tickTime:指定了ZooKeeper的基本时间单位(以毫秒为单位);异步
initLimit:指定了启动zookeeper时,zookeeper实例中的随从实例同步到领导实例的初始化链接时间限制,超出时间限制则链接失败(以tickTime为时间单位);分布式
syncLimit:指定了zookeeper正常运行时,主从节点之间同步数据的时间限制,若超过这个时间限制,那么随从实例将会被丢弃;工具
dataDir:zookeeper存放数据的目录;
clientPort:用于链接客户端的端口。
在配置完响应的配置后,进入到bin目录下能够直接经过 bin 目录下的zkServer.sh脚本执行相应的操做:
1. 启动zk服务sh zkServer.sh start 或者./zkServer.sh start.
2. 查看zk服务状态sh zkServer.sh status
3. 中止当前zk服务sh zkServer.sh stop
4. 重启服务sh zkServer.sh restart
复制代码
客户端可使用./zkClient.sh -server 127.0.0.1:2181链接到当前zookeeper服务器。客户端命令行工具的一些简单操做以下:
1.ls:获取路径下的节点信息,注意此路径为绝对路径,相似于linux的ls命令。如ls /zookeeper;
2.create:建立节点,其中-s为顺序充点,-e临时节点。如create /zookeeper/node1"test_create";
3.get:获取节点信息,注意节点的路径皆为绝对路径,也就是说必要要从/(根路径)开始。如get /;
4.set:设置节点的数据。如set /zookeeper "hello world";
5.delete:删除节点,不能递归删除,若是存在子节点则删除失败。
6.rmr:递归删除
7.quit:退出客户端
8.help:帮助命令
....
复制代码
zookeeper的师徒结构和标准的Unix文件系统相似,每一个节点称为“数据节点”或Znode,每一个Znode能够存储数据同时能够挂载子节点,所以能够称之为“树”。
1.在Zookeeper中,znode是一个跟Unix文件系统路径类似的节点,能够往这个节点存储或获取数据
2.经过客户端可对znode进行增删改查的操做,还能够注册watcher监控znode的变化。
Znode
1.Znode是Zookeeper中数据的最小单元,每一个Znode上均可以保存数据,同时还能够挂载子节点,znode之间的层级关系就像文件系统的目录结构同样,zookeeper将所有的数据存储在内存中以此来提升服务器吞吐量、减小延迟的目的。
2.Znode有三种类型,Znode的类型在建立时肯定而且不能修改。
临时(EPHEMERAL):在建立临时Znode的客户端会话结束时,服务器会将临时节点删除。临时节点不能有子节点(即便是临时子节点)。虽然每一个临时Znode都会绑定一个特定的客户端会话,可是它们对全部客户端都是可见的
持久(PERSISTENT):节点一旦被建立,会一直存在与服务器上,Zookeeper规定全部非叶子节点必须是持久化节点
顺序(SEQUENTIAL):若是在建立Znode时设置了顺序标识,那么该Znode名称以后便会附加一个值,这个值由一个单调递增的计数器(由父节点维护)所添加
3.临时节点在两种状况下会被删除
当建立Znode的客户端的会话因超时或者主动关闭而终止时(不是TCP链接断开) 当某个客户端(不必定是临时Znode的建立者)主动删除该节点时
4.每一个数据节点除了存储数据内容以外,还存储了数据节点自己的一些状态信息。Znode的状态(Stat)信息
序号 | 属性 | 结数据构 | 描述 |
1 | czxid | long | 节点被建立的Zxid值 |
2 | mzxid | long | 节点被修改的Zxid值 |
3 | pzxid | long | 子节点最有一次被修改时的事务ID |
4 | ctime | long | 节点被建立的时间 |
5 | mtime | long | 节点最后一次被修改的时间 |
6 | versoin | long | 节点被修改的版本号 |
7 | cversion | long | 节点的所拥有子节点被修改的版本号 |
8 | aversion | long | 节点的ACL被修改的版本号 |
9 | emphemeralOwner | long | 若是此节点为临时节点,那么它的值为这个节点 拥有者的会话ID;不然,它的值为0 |
10 | dataLength | int | 节点数据域的长度 |
11 | numChildren | int | 节点拥有的子节点个数 |
对于持久节点和临时节点,同一个znode下,节点的名称是惟一的! —— 实现分布式锁的基础
客户端能够在znode上设置watcher,监听znode的变化。Znode发生变化(Znode自己的增长,删除,修改,以及子Znode的变化)能够经过Watch机制通知到客户端。
·两类watch
1.dara watch监听数据变动
2.child watch监听子节点变化
·触发事件
Created event:
Enabled with a call to exists.
Deleted event:
Enabled with a call to exists, getData, and getChildren.
Changed event:
Enabled with a call to exists and getData.
Child event:
Enabled with a call to getChildren.
复制代码
·特性
1.一次性触发。 客户端在Znode设置了Watch时,若是Znode内容发生改变,那么客户端就会得到Watch事件。例如:客户端设置getData("/znode1", true)后,若是/znode1发生改变或者删除,那么客户端就会获得一个/znode1的Watch事件,可是/znode1再次发生变化,那客户端是没法收到Watch事件的,除非客户端设置了新的Watch。
2.有序性。Watch事件是异步发送到Client。Zookeeper能够保证客户端发送过去的更新顺序是有序的。例如:某个Znode没有设置watcher,那么客户端对这个Znode设置Watcher发送到集群以前,该客户端是感知不到该Znode任何的改变状况的。换个角度来解释:因为Watch有一次性触发的特色,因此在服务器端没有Watcher的状况下,Znode的任何变动就不会通知到客户端。不过,即便某个Znode设置了Watcher,且在Znode有变化的状况下通知到了客户端,可是在客户端接收到这个变化事件,可是尚未再次设置Watcher以前,若是其余客户端对该Znode作了修改,这种状况下,Znode第二次的变化客户端是没法收到通知的。这多是因为网络延迟或者是其余因素致使,因此咱们使用Zookeeper不能指望可以监控到节点每次的变化。Zookeeper只能保证最终的一致性,而没法保证强一致性。