ZooKeeper是一个开源的分布式协调服务。分布式应用程序开源基于ZooKeeper实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能
集群角色:Leader(集群中存在一个)、Follower、Observer
在master机器中解压ZooKeeper到/home/zookeeper并且在/home/zookeeper/conf/zoo.cfg进行配置
server.1=master:2888:3888
server.2=slave01:2888:3888
server.3=slave02:2888:3888
注意:master,slave01,slave02都要有同样的配置。(把master中/home/zookeeper复制到slave即可)server后面的数字X即使机器的ID,在集群机器中需要在datadir(zoo.cfg设置)目录下创建一个名为myid内容为X(机器ID)
只要集群中超过一半的机器能够正常,那么集群就能够正常对外服务。比如集群中有5台机器,只要同时有3台机器挂掉则无法工作,相比6台机器,两者容灾能力一样,机器反而少了一台。所以我们都将集群中的机器数设置为奇数(2n+1)
ZooKeeper节点类型
1.持久节点(PERSISTENT)
所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。
2.持久顺序节点(PERSISTENT_SEQUENTIAL)
这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个顺序,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。
3.临时节点(EPHEMERAL)
和持久节点不同,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会被自动清除掉。注意,临时节点下不能创建子节点。
4.临时顺序节点(EPHEMERAL_SEQUENTIAL)
此节点属于临时节点,不过带有顺序。利用这个特性做分布式锁:
(1)客户端调用create()方法创建名为"locknode/guid-lock-"的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。
(2)客户端调用getChildren("locknode")方法来获取所有已经创建的子节点,注意,这里不注册任何Watcher。
(3)客户端获取所有的子节点路径,如果发现自己创建的子节点序号最小,那么就认为该客户端获得了锁
(4)如果客户端自己创建的子节点不是最小的,需要找到序号最小的子节点,调用exists()方法,并注册Watcher
(5)当被watch的节点被移除,客户端会收到相应的通知,此时重复第三部直到自己创建的节点是序号最小的节点
Watch的注意事项:
(1)Watch是一次性触发器,如果得到了一个Watch事件,而希望在以后发生变更时继续得到通知,应该再设置一个Watch
(2)因为Watch是一次性触发器,而获得事件再发送一个新的设置Watch的请求过程中会有延时,所以无法确保看到了所有发生在ZooKeeper上的一个节点上的事件。所以请处理好在这个时间窗口中可能会发生多次znode变更的这种情况。
(3)如果同一个Watch对象在同一个文件上分贝通过exists和getData注册了两次,而这个文件之后被删除了,这个Watch对象只会收到一次该文件的deletion通知。同一个Watch注册同一个节点多次只会生成一个event
Watch的通知事件从server发送到client是异步的,不同的客户端和服务器之间通过socket通信,由于网络延迟或者其他原因导致客户端在不同的时刻监听到事件,由于Zookeeper本身提供了ordering guarantee,即客户端监听事件后才会感知到它所监视的znode发生了变化。