一、Zookeeper是什么?

  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
二、Zookeeper能干什么?
  ZooKeeper是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
             

从其服务架构图来看:ZooKeeper分为服务器端(Server)和客户端(Client),客户端可以连接到整个ZooKeeper服务的任意服务器上(Leader除外)。

ZooKeeper 启动时,将从实例中选举一个Leader,Leader 负责处理数据更新等操作。

三、Zookeeper中的四种角色

  1、Leader:领导者,负责进行投票的发起和决议,更新系统状态。

  2、Learner:学习者

  3、Follower(Learner的子类):跟随者,用于接受客户端请求并向客户端返回结结果,在选主过程中参与投票,Follower可以接收Client请求,如果是写请求将转发给Leader来更新系统状态。

  4、Observer:观察者,可以接收客户端连接,将写请求转发给Leader节点,但是不参与投票过程,只是同步Leader状态,因为Follower增多会导致投票阶段延迟增大,影响性能。Observer的目的是为了扩展系统,提高读取数据。

四、在这四种角色中,Leader是怎么被选举出来的呢?  

  在说明选举机制之前先介绍一些问题:

  1、Zookeeper中的Server数目一般为奇数?

  我们知道在Zookeeper中 Leader 选举算法采用了Quorom算法。该算法的核心思想是当多数Server写成功,则任务数据写成功。假设有3个Server,则最多允许一个Server挂掉;如果有4个Server,则同样最多允许一个Server挂掉。既然3个或者4个Server,同样最多允许1个Server挂掉,那么它们的可靠性是一样的,所以选择奇数个ZooKeeper Server即可,这里选择3个Server。

  2、什么是Quorom算法?

  在分布式系统中,冗余数据是保证可靠性的手段,因此冗余数据的一致性维护就非常重要。一般而言,一个写操作必须要对所有的冗余数据都更新完成了,才能称为成功结束。比如一份数据在5台设备上有冗余,因为不知道读数据会落在哪一台设备上,那么一次写操作,必须5台设备都更新完成,写操作才能返回。

  对于写操作比较频繁的系统,这个操作的瓶颈非常大。Quorum算法可以让写操作只要写完3台就返回。剩下的由系统内部缓慢同步完成。而读操作,则需要也至少读3台,才能保证至少可以读到一个最新的数据。

  3、Zookeeper节点的一些状态

  (1)LEADING:说明此节点已经是leader节点,处于领导者地位的状态,差不多就是一般集群中的master。但在zookeeper中,只有leader才有写权限,其他节点(FOLLOWING)是没有写权限的,可以读。

  (2)LOOKING:选举中,正在寻找leader,即将进入leader选举流程中

  (3)FOLLOWING:跟随者状态,表示当前集群中的leader已经选举出来了,本台服务器处于跟随状态。

  (4)OBSERVING:OBSERVING和FOLLOWING差不多,但不参加投票和选举,接受leader选举后的结果

下面来正式介绍一下选举机制(以5台服务器为例):

1、每个Server都有一个唯一标识自己的myid。选举过程中每个Server都有一票(挂掉的除外)在这里我们从左到右分别将五台服务器的myid赋值为1,2,3,4,5

2、Zxid类似于RDBMS中的事务ID,用于标识一次更新操作的Proposal ID。每次请求对应一个唯一的zxid,如果zxid a < zxid b ,则可以保证a一定发生在b之前。

3、选举分为两种情况:初始化的时候(还没有leader),leader服务器挂掉的时候(重新选举新的leader)

4、初始化的情况:

  (1)首先第一台服务器启动,投自己一票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。

  (2)服务器2启动,发现当前没有leader,投票给自己,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。

  (3)服务器3启动,发现没有Leader,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。

  (4)服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。

  (5)服务器5和服务器4逻辑相同。

5、如果Server3当选了Leader,他突然宕机了,那么就需要重新选Leader了。

  (1)Leader宕机之后,剩下的机器会自动进入选举状态,重新选举。

(2)选举的依据是:优先考虑数据的的版本号zxid,再考虑id。(因为zxid越大,代表该服务器的数据越新,越全)

  (3)由于是运行期间,因此每个服务器上的ZXID可能不同我们假设Server1的ZXID为123,而Server2的ZXID为122,Server4的ZXID为143,Sever5的ZXID为120

  (4)在第一轮投票中,Server1、Server2、Sever4、Server5都会投给自己,即分别产生投票(1,123),(2,122),(4,143),(5,120)

  (5)然后各自将这个投票发给集群中所有机器。

  (6)对于投票的处理,在这个情境下Server4的ZXID为143,是最大的,显然Server4会成为Leader,其他服务器成为跟随者。

参考文章:

1. https://www.toutiao.com/i6701570306445672963/?tt_from=copy_link&utm_campaign=client_share&timestamp=1563546713&app=news_article_lite&utm_source=copy_link&utm_medium=toutiao_ios&req_id=201907192231531720170000013322D80&group_id=6701570306445672963

2.https://blog.csdn.net/ypp91zr/article/details/89409707

Zookeeper中的Leader选取机制的更多相关文章

  1. Zookeeper中的watcher监听和leader选举机制

    watcher监听 什么是watcher接口 同一个事件类型在不同的通知状态中代表的含义有所不同,下图列举了常见的通知状态和事件类型. Watcher通知状态与事件类型一览 上图列举了ZooKeepe ...

  2. 面试官:说一说Zookeeper中Leader选举机制

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 今天又是一个阳光明媚的一天,我又 ...

  3. zookeeper leader选举机制

    最近看了下zookeeper的源码,先整理下leader选举机制 先看几个关键数据结构和函数 服务可能处于的状态,从名字应该很好理解 public enum ServerState { LOOKING ...

  4. kafka 数据一致性-leader,follower机制与zookeeper的区别;

    我写了另一篇zookeeper选举机制的,可以参考:zookeeper 负载均衡 核心机制 包含ZAB协议(滴滴,阿里面试) 一.zookeeper 与kafka保持数据一致性的不同点: (1)zoo ...

  5. 【Java面试】Zookeeper中的Watch机制的原理?

    一个工作了7年的粉丝,遇到了一个Zookeeper的问题. 因为接触过Zookeeper这个技术,不知道该怎么回答. 我说一个工作了7年的程序员,没有接触过主流技术,这不正常. 于是我问了他工资以后, ...

  6. Zookeeper中Session Timeout的那些事

    前言: RDS系统致力于MySQL数据的高可用,高可靠,高性能以及在线扩展功能,实现这些特性的主要逻辑功能都运行在管理服务器上,一旦管理服务器宕机,数据库的在线扩展功能/备份功能/故障恢复功能等都无从 ...

  7. zookeeper中Watcher和Notifications

    问题导读:1.zookeeper观察者什么时候调用?2.传统远程轮询服务存在什么问题?3.zk中回调服务的机制是什么?4.zk中watcher为什么不永久注册?5.什么是znode? 在阅读之前首先明 ...

  8. kafka笔记-Kafka在zookeeper中的存储结构【转】

    参考链接:apache kafka系列之在zookeeper中存储结构  http://blog.csdn.net/lizhitao/article/details/23744675 1.topic注 ...

  9. kafka在zookeeper中的存储结构

    参考site:http://kafka.apache.org/documentation.html#impl_zookeeper 1.zookeeper客户端相关命令 在确保zookeeper服务启动 ...

随机推荐

  1. Win10系统设置开机自启动

    有时候,我们想设置某些软件开机时自动启动,操作步骤如下: 1. win+R 同时按住键盘上的win和R键打开运行窗口 2. shell:startup 输入shell:startup后回车 3. 添加 ...

  2. 从头造轮子:python3 asyncio之 sleep (4)

    前言 书接上文:,本文造第四个轮子,也是asyncio包里面非常常用,并且非常复杂的一个函数sleep 一.知识准备 ● time.sleep直接让当前线程睡觉,但是这种方式显然是不能接受的,如果当前 ...

  3. git合并分支代码的方法

    1.先提交本地代码,防止被拉取其他分支的代码污染(self为自己的分支 other为想要拉取的分支) git add . git commit -m '备注信息' git push origin se ...

  4. linux访问控制列表 ACL实现文件权限设置

    ACL:Access Control List,实现灵活的文件权限管理 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限 CentOS7 默认创建的xfs和ext4文件系统具有ACL功能 A ...

  5. tep完整教程帮你突破pytest

    持续维护的教程 tep教程会随着版本更新或经验积累,持续维护在电子书中,最新的最全的内容请锁定这篇文章[最新]tep完整教程帮你突破pytest: https://dongfanger.gitee.i ...

  6. php 修改后端代码参考

    后端代码参考:

  7. Solon 1.6.33 发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  8. Java基础——引用类型作为形参与返回值

    一.具体类名作为形参与返回值 1.方法的形参是类名,其实需要的是该类的对象 比如有一个具体的猫类,我使用另一个类使用猫类的方法 public class CatOperator {   public ...

  9. Linux系统常用指令

    建立一个文件或文件夹的软链接: ln -s 原名 软链接名 软链接就类似Windows下的"快捷方式",访问它其实访问的是它指向的内容. git仓库操作 1.通常远程操作的第一步, ...

  10. 各种环境下反弹shell

    0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 -u 则 ...