C++,python,热爱算法和机器学习
全部博文(1214)
分类: 大数据
2017-10-05 22:23:31
zookeeper是一个分布式的,开源的分布式应用程序,该程序主要用于管理其他分布式应用程序。其他分布式应用程序可以基于zookeeper实现数据同步,配置维护和命名服务等等。zookeeper是Hadoop的一个子项目,由于在原有的分布式应用系统中,工程师不能很好的使用锁机制,或者基于消息的协调机制不适合在某些应用中使用,因此需要一种可靠的,可扩展的,分布式的,可配置的协调机制来统一系统的状态,Zookeeper的作用就在于此。本文简单介绍Zookeeper的相关名词概念,然后简单介绍其工作原理。
zookeeper概念
zookeeper中的角色分类表如下所示:
zookeeper中的所有读操作:getData()、getChildren()和exists()都会设置一个对znode进行观察的事件。观察事件是在znode数据发生变化时,发送给建立观察的客户 的一次性触发器。
zookeeper原理
zookeeper的核心是原子广播,这个机制保证了zookeeper集群之间的数据同步。实现原子广播机制的协议是Zab协议,该协议有两种模式:恢复模式(选leader)和广播模 式(同步模式)。当服务启动或者在leader崩溃后,Zab就进入了恢复模式,当leader被选举出来后,且大多数server与leader完成状态同步后,恢复模式结束,进入同步模式。 同步模式保证了leader和server具有相同的系统状态。
为了保证事物顺序的一致性,zookeeper采用了递增的事物ID号zxid来标识事物。所有的提议(proposal)都在被提出的时候加上了zxid。zxid是一个64二进制位的数字, 他的高32位是epoch,用来标识leader是否发生变化,当一个新的leader被选举出来后,zxid就会有一个新的epoch,标识当前属于那个leader管理,低32位用来计数。
每个Server在工作过程中存在三种状态:
当leader崩溃或者集群启动或者在leader失去大多数follower时,zookeeper进入恢复模式选择出一个新的leader,让所有Server都恢复到一个正确的状态。zookeeper的 选举算法有两种:一种是基于basic paxos,一种基于fast paxos。系统默认选举算法为fast paxos。
选完leader后,zookeeper就进入了同步过程。
zookeeper主流应用场景
集中式的配置管理在集群应用中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的集群应用对各自配置信息的不同需求,并且在配置信息发生变化时配置管理中心会及时的通知到集群中的每一台机器。
zookeeper很容易实现这种集群式的配置管理,比如将APP1的所有配置信息配置到znode “/APP1“节点中,APP1的所有机器一启动就对”/APP1“这个节点进行监控(zk.exist("/APP1",true)),并且实现回调方法Watcher,那么在zookeeper上 znode ”/APP1“节点数据发生变化时,Watcher方法将会被执行,每个APP1应用都会得到通知,那 么应用可以通过zk.getData("/APP1",false,null)重新获取最新配置信息。
集群应用中,我们常常需要让每一台机器知道集群中那些机器是活着的,并且在集群机器因为宕机、网络中断等原因能够不再人工介入的情况下迅速通知到每一台机器。
zookeeper很容易实现这个功能。比如,zookeeper服务端有一个znode叫”/APP1Servers“,那么集群中的每一台机器在启动的时候都在”/APP1Servers“目录下创建一个临时的(EPHEMERAL)节点,比如Server1创建”/APP1Servers/Server1“,Server2创建"/APP1Servers/Server2",然后Server1和Server2都Watch "/APP1Servers" 这个父节点。当父节点“/APP1Servers"或者父节点下的两个子节点的数据发生变化时,均会出发监控事件并及时反馈给两个客户端(Server1和Server2)。临时的(EPHEMERAL)节点有一个很重要的特性,就是当服务器端和客户端断开时,或者创建该Znode的会话Session过期时,该Znode节点会自动消失。所以,当某台机器宕机或者断开连接时,该机器创建的临时Znode节点就会自动消失,就会触发其他机器建立的Watch,从而其他机器就可以重新获取列表信息,了解当前集群状态。
参考文章