我写了另一篇zookeeper选举机制的,可以参考:zookeeper 负载均衡 核心机制 包含ZAB协议(滴滴,阿里面试)

一、zookeeper 与kafka保持数据一致性的不同点:

(1)zookeeper使用了ZAB(Zookeeper Atomic Broadcast)协议,保证了leader,follower的一致性,leader 负责数据的读写,而follower只负责数据的读,如果follower遇到写操作,会提交到leader;

当leader宕机的话,使用 Fast Leader Election 快速选举出新的leader,节点在一开始都处于选举阶段,只要有一个节点得到超半数节点的票数,它就可以当选准 leader。

 其客户端根据链接的follower不同,可能读取到不同的数据。这是由于副本没有完全同步,存在时间差的原因。由于follower分担了读取数据的压力,zookeeper只要保留全局leader即可,不再进行细分。

如下所示:leader==》读写,follower==>只负责读;

Zookeeper工作方式

》Zookeeper集群包含一个1个Leader,多个Follower

》所有的Follower都可提供读服务

》所有的写操作都会被forward到Leader

》Client与Server通过NIO通信

》全局串行化所有的写操作

》保证同一客户端的指令被FIFO执行

》保证消息通知的FIFO

 (2)kafka 不同,只有leader 负责读写,follower只负责备份,如果leader宕机的话,Kafaka动态维护了一个同步状态的副本的集合(a set of in-sync replicas),简称ISR,ISR中有f+1个节点,就可以允许在f个节点down掉的情况下不会丢失消息并正常提供服。ISR的成员是动态的,如果一个节点被淘汰了,当它重新达到“同步中”的状态时,他可以重新加入ISR。因此如果leader宕了,直接从ISR中选择一个follower就行。

kafka在引入Replication之后,同一个Partition可能会有多个Replica,而这时需要在这些Replication之间选出一个Leader,Producer和Consumer只与这个Leader交互,其它Replica作为Follower从Leader中复制数据。因为需要保证同一个Partition的多个Replica之间的数据一致性(其中一个宕机后其它Replica必须要能继续服务并且即不能造成数据重复也不能造成数据丢失)。如果没有一个Leader,所有Replica都可同时读/写数据,那就需要保证多个Replica之间互相(N×N条通路)同步数据,数据的一致性和有序性非常难保证,大大增加了Replication实现的复杂性,同时也增加了出现异常的几率。而引入Leader后,只有Leader负责数据读写,Follower只向Leader顺序Fetch数据(N条通路),系统更加简单且高效。

Kafka:由于kafka的使用场景决定,其读取数据时更关注数据的一致性
从leader读取和写入可以保证所有客户端都得到相同的数据,否则可能存在一些在ISR中注册的节点(replication-factor大于min.insync.replicas),因未来得及更新副本而无法提供的数据。相应的为了规避都从leader上读取带来的资源竞争,可以根据不同topic和不同partition设置不同的leader。

如下所示:leader==>负责读写,follower 负责同步,只负责备份

Zab协议-广播模式

客户端每发送一个更新请求,ZooKeeper都会生成一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序,这个唯一编号就是事务ID(ZXID),只有更新请求才算是事务请求。
为保证按照事务的ZXID先后顺序来处理,Leader服务器会分别为每个Follower服务器创建一个队列,并将事务的先后顺序放入队列中,并按照FIFO的策略进行消息发送。收到需要处理的事务后,Follower服务器会首先以事务日志的形式写入服务器的磁盘中,写入成功后会向Leader服务器发送ACK响应。当Leader服务器收到超过一半的Follower服务器的ACK响应后,会向所有Follower服务器广播Commit消息,收到Commit消息的Follower服务器也会完成对事务的提交。
如果接收到事务请求的是Follower服务器,它会将请求转发给Leader服务器处理。

二、相同点:

在数据写入过程中,leader与follower都具有相同的先后关系,即数据先写入leader,而后按照一定的规则完成在follower上的最少副本数写入,即可返回调用客户端,该数据写入成功过。
kafka的最少副本数量有min.insync.replicas控制;zookeeper的最少副本数是半数以上节点。
此处的设置都是优先保证可用性,而牺牲一定的数据一致性。

三、具体的Kafka的leader选举机制如下:

Kafka的Leader是什么

  首先Kafka会将接收到的消息分区(partition),每个主题(topic)的消息有不同的分区。这样一方面消息的存储就不会受到单一服务器存储空间大小的限制,另一方面消息的处理也可以在多个服务器上并行。
  其次为了保证高可用,每个分区都会有一定数量的副本(replica)。这样如果有部分服务器不可用,副本所在的服务器就会接替上来,保证应用的持续性。

  但是,为了保证较高的处理效率,消息的读写都是在固定的一个副本上完成。这个副本就是所谓的Leader,而其他副本则是Follower。而Follower则会定期地到Leader上同步数据。


Leader选举

  如果某个分区所在的服务器除了问题,不可用,kafka会从该分区的其他的副本中选择一个作为新的Leader。之后所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Leader。显然,只有那些跟Leader保持同步的Follower才应该被选作新的Leader。
  Kafka会在Zookeeper上针对每个Topic维护一个称为ISR(in-sync replica,已同步的副本)的集合,该集合中是一些分区的副本。只有当这些副本都跟Leader中的副本同步了之后,kafka才会认为消息已提交,并反馈给消息的生产者。如果这个集合有增减,kafka会更新zookeeper上的记录。
  如果某个分区的Leader不可用,Kafka就会从ISR集合中选择一个副本作为新的Leader。
  显然通过ISR,kafka需要的冗余度较低,可以容忍的失败数比较高。假设某个topic有f+1个副本,kafka可以容忍f个服务器不可用。

为什么不用少数服从多数的方法

  少数服从多数是一种比较常见的一致性算法和Leader选举法。它的含义是只有超过半数的副本同步了,系统才会认为数据已同步;选择Leader时也是从超过半数的同步的副本中选择。这种算法需要较高的冗余度。譬如只允许一台机器失败,需要有三个副本;而如果只容忍两台机器失败,则需要五个副本。而kafka的ISR集合方法,分别只需要两个和三个副本。

如果所有的ISR副本都失败了怎么办

  此时有两种方法可选,一种是等待ISR集合中的副本复活,一种是选择任何一个立即可用的副本,而这个副本不一定是在ISR集合中。这两种方法各有利弊,实际生产中按需选择。
  如果要等待ISR副本复活,虽然可以保证一致性,但可能需要很长时间。而如果选择立即可用的副本,则很可能该副本并不一致。

参考:kafka 基础知识梳理

参考:kafka 学习 非常详细的经典教程

参考:Kafka的Leader的选举机制

参考:Kafka与Zookeeper

参考:zookeeper与kafka的选举算法

 

kafka 数据一致性-leader,follower机制与zookeeper的区别;的更多相关文章

  1. Kafka中bootstrap-server、broker-list和zookeeper的区别

    参考 Kafka bootstrap-servers vs zookeeper in kafka-console-consumer  中说建议使用新版(新版本指的是kafka 0.8.0之后的版本)的 ...

  2. zookeeper和kafka的leader和follower

    来源于:https://www.cnblogs.com/aspirant/p/9179045.html 一.zookeeper 与kafka保持数据一致性的不同点: (1)zookeeper使用了ZA ...

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

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

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

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

  5. zookeeper leader选举机制

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

  6. kafka消息的处理机制(五)

    这一篇我们不在是探讨kafka的使用,前面几篇基本讲解了工作中的使用方式,基本api的使用还需要更深入的去钻研,多使用才会有提高.今天主要是探讨一下kafka的消息复制以及消息处理机制. 1. bro ...

  7. Kafka学习笔记(4)----Kafka的Leader Election

    1. Zookeeper的基本操作 zookeeper中的节点可以持久化/有序的两个维度分为四种类型: PERSIST:持久化无序(保存在磁盘中) PERSIST_SEQUENTIAL:持久化有序递增 ...

  8. kafka分区选主机制

    Kafka Partition Leader选主机制 https://blog.csdn.net/qq_27384769/article/details/80115392 kafka leader选举 ...

  9. K8S 搭建 Kafka:2.13-2.6.0 和 Zookeeper:3.6.2 集群

    搭建 Kafka:2.13-2.6.0 和 Zookeeper:3.6.2 集群 一.服务版本信息: Kafka:v2.13-2.6.0 Zookeeper:v3.6.2 Kubernetes:v1. ...

随机推荐

  1. 搞死人的contextRoot;weblogic9.2

    默认情况下: 两个app-deployment同时部署到了一台weblogic服务器的同一个domain下面的时候 /mysite/www/www/WEB-INF/weblogic.xml /mysi ...

  2. 使用级联分类器实现人脸检测(OpenCV自带的数据)

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  3. ubuntu16.04下的htk安装编译

    HTK(HMM Tools Kit)是一个剑桥大学开发的专门用于建立和处理HMM的实验工具包[1],主要应用于语音识别领域,也可以应用于语音合成.字符识别和DNA排序等领域.HTK经过剑桥大学.Ent ...

  4. Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案

    是这样的哈: 有这样一个需求: 1.显示一个界面,界面上有一个列表(ListView),列表上面有一个可以滚动的海报. 2.要求在ListView滚动的过程中,ListView上面的海报也可以跟着Li ...

  5. (转)CloudStack 安装及使用过程中常见问题汇总

    CloudStack 安装及使用过程中常见问题汇总             在做工程项目中对CloudStack 安装及使用过程中常见的几个问题及如何解决做一个总结.   1.Windows XP虚拟 ...

  6. mysql的常用优化知识

    索引类型:主键索引,唯一索引,联合索引,普通索引,全文索引 建立索引: create index index_name on table(field_name); 删除索引: drop index i ...

  7. 3.RapidIO串行物理层的包传输过程

    转自https://www.cnblogs.com/liujinggang/p/10005431.html 一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议 ...

  8. python中魔法方法__init__,__str__,__del__的详细使用方法

    1. python中的魔法方法, 类似__init__, __str__等等,这些内置好的特定的方法进行特定的操作时会自动被调用 2. __init__的使用方法 class 类名(object):  ...

  9. aiohttp简介及快速使用

    前言 本文翻译自aiohttp官方文档,如有纰漏,欢迎指出. aiohttp是一个为Python提供异步HTTP 客户端/服务端编程,基于asyncio(Python用于支持异步编程的标准库)的异步库 ...

  10. 小白之selenium+python关于cookies绕开登录2

    首先,由于新开始在博客园中写随笔,可能在内容的布局方面就不太懂,导致布局很丑,各位见谅,但是字还是原来的那字,内容还是原来的内容,少了点包装, 下面是对cookie的扩展知识 1.配置文件存储在哪里? ...