Zookeeper分布式协调服务

一、起源

  Zookeeper起源于雅虎研究院的一个研究小组,当时他们发现,在雅虎内部的许多系统基本都需要依赖一个类似的系统进行分布式协调,但是这些系统往往都存在分布式单点问题。单点问题就是在整个分布式系统当中,如果某个独立功能的程序或角色只运行在某一台服务器上时,这个节点就被成为单点。当这台服务器宕机,那么真整个分布式系统就会无法正常运行,这种现象被称为单点故障。

  

 

  Zookeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题。它本质上是一个分布式的小文件存储系统,提供基于类似文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。

二、Zookeeper的特性

  1.全局数据一致性:每个服务器都保存一份相同的数据副本,客户端连接到集群的任意节点上看到的目录树都是一致的,也就是数据都是一致的,这也是Zookeeper的做重要特征。

  2.可靠性:如果有消息(如对目录的增删改查)被其中一台服务器接收,那么将被所有的服务器接收。

  3.顺序性:Zookeeper顺序性主要分为全局有序和偏序两种。无论是全局有序还是偏序,目的都是为了保证Zookeeper的全局数据一致。

      (1)全局有序:指如果在一台服务器上,消息A在消息B前发布,则在所有服务器上,消息A都将在消息B前被发布;

      (2)偏序:指如果消息B在消息A后被同一个发送者发布,则A必排在B前面;

  4.数据更新原子性:一次数据更新操作要么成功(超过半数以上的节点成功),要么失败,不存在中间状态;

  5.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息;

三、Zookeeper的集群角色

  Zookeeper集群具有容错性和高性能,每一个Zookeeper集群都是由多台服务器节点组成,这些节点通过复制保证各个服务器节点之间的数据一致。只要这些服务器节点超过半数可以用,那么整个Zookeeper集群就可以正常运行。

  1.Leader:它是Zookeeper集群工作的核心,也是事物性请求(写操作)的唯一调度和处理者,它是保证集群事物处理的顺序性,同时负责进行投票的发起和决议,以及更新系统状态。

  2.Follower:它负责处理客户端的非事物(读操作)请求,如果接收到客户端发来的事务性请求,则会转发到Leader处让它进行处理,同时Follower还负责在Leader选举过程中参与投票。

  3.Observer:它负责观察Zookeeper集群的最新状态的变化,并且将这个状态进行同步。对于非事物性请求可以进行独立处理,对于事物性请求,则会转发给Leader服务器进行处理。它不会参与任何形式的投票,只是提供非事物性的服务,通常用于在不影响集群事物处理能力的前提下,提升集群的非事物处理能力。(附参考理解图)

 

四、Zookeeper的数据模型

  1.数据存储结构

  采用类似文件系统的目录结构进行存储,目录树中的每个节点被称为Znode可以存储数据,也可以有子节点。Zookeeper的节点需要通过绝对路径进行访问,并且要以斜杠“/”开头,一个节点对应一个唯一路径。

   2.Znode中存储的数据

    Zookeeper中的每个Znode的由三部分组成。分别是该Znode节点的元数据、数据信息和该Znode的下一个节点的信息。

    元数据:数据的数据,就是数据的状态信息,比如创建时间、修改时间、权限、版本等内容。

    数据信息:存储在Znode中的数据,其中在里面的数据通常受限制在1M大小以内,实际使用过程中其实也应该远小于1M。

    子节点信息:Znode下一个节点的信息。

  3.Zonde类型

    永久节点:该节点的生命周期不会依赖于会话,并且只有在客户端显示执行删除操作的时候,它们才能被删除。

    临时节点:该节点生命周期依赖于创建他们的会话,一旦会话结束,临时节点将会被自动删除,也可以手动删除,并且每个临时的Znode都会绑定到一个客户端,但是它们对所有客户端都是可见的,临时节点不允许拥有子节点。

五、Zookeeper的Watch机制

  Zookeeper提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统为一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态发生变化的时候,系统就会通知所有订阅者,使他们能够做出相应的处理。其中,Zookeeper就引入了Watch机制来实现这种分布式通知的功能。Zookeeper允许客户端向服务端注册一个Watch来监听,当服务端的一些事件触发了这个Watch,则它就会向指定的客户端发送一个事件通知,来实现分布式通知的功能。

  1.Watch机制的特点

    (1)一次性触发:当Watch的对象发生改变时,将会触发此对象上的Watch所对应的事件,这种监听是一次性的,后续再发生同样的事件就不会再次触发了;

    (2)事件封装:Zookeeper使用WatchEvent对象来封装服务端事件并进行传递,该对象包含了事件的三个属性,即通知状态(KeeperState)、事件类型(EventType)和节点路径(path);

    (3)异步发送:Watch的通知事件是从服务端通过异步的形式发送到客户端的;

    (4)先注册再触发:Zookeeper中的Watch机制,必须由客户端先去服务端注册监听,才会触发事件的监听机制,并会通知到客户端;

  2.Watch机制的通知状态和事件类型

    Disconnected:连接失败;

    SyncConnected:连接成功;

    AuthFailed:认证失败;

    Expired:会话过期;

    NodeCreated:节点被创建;

    NodeDataChanged:节点数据变更;

    NodeChildrenChanged:子节点数据变更;

    NodeDeleted:节点被删除;

六、Zookeeper的选举机制

  Zookeeper为了保证各个节点之间的协调工作,需要给出一个Leader的角色,而Zookeeper采用FastLeaderElection的算法,投票选举出优胜的节点作为Leader(票数过大半)。Zookeeper选举机制有两种类型,分别为全新集群选举和非全新集群选举。

  相关概念:

    (1)服务器ID:在配置集群时设置的myid文件,其中的参数分别表示服务器1、服务器2和服务器3,编号越大在FastLeaderElection算法中的权重越大;

    (2)选举状态:Zookeeper服务器有四种状态,分别是竞选状态(LOOKING)、随从状态(FOLLOWING,同步leader状态,参与投票)、观察状态(OBSERVING,同步leader状态,不参与投票)以及领导状态(LEADING);

    (3)数据ID:服务器中最新数据版本号,该值越大说明数据越新,在选举过程中数据越新权重越大;

    (4)逻辑时钟:逻辑时钟也就是投票次数,同一轮投票过程中的逻辑时钟值是相同的,逻辑时钟起始值是0,每投完一次票,这个数据就会增加。接着,与收到其他服务器返回的投票信息中的数值比较,根据不同的值做出不同的判断。如果某台服务器宕机了,则这台服务器就不会参与投票,由此它的逻辑时钟也会比其他低。

  1.全新集群选举

  由于全新集群是新搭建起来的,所以没有数据ID和逻辑时钟来影响集群的选举。假设目前有5台服务器,它们分别编号为1~5,按编号顺序一次启动Zookeeper服务。

  步骤1:服务器1启动,首先,他会给自己投票;接着发出投票信息,由于其他机器还没有启动,所以它无法接收到投票的反馈信息,因此服务器1会一直处于竞选状态;

  步骤2:服务器2启动,首先,他会给自己投票;其次,在集群中启动Zookeeper服务的机器发起投票对比,这时服务器2会跟服务器1交换结果,由于服务器2的编号大,所以服务器2胜出,此时,服务器1会将投票投给服务器2,但是此时服务器2的票数并没有大于集群的半数(5/2),所以服务器1和服务器2都还处于竞选状态;

  步骤3:服务器3启动,首先,它会给自己投票;其次,与之前的服务器1和服务器2交换信息进行投票对比,由于服务器3的编号大,所以服务器3胜出,服务器1和服务器2会将票数投给服务器3,此时投票数已经大于半数(3>5/2),由此服务器3成为领导状态,服务器1和服务器2成为随从状态;

  步骤4:服务器4启动,首先,它会给自己投票;其次,与之前启动的服务器1、2和3交换信息,虽然服务器4的编号大,但是服务器3已经优胜,所以服务器4只能成为随从状态;

  步骤5:服务器5启动,同服务器4一样,成为随从状态;

  2.非全新集群选举

  对于正常运行的Zookeeper集群,由于中途有服务器宕机,那么就需要重新选举,选举过程中需要引入服务器ID、数据ID以及逻辑时钟,因为Zookeeper集群已经运行了一段时间,那么服务器中就会存在着运行的数据。

  步骤1:首先,统计逻辑时钟是否相同,逻辑时钟小的,说明在途中可能存在有宕机的可能性,因此数据会不完整,那么该选举结果就会被抛弃,重新进行投票选举;

  步骤2:其次,统一逻辑时钟后,对比数据ID的值,数据ID值反应了数据的新旧程度,因此是数据ID大的胜出;

  步骤3:如果逻辑时钟和数据ID都相同的情况下,就比较服务器ID(服务器编号),值大的则胜出;

  非全新集群选举是优中选优,要保证Leader是Zookeeper集群中数据最完整、最可靠的一台服务器。

posted @ 2021-11-23 11:04  阁主想睡觉  阅读(439)  评论(0)    收藏  举报