Zookeeper(六)-选主-概念分析

Zookeeper(六)-选主-概念分析,第1张

zk通过Multi-Paxos思想实现分布式一致性,Multi-Paxos为了解决Paxos需要2轮RPC通讯(准备阶段和接受阶段)往返消息多、耗性能、延迟大的问题引入了Leader-Follower-Learner模式;考虑到高可用性,有Leader就会涉及选举Leader的问题,本节就来分析下zk是如何实现选主的;

以三个节点同时启动为例:

以3个节点中Server1作为Follower重启为例:

以4个节点中Server4作为Leader宕机为例:

Leader :一个zk集群同一时刻只有一个Leader,所有写 *** 作必须通过Leader完成,然后再广播给其他服务器
Follower :一个zk集群同一时刻有多个Follower。Follower可以直接处理读请求,但是写请求需要转发给Leader处理,同时负责在Leader处理写请求时对请求进行投票;
Observer :功能跟Follower类似,但是没有投票权;

Looking :寻找Leader状态,处于该状态的服务器会发起选主;
Following :跟随者状态,表明当前服务器是Follower;
Leading :领导者状态,表明当前服务器是Leader;
Observing :观察者状态,表明当前服务器是Observer;

Listenerrun 监听2888端口,阻塞在ServerSocketaccept,等待其他服务器请求创建连接;
RecvWorkerrun 阻塞在DataInputStreamread,获取对应服务器发送的投票信息;
SendWorkerrun 阻塞在ArrayBlockingQueuepoll,获取待发送消息,发送给对应服务器;
WorkerReceiverrun 阻塞在recvqueuepoll,获取RecvWorkerrun中接收的投票消息Notification;
WorkerSenderrun 阻塞在sendqueuepoll,获取待发送ToSend到SendWorkerrun进行处理;
QuorumPeerrun 集群模式启动过程中选举结束后,根据当前服务器状态进行之后的异步流程处理;

LinkedBlockingQueue<ToSend> sendqueue FastLeaderElection中的请求发送队列,存放的是ToSend;

LinkedBlockingQueue<Notification> recvqueue FastLeaderElection中的请求接受队列,存放的是Notification;

ConcurrentHashMap<Long, SendWorker> senderWorkerMap sid -> 当前服务器到该sid的SendWorker;每个服务器会跟比自己sid小的服务器创建一个SendWorker用于投票选主时发送投票信息;
ConcurrentHashMap<Long, ArrayBlockingQueue<ByteBuffer>> queueSendMap sid -> 当前服务器需要发送到该sid的投票消息的队列;WorkerSenderrun中会根据不同sid把对用的选票信息放入对应的ArrayBlockingQueue中;
ConcurrentHashMap<Long, ByteBuffer> lastMessageSent sid->最后一次发送到该sid的投票信息;
ArrayBlockingQueue<Message> recvQueue WorkerReceiverrun中接收到的投票信息,解析字节流转成Message放到recvQueue中;

zk选主涉及6个线程、多个集合,过程比较饶,必须要先把选主的流程和各个线程、集合的作用等搞清楚,不然理解起来比较难。下一节通过源码来具体分析选主的实现;
------ over ------

QuorumPeer继承了ZooKeeperThread线程类
orgapachezookeeperserverquorumQuorumPeer#run
本地或远程注册

在循环内根据不同的状态运行

1、readonlymode
首先判断只读模式是否打开readonlymodeenabled默认是false

2、进行领导者选举

表示:zk1、zk2、zk3三台zk服务端(myid1=1、epoch1当前届数、zxid1是当前zk1服务的状态信息)。图中连线0表示把投给自己的选票并放入sendqueue队列中,图中连线1表示发送给其他参与者(即是调用sendNotifications方法),2表示从recvqueue接收队列获取的选票与当前服务器持有选票进行比较。
orgapachezookeeperserverquorumFastLeaderElection#lookForLeader

1、第一次启动,默认投自己,并更新当前服务协议的领导者信息的值proposedLeader、proposedZxid、proposedEpoch

4、从recvqueue不断获取收到的投票信息
其他服务器的投票或投给自己的都放到这里

②、connectAll建立连接
orgapachezookeeperserverquorumQuorumCnxManager#connectAll

orgapachezookeeperserverquorumSyncedLearnerTracker#hasAllQuorums
是否过半判断

领导者角色已经确立,其他服务器启动角色处理
recvqueue数据是从MessengerWorkerReceiver线程不断获取的
1、WorkerReceiver#run
orgapachezookeeperserverquorumFastLeaderElectionMessengerWorkerReceiver#run

2、不是有效的投票者
!validVoter(responsesid)表示是观察者
这里也进行了处理,把当前current的投票放入到sendqueue并返回给当前启动的那台服务器(通过responsesid)

把当前服务得到的currentVote放入到sendqueue队列,并返回发送给这台服务器

1、FOLLOWING节点挂了一半
orgapachezookeeperserverquorumLeader#lead

不断向learners节点ping,如果挂了一半则会跳出循环leaderlead();阻塞被解除

orgapachezookeeperserverquorumQuorumPeer#updateServerState

领导者选举算法核心就是把选票封装并放入到sendqueue集合发送,通过recvqueue得到其他服务节点的选票。并不断比较PK,更改选票并不断发送,并验证是否过半。如果过半则选举出来领导者。
领导者选举触发情况:刚启动、FOLLOWING节点挂了一半、LEADING节点挂掉

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
例如,网络中一个微机用户和一个大型主机的 *** 作员进行通信,由于这两个数据终端所用字符集不同,因此 *** 作员所输入的命令彼此不认识。
为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。
当然,对于不相容终端,除了需变换字符集字符外还需转换其他特性,如显示格式、行长、行数、屏幕滚动方式等也需作相应的变换。

网上邻居共享怎么设置你知道吗我们可以为计算机创建多个用户。这里面共享的可以在使用这台计算机的用户之间的共享。可以制定要共享的用户,并设置他们的 *** 作权限。一起来看看网上邻居共享怎么设置,欢迎查阅!

怎么用网上邻居共享文件

用网上邻居共享文件办法如下:

1、我们点击网络,打开网络界面。

2、我们打开网络后,系统会d出“网络发现和文件共享已关闭。看不到网络计算机和设备。单击以更改”的提示。说明我们没有开启网络发现功能。然后我们点击上面的提示。

3、点击提示会d出选择框,我们点击启用网络发现和文件共享。

4、然后会d出这样的对话框,我们点击"是,启用所有公用网络的网络发现和文件共享"。

5、接下来我们点击桌面右下角的网络图标,然后点击“打开网络和共享中心”

6、我们点击需要设置的网络。

7、我这里点击了工作网络,这里是根据自己选择的哟。

8、选择好后,我们点击关闭。

9、然后我们到“网络和共享中心”,点击“更改高级共享设置”。

10、然后我们点击修改设置,我截图给大家。根据下图设置。

11、“媒体流”可以根据自己的需求来设置,其他按照下图设置。

12、最后我们点击“保存修改”,这样我们的Windows 7 网上邻居共享就设置好了。

网上邻居共享怎么设置教程

具体如下:

1 右击“我的电脑”选择属性,在打开的属性中计算机名,查看该选项卡中出现的局域网工作组名称,工作组名称如果不一致就会导致打不开网上邻居的现象。

2 开启guest账号:右击我的电脑,在管理用户里有个guest账号,双击此账号,将 “账户已停用”前面的勾去掉。

3安装NWlinkIPX/SPX/Net BIOS CompatibleTransportProtocol协议。

4 winxp防火墙如果是默认的设置状态的话,这意味着运行计算机的所有网络连接,难于实现网上邻居共享。同时,由于Windows防火墙默认状态下是禁止 “文件与打印机共享的”,故启用了防火墙就限制了局域网的共享问题。解决办法是:进入“本地连接”窗口,点“高级”--“设置”--“例外”在程序与服务 下勾选“文件和打印机共享”。

5删除“拒绝从网络上访问这台计算机”项中的guest账户:开始--运行“gpeditmsc”命令打开组策略,本地计算机计算机配置windows设置安 全设置本地策略用户权利指派拒绝从网络访问这台计算机。如果其中有guest,则将其删除。(原因是:有时xp的guest是不允许访问共享的)

6取消“使用简单文件共享”方式:资源管理器工具文件夹选项查看去掉“使用简单文件共享(推荐)”前面的勾。

7勾选“Microsoft网络的文件和打印机共享”。

8运行 “Servicesmsc”命令打开服务策略。启动其中的“ClipbookServer”(文件夹服务器):这个服务允许你们网络上的 其它 用户看到你的文件夹。当然有时你可把它改为手动启动,然后再使用其它程序在你的网络上发布信息。

以上就是xp系统网上邻居出现空白的解决 方法 。有需要的用户可以根据以上的 *** 作方法解决

网上邻居共享知识

说到“网上邻居”,相信很多人都很熟悉。 *** 作系统 安装完毕后,桌面上仅有的几个图标中就包含了“网上邻居”。

但是,要说起“网上邻居”的工作机制,可能大家就不太清楚了。

要说“网上邻居”的工作机制,需要联系一下生活中的例子:比如我,要 拜访 一个远方的朋友——A,我要去他的家里,那么应该怎么样做答案是先找到A的家,然后再确定看看A让不让我进他的家里。不要认为这是笑话,“网上邻居”的工作机制就是这样的。

在一个局域网中,只要双击桌面的“网上邻居”,就能看到所在网络中的所有用户,这一切似乎都顺理成章。可你有否想过:Windows怎么知道这些电脑叫什么名字、在什么地方它是如何获得它们的位置的

从Windows 2000开始,通过“网上邻居”进行的访问实际上是通过browser service(浏览服务)来进行的,下面就浏览服务的几个关键地方向大家讲解一下。

一、浏览列表

浏览列表是浏览服务的关键部分。通过这个列表,基于Windows的电脑才能发现处于网络上的电脑和服务资源,浏览列表像一个地址簿,它告诉你的电脑在哪里有资源。你的电脑通过这个列表中的信息将电脑名称解析成IP地址,提供给用户来进行访问。

那么,浏览列表是从哪里来的呢正确答案是――浏览列表是通过广播查询浏览服务器,由浏览服务器提供的。

很多时候网络中的计算机并不能正确更新浏览列表。当一台计算机正常关机时,它会向网络发出广播宣告,使浏览主控服务器及时将它从浏览列表中删除;而非正常关机后,浏览列表里仍会把该条目保持很长一段时间,这可能造成我们仍能在网络邻居里看到它而访问不了。大家可能会奇怪,我们的网络中哪来的浏览服务器

二、浏览服务器

浏览服务器是通过选举选出来的。选举的主要条件是 *** 作系统,实验中发现windows 2000 professional 的优先级是比windows xp高的。当XP先启动时它自己是浏览服务器,但当2000也启动时,2000就会发出选举请求,并最终在选举中把浏览服务器的身份抢过来。其他的条件我们就不再作探究了,反正结果就是选出主浏览服务器和备份浏览服务器。一个工作组中主浏览服务器只有一个,备份浏览服务器可以有多个,担任主浏览服务器的计算机可以同时担任备份浏览服务器。

当一个台电脑启动的时候,如果它的打印和文件共享功能是打开的,它就会在网络中发出广播包登记它自己,主浏览服务器收到广播后会把相关信息加入浏览列表中,并每隔一段周期进行验证,于是我们就会看到这个新启动的电脑了。

初次进行时,这个周期是1分钟、2分钟、4分钟和8分钟,最后到12分钟,而之后每12分钟客户机都会发一个通知,通知主浏览服务器器说“我还在呢”。如果经过三个周期(36分钟),主浏览器都没有听到“我还在呢”的通知,那么它就会把这个客户机的名字从浏览列表中删除掉,“网上邻居”中就再也不会有这个用户了。

如果网络较大,所有的事情都让主浏览服务器干岂不是会较大影响这台计算机性能,所以我们查询的浏览列表并不是从主浏览服务器那里来的,而是从备份服务器那里来的。主浏览服务器会把定期把浏览列表发送到备份浏览服务器以让浏览列表得到更新。

总之,网上邻居访问方法的过程是:客户机先广播(UDP)查询备份浏览服务器列表,主浏览服务器告之,要注意告知的只是计算机名。客户机用广播(UDP)查询对计算机名的IP地址,对同一个计算机名广播三次然后等待回答,无回答再广播下一个备份浏览服务器的计算机名(如果还有下一个的话)。成功获得IP后,客户机将建立一条到备份浏览服务器139端口的TCP连接,然后获得这个工作组中的其他计算机的名字。当你打开某台计算机时,客户机会广播(UDP)查询这台计算机的IP,如果得不到回答,连接将是错误的;如果得到回答,那么就进入连接的建立阶段了。

上面的这些过程使用的是netbios协议。

三、NETBIOS协议

Netbois(网络基本输入/输出系统)最初由IBM,Sytek作为API开发,使用户软件能使用局域网的资源。自从诞生,Netbois成为许多其他网络应用程序的基础。严格意义上,Netbios是接入网络服务的接口标准。

NBT(netbios over TCP/IP)就是建立在TCP/IP传送协议之上的NETBIOS接口,我们先将它与Nbf进行一番对比。Nbf指的是NETBIOS帧协议,以NetBEUI为基础,这可是真正的架构在链路层之上的协议,不过也因为它是在LLC(逻辑链路控制层)层上,所以无法路由。只有借助一些可路由协议(如IP或IPX)才能实现跨广播域浏览。因为TCP/IP发展最为迅速,最为普及,NBT也才受到大家如此的关注,现在所有的windows系统都使用NBT。NBT提供的服务可以分成三类:名称服务(UDP-137端口)、数据报服务(UDP-138端口)和会话服务(TCP-139端口)。现在所有的windows系统都是默认支持NBT协议,至于NetBEUI就没有什么用了(好像XP系统默认已经不安装了),网上邻居访问不了也同它没有关系,不要再混为一谈。NBT才是网上邻居所用到的协议(系统默认)。

1、名称服务(UDP-137端口)主要用于广播解决本子网的NETBIOS名和IP地址转换的关系。因为NBT是建立在TCP/IP之上,而建立TCP/IP通讯是必须知晓双方IP地址的。但因为使用的是UDP广播,所以名称服务无法跨越路由器。

2、数据报服务(UDP-138端口)提供了无连接(UDP)和面向广播的通信方式。它主要用于从主浏览服务器那里广播查询到备份浏览服务器列表。因为它使用了UDP广播,因而在跨越路由器时也会遇到与名称服务相同的问题。

3、面向连接TCP协议的会话服务(TCP-139端口)用于向备份浏览服务器查询得到一个工作组的计算机列表,也可建立98系统下面网上邻居的数据传送通道。

说完了原理,下面来说下常见的问题以及解决方法:

Windows网上邻居互访的基本条件:

(1) 双方计算机打开,且设置了网络共享资源;

(2) 双方的计算机添加了 "Microsoft 网络文件和打印共享" 服务;

(3) 双方都正确设置了网内IP地址,且必须在同一个网段中;

(4) 双方的计算机中都关闭了防火墙,或者防火墙策略中没有阻止网上邻居访问的策略。

如果您的网上邻居有问题,请参看以下步骤:

1、网线。双机互连不使用HUB或交换机,用交叉线连接两机;如果使用HUB或者交换机,均用直连线连接至HUB或交换机,保证交换机、网卡状态灯正常。

2、IP协议。WIN98及以后的机器在安装时会默认安装TCP/IP协议,WIN95需要另外安装。在网上邻居->属性 (WIN9X/Me)或者网上邻居->属性->本地连接->属性(WIN2K/XP)里可以查看是否安装了TCP/IP协议。

3、IP地址。在TCP/IP属性里设置IP地址、子网掩码和网关,如果有需要可以设置DNS和WINS服务器地址。IP地址推荐设置:192168XX,子网掩码:2552552550。如果你的局域网中有DHCP服务器,选择自动获取地址即可。

验证方法:在DOS提示符下使用ping xxxx(对方IP地址),如返回如下信息,说明IP设置成功:


网上邻居共享怎么设置相关 文章 :

★ 如何设置局域网共享

★ 局域网共享在哪里设置

★ 在局域网内怎么进行资源共享

★ WIN7系统下局域网怎么设置网络共享资源

★ D-LINK路由器局域网文件怎么共享

★ 教你如何解决电脑共享问题

★ win7如何访问xp共享

★ 如何用局域网传文件

★ 如何在局域网内进行资源共享

  ZAB是Zookeeper使用的分布式一致性协议,英文全称是:Zookeeper Atomic Broadcast,因此ZAB也称之为Zookeeper原子广播协议。在解决分布式一致性方面,Zookeeper并没有使用Paxos,而是采用了ZAB协议。基于ZAB协议,Zookeeper实现一种主备模式的系统架构来保持集群中主备副本之间数据的一致性。ZAB协议包括两种基本模式:消息广播(Message Broadcasting)和崩溃恢复(Leader Activation)。下面来详细介绍这两种基本模式的实现过程。

  消息广播是Zookeeper用来保证写入事务一致性的方法,在Zookeeper集群中,存在以下三种角色的节点:
Leader: Zookeeper集群的核心角色,在集群启动或崩溃恢复中通过Follower参与选举产生,为客户端提供读写服务,并对事务请求进行处理。
Follower: Zookeeper集群的核心角色,在集群启动或崩溃恢复中参加选举,没有被选上就是这个角色,为客户端提供读取服务,也就是处理非事务请求,Follower不能处理事务请求,对于收到的事务请求会转发给Leader。
Observer: 观察者角色,不参加选举,为客户端提供读取服务,处理非事务请求,对于收到的事务请求会转发给Leader。使用Observer的目的是为了扩展系统,提高读取性能。
  下面通过几张图对ZAB的消息广播过程进行简单的介绍。

  Zookeeper的消息广播过程类似 2PC(Two Phase Commit),ZAB仅需要超过一半以上的Follower返回 Ack 信息就可以执行提交,大大减小了同步阻塞,提高了可用性。

  在Zookeeper集群启动、运行过程中,如果Leader出现崩溃、网络断开、服务停止或重启等异常情况,或集群中有新服务器加入时,ZAB会让当前集群快速进入崩溃恢复模式并选举出新的Leader节点,在此期间整个集群不对外提供任何读取服务。当产生了新的Leader后并集群中过半Follower完成了与Leader的状态同步,那么ZAB协议就会让Zookeeper集群从崩溃恢复模式转换成消息广播模式。崩溃恢复的目的就是保证当前Zookeeper集群快速选举出一个新的Leader并完成与其他Follower的状态同步,以便尽快进入消息广播模式对外提供服务。
  Zookeeper崩溃恢复的主要任务就是选举Leader(Leader Election),Leader选举分两个场景:一个是Zookeeper服务器启动时Leader选举,另一个是Zookeeper集群运行过程中Leader崩溃后的Leader选举。在详细介绍Leader选举过程之前,需要先介绍几个参数:

另外在选举的过程中,每个节点的当前状态会在以下几种状态之中进行转变。

  假设现在存在一个由5个Zookeeper服务器组成的集群Sever1,Sever2,Sever3,Sever4和Sever5,集群的myid分别为:1, 2,3,4,5。依次按照myid递增的顺序进行启动。由于刚启动时zxid和epoch都为0,因此Leader选举的关键因素成了myid。

  在Zookeeper集群刚启动的时候,zxid和epoch并不参与群首选举。但是如果Zookeeper集群在运行了一段时间之后崩溃了,那么epoch和zxid在Leader选举中的重要性将大于myid。重要性的排序为:epoch zxid myid。当某一个Follower与Leader失去通信的时候,就会进入Leader选举,此时Follower会跟集群中的其他节点进行通信,但此时会存在两种情况:

  这种崩溃后的Leader选举机制也很好理解,如果Leader挂了,优先选择集群中最后做过(epoch)Leader的节点为新的Leader节点,其次选取有最新事务提交的节点(zxid)为Leader,最后才按默认的最大机器编号(myid)进行投票。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13437478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-06
下一篇 2023-08-06

发表评论

登录后才能评论

评论列表(0条)

保存