hadoop学习笔记之zookeeper服务

1.zookeeper基础

zookeeper是Hadoop生态圈中一份子,其作用是解决分布式系统之间协调通信问题。zookeeper维护着一个树形层次结构,树上的节点称为znode,这样的树形结构类似于文件系统下文件目录结构,znode中存储数据和相应的ACL(访问控制列表),znode也可以含有多个子结点,与文件系统不同的是,znode存放数据量小,所以存放在内存中。zookeeper通过类似于文件系统路径的方式锁定某一个znode节点,如/hbase/rs表示根目录下hbase节点下的rs节点,但必须是绝对路径。zookeeper在分布式程序中实际上起到配置管理器的作用,每一个znode节点存放的是相应配置信息,比如在hbase中,客户端访问数据,首先要找到-root-表所在regionServer,这样的信息便是存放在/hbase/meta-region-server节点中。

2.zookeeper原理

zookeeper中有三种角色:leader、follower和observer;zookeeper在每一个节点上都有运行进程,这些进程在启动时会选举出leader,其余的是follower,也可以设置部分为observer,区别在于observer没有选举权。

zookeeper基于ZAB(Zookeeper Atomic Broadcast)消息协议,服务器节点有三种状态:Looking、following、leading。ZAB消息协议有以下几个阶段:

1.选举:各服务器节点向其他服务器发送选自己为leader的投票(附带节点最大zxid),服务器等待回应,如果服务器接收到比自己当前投票zxid更高的投票,那么更新自己的投票为高zxid投票并广播;服务器会记录其他服务器节点投票,当与自己投票一致的服务器达到半数,那么就结束选举,确定自己角色。这时服务器处于following或leading状态,接收到其他looking状态服务器发来的投票时,便回应已选出leader

2.发现:选举完成之后,follower会向leader同步最近接收事务信息。

3.同步:leader会要求所有follower与之同步数据,如果follower缺失数据,则leader向其发送DIFF提案;如果follower缺失数据较多,则leader向其发送Snap提案。这也是为什么leader需要选择最大zxid的原因。

4.广播:当新节点加入集群时,对新节点同步。客户端发送写请求时,转发给leader,leader先本地化,而后向所有follower广播提案,当超过半数ACK时,leader才会提交更新。

当leader节点挂掉之后,会在其余节点中选举出新的leader节点。

3.保证一致性

每次对znode树的更新,都会产生一个全局不相同的zxid相当于版本id。这样就能确定请求更新的顺序,保证顺序一致性。
4.会话
客户端连接到服务器之后,在服务器会创建一个新的会话,设置会话超时时间。设置会话超时时间的意义在于服务器端可以根据会话超时发现客户端故障,断开会话连接,所以会话超时时间不能过长;如果设置会话超时时间过短,会使得客户端因为网络迟缓等原因,自动掉线,反复重连。对于应用程序会话创建比较复杂的情况,应该将会话时间设置的长一些,以使得客户端可以在重启后仍然可以连接上,这适用于服务器维护等情况。

客户端在会话空闲时,会每个一段时间去ping服务器以保证会话不会过期。在连接服务器时,会设置ping周期,对于ping周期的设置,应该设置短一些,因为周期过长不能及时发现服务器故障。客户端发现服务器故障之后,会进行故障服务器切换,重新连接到另一台服务器上,这时候所有会话还未失效。
5.分布式锁

分布式锁提供一组进程间互斥的机制,其原理是创建一个znode节点leader,客户端访问时,会在/leader下创建短暂znode子节点并设置一个watcher观察,命名方式是lock-x;/leader下znode是顺序的,当前一个节点放弃锁,将会触发顺序号最小的一个znode上的watcher。客户端处理watcher事件获得锁。


当客户端因异常断开连接,再次连接时,客户端无法确定是否已经创建过znode结点,为解决这个问题,在znode的命名中加入客户端对应id,id通常是用会话id。

猜你喜欢

转载自blog.csdn.net/flushest/article/details/61198593