ZooKeeper
ZooKeeper提供通用的分布式锁服务,用以协调分布式应用
Hadoop使用Zookeeper的事件处理确保整个集群只有一个NameNode,存储配置信息等.
HBase使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕机,存储访问控制列表等.
Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。
Zab协议有两种模式:恢复模式 广播模式
zookeeper:注册,监听事件Watcher,回调函数
znode有两种类型,瞬时的(ephemeral)和持久的(persistent)
znode有四种形式的目录节点
PERSISTENT EPHEMERAL PERSISTENT_SEQUENTIAL EPHEMERAL_SEQUENTIAL
特点 | 说明 |
---|---|
最终一致性 | 为客户端展示同一个视图,这是zookeeper里面一个非常重要的功能 |
可靠性 | 如果消息被到一台服务器接受,那么它将被所有的 服务器接受。 |
实时性 | Zookeeper不能保证两个客户端能同时得到刚更新 的数据,如果需要最新数据,应该在读数据之前调 用sync()接口。 |
独立性 | 各个Client之间互不干预 |
原子性 | 更新只能成功或者失败,没有中间状态。 |
顺序性 | 所有Server,同一消息发布顺序一致。 |
zookeeper允许分区出现(最终一致性)
顺序性避免冲突
角色模型
集群状态 选举模式 安其内 , 广播模式 壤其外
Server状态
LOOKING:当前Server不知道leader是谁,正在搜寻
LEADING:当前Server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前Server与之同步
主从分工
领导者(leader)负责进行投票的发起和决议,更新系统状态
学习者(learner)包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票
Observer 可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度
客户端(client) 请求发起方
zookeeper的广播模式
广播模式,两阶段提交 --对外
在主从模型的机制下,zookeeper内部分为一个leader和n个follower,其中follower用于收集并处理简易客户端需求,将无法处理的客户端需求传给leader;leader收到follower所传信息后,开始发起投票并通知follwer进行投票,follwer把投票结果发送给leader,leader将结果汇总,然后由leader下达执行客户端请求指令,将指令以消息队列形式告知所有follower,这时所有follower都有关于客户端处理的最新消息。
zookeeper的恢复模式,(fllower同时知道) --对内
当zookeeper中的leader发生故障时,zookeeper需要通过选票的方式,选出leader,选票规则应用到serverID(sid)sid是集群启动时每个服务器自带,还需要用到版本ID(最新消息)。当leader故障时,先比较各个follower的版本ID,若一致再比较sidm,谁的版本号大谁就是leader,版本号相同,sid大就是leader。
详述zookeeper选主的流程
当zookeeper集群第一次起动时,此时版本号相同, 若多台server同步启动,sid大的为主
若多台server逐个启动,最先大的sid为主
当leader挂掉时,假设此时只有一个节点知晓,我们假设此时第一个知晓leader挂掉的服务器为a,a服务器先给自己做leader投一票,然后将leader挂掉的消息传递给其他服务器,若b版本号大于a,此时b会否定a做leader的权利,并收掉a的票,同理,若c版本号小于a,则c认同a做leader并给a投一票。因为各个服务器投票是乱序的,所以最终会选举出版本号最大的为leader,若版本号相同,sid大的为leader。
列出zookeeper节点命令及其作用
cZxid:节点创建时间zxid
ctime:节点创建时间
mZxid:节点最近一次修改的时间zxid
mtime:节点最近一次修改的时间
cversion:子节点数据更新次数
dataVersion:本节点数据更新次数
aclVersion:节点ACL(授权信息)的更新次数
ephemeralOwner:如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是临时节点,ephemeralOwner值为0
ls命令查看当前Zookeeper中所包含的内容 ls /
create命令创建一个新的Znode节点"testNode" create /testNode test
get命令可以查看我们创建的节点 get /testNode 打印出节点的内容
set命令对节点修改 set /testNode newTest
stat命令查看节点信息 stat /testNode
delete命令删除对应的节点 delete /testNode
rmr 类似rm -rf 删除目录及目录下所有内容 rmr /a
详述在zookeeper案例中,zookeeper的工作流程
客户端向follwer发出一个写的请求;
follwer会把请求发送给leader;
leader接收到以后开始发起投票并通知follwer进行投票;
follwer把投票结果发送给leader;
leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给leader,然后commit;
follwer把请求结果返回给客户端