ZooKeeper介绍

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,顺序号最小的获取到锁。

猜你喜欢

转载自nameethan.iteye.com/blog/2421880