分享

Zookeeper

 印度阿三17 2019-06-20

 

 

zookeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务

一般提供常见的服务有:命名服务,配置管理,集群管理,分布式锁,分布式锁

 

 

命名服务:在zokeeper的文件系统里创建要给目录,就会有唯一的path。

在我们使用 tborg无法确定上游程序的部署机器与下游程序约定好path,通过path就能互相探索发现。

 

 

 

配置管理:如果程序分散部署在多台机器上,要逐个改变配置就变得困难。

如果把这些配置全部放到zookeeper中,保存在某个目录节点中,然后所有相关 程序对这个目录节点进行监听,

一旦配置信息发生变化,每个应用程序就会收到zookeeper通知,然后从zookeeper获取新的配置信息应用到系统中。

 

 

 

zookeeper集群管理:主要有两点:

是否有机器退出和加入:所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。

一旦有机器挂掉,该机器与zookeeper的连接断开,所创建的临时目录节点被删除,所有其它机器都收到通知:某个兄弟目录被删除,

于是所有人都知道:它上船了。

 

 

 

选举master:所有机器收到通知:新兄弟目录加入,highcount又有了,

所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。

 

 

 

zookeeper分布式锁:锁服务分为两种:

一个是保持独占:将zookeeper上的要给znode看作是一把锁,通过createznode的方式来实现。

所有客户端都去创建 /distribute_lock节点,最终创建成功的那个客户端就拥有了这把锁。

用完删除掉自己创建的 distribute_lock节点就释放出锁。

 

一个是控制时序:distribute已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。

 

 

 

zookeeper队列管理:两种类型的队列:

1 同步队列,一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达(在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目)。

 

2 队列按照FIFO方式进行入队和出队操作(和分布式锁服务中的控制时序场景基本原理一致,入列又编号,出列按编号)。

 

 

 

分布式与数据复制:

zookeeper作为一个集群提供一致的数据服务,自然,它要在所有机器间作数据复制。数据复制的好处:

 

1 容错:一个节点出错,不至于让整个系统停止工作,别的节点可以接管它的工作。

 

2 提高系统的额扩展能力:把负载分分布到多个节点上,或者增加节点来提高系统的负载能力。

 

3 提高性能:让客户端本地访问就近的节点,提高用户访问速度。

 

 

从客户端读写访问的透明度来看,数据复制集群系统分两种:

 

1 写主(WriteMaster):对数据的修改提交给指定的节点。读无此限制,可以读取任何一个节点。这种情况下客户端需要对读和写进行区别,俗称读写分离。

 

2 写任意(Write Any):对数据的修改可提交给任意的节点,和读一样。这种情况下,客户端对集群节点的角色与变化透明。

 

 

 

zookeeper 特性:

*** 1 最终一致性:client不论连接到哪个Server,展示给它都是同一个视图。

 

2 可靠性:具有简单,健壮,良好的性能,如果消息被一台服务器接受,那么它将被所有的服务器接受。

 

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

 

但由于网络延时等原因,zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

 

4 等待无关:慢的或者失效的client不得干预快速的client的请求,使每个client都能有效的等待。

 

5 原子性:更新只能成功或者失败,没有中间状态。

 

6 顺序性:包括 全局有序 和偏序两种:

 

全局有序 是指 如果在一台服务器上消息 A 在消息 B前发布,则在所有 Server上消息 A都将在消息B前发布;

偏序 是指 如果一个消息B在消息A后被同一个发送者发布,A必将排在B前面。

 

 

 

zookeeper工作原理:zookeeper的核心是原子广播,这个机制保证了Server之间的同步。实现这个机制的协议叫做Zab协议。

 

Zab协议有两种模式,分别是 恢复模式(选主)和广播模式(同步)。

 

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步后,恢复模式就结束了。

状态同步保证了leader和Server具有相同的系统状态。 为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。

 

 

 

zookeeper选主流程 (basic paxos)

当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。

Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。

 

1.选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;

 

2.选举线程首先向所有Server发起一次询问(包括自己);

 

3.选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,

最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;

 

4.收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;

 

5.线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 1的Server票数,设置当前推荐的leader为获胜的Server

,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。

通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n 1,且存活的Server的数目不得少于n 1. 每个Server启动后都会重复以上流程。

在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。

 

 

Zookeeper选主流程(fast paxos)

fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,

当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,

然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

来源:https://www./content-4-252601.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多