ZooKeeper是Hadoop的分布式协调服务,可以用于构建一般的分布式应用。
可以将ZooKeeper看作一个具有高可用性特征的文件系统。这个文件系统使用节点znode来组合成一个树形层次结构。znode可以存储数据及相关联的ACL,znode存储的数据被限制在1MB之内。
ZooKeeper的数据访问具有原子性,读znode数据要么全部读取,要么读取失败;同样写操作也是,要么写成功,要么写失败,不存在部分写成功的情况。
ZooKeeper通过路径被引用。例如/zoo/cat。
znode的类型在创建后不可修改。
znode准确来说有四种类型:
1.短暂znode:创建短暂znode的客户端在会话结束后,ZooKeeper会把它删除。
2.短暂顺序znode:短暂znode添加了顺序号。
3.持久znode:只有当客户端明确要删除时,才会删除。
4.持久顺序znode:持久znode添加了顺序号。
顺序号可以对所有事件进行全局排序,这样客户端就可以根据顺序号推断事件的顺序。可以通过顺序号实现共享锁。
ZooKeeper的观察机制,当znode以某种方式发生变化时,观察机制(watcher)可以让客户端得到通知。但是观察只能被触发一次,为了实现多次通知,需要重新注册所需的观察。
ZooKeeper中有9种基本操作:
create:创建一个znode,必须有父节点
delete:删除一个znode
exists:znode是否存在并返回元数据
getChildren:获取一个znode的子节点列表
getData:获取znode保存的数据
setData:修改znode保存的数据
getACL:获取一个znode的ACL
setACL:修改一个znode的ACL
sync:将客户端的视图与ZooKeeper的同步
ZooKeeper中的更新操作是有条件的,delete和setData需提供版本号,版本号一致才可以执行成功.
ZooKeeper中有一个被称为multi的操作,用于将多个操作集合成一个操作单元.类似事务的功能,可以确保这些子操作要么都成功要么都失败.
ZooKeeper可以在exists/getData/getChildren上设置观察。观察可以被写操作create/delete/setData触发,观察触发时产生观察事件。
观察触发器 | |||||
设置观察的操作 | 创建znode | 创建子节点 | 删除znode |
删除子节点 | setData |
exists | NodeCreated | NodeDelete | NodeDat- aChanged |
||
getData | NodeDelete | NodeDat- aChanged |
|||
getChildren | NodeChildr- enChanged |
NodeDelete | NodeChildre- nChanged |
创建znode的时候会创建ACL列表,ZooKeeper提供了三种身份验证机制
1.Digest 通过用户名密码来识别客户端。zk.addAuthInfo("digest","user:password".getBytes())
2.sasl 通过Kerberos来识别客户端
3.IP 通过客户端Ip地址识别客户端。new ACL(Perms.READ,new IP("ip","10.0.0.1"))
ACL权限列表
ACL权限 | 允许的操作 |
create | create子节点 |
read | getChildren/getNode |
write | setData |
delete | delete子节点 |
admin | setACL |
ZooKeeper支持第三方身份验证系统插入。
ZooKeeper服务有两种不同的运行模式:
1.独立模式
2.复制模式
ZooKeeper通过复制来实现高可用性,只要集合中半数以上处于可用状态,它就能提供服务(这也是推荐奇数台服务器的原因)。
ZooKeeper使用了Zab协议,该协议包含两个可以无限重复的阶段
1.领导者选举
2.原子广播 所有的写请求都回转发给领导者,再由领导者将更新广播给跟随者,当半数以上跟随者已经修改后,领导者才会提交这个更新。
ZooKeeper服务提供的一致性:
1.顺序一致性 客户端将znode的值改为a,然后又改为b,则没有客户端可以先看到b再看到a
2.原子性 每个更新操作要么全成功,要么全失败
3.单一系统映像 一个客户端连接到哪一台服务器看到的都是同样的系统视图。
4.持久性 更新一旦成功,其结果就会持久存在不会撤销
5.及时性 在客户端读取znode的值时,执行sync操作,会得到最新的值
每一个对znode树的更新都被赋予一个全局唯一的ID,称为zxid。ZooKeeper要求对所有的更新进行编号并排序,它决定了分布式系统的执行顺序。
每个ZooKeeper客户端的配置中都包含集合体中服务器的列表.
客户端与ZooKeeper服务器连接后,每个会话都会有一个超时的时间设置.
客户端通过ping请求(心跳)保持会话不过期.
客户端可以自动的进行故障切换.
较短的会话超时会较快的检测到机器的故障,但是可能出现振动现象(服务器在很短的时间内反复出现离开后又重新加入的情况).
对于创建较复杂暂时状态的应用程序,应该设置较长的会话超时.
ZooKeeper集合体中服务器越多,会话超时的设置就应该越大.
ZooKeeper可以实现分布式锁服务,首先指定一个作为锁的znode,希望获取锁的客户端创建一些短暂顺序的znode,顺序号最小的获取到锁。