深入了解Kafka【三】数据可靠性分析

1、多副本数据同步策略
为了保障Prosucer发送的消息能可靠的发送到指定的Topic,Topic的每个Partition收到消息后,要向Producer发送ACK,如果Produser收到ACK,就会进行下一轮发送,否则重试。

1.1、多副本概述
为了提高消息的可靠性,Kafka每个Topic的partition都有N个副本(replica)。这N个副本中,其中一个replica是Leader,其他都是Follower。
Leader负责处理Partition的所有请求,Follower负责同步Leader的数据。
下图展示了Kafka集群中的4个Broker,Topic有3个Partition。

1.2、同步副本队列ISR
Partition什么时候才会发送ACK呢?
要确保全部的Follower与Leader同步完成之后,Leader才能发送ACK,这样才能保证Leader挂掉之后,在所有Follower中能选出新的Leader。
但是万一有一个Follower因为故障,迟迟不能和Leader同步,Leader就得等着它完成同步之后才能发送ACK,怎么决解呢?
这就引出了ISR(in-sync replica set)。
ISR在Leader中维护,也叫同步副本队列,就是leader 与leader保持同步的followers的集合。
当ISR中的Follower完成数据的同步之后,Leader就会给Producer发送ACK,如果Follower未在规定的时间同步数据,则将其踢出ISR。当Leader挂掉的时候,在ISR中选举出一个新的Leader。
1.3、Follower与Leader之间数据复制原理
在学习复制原理之前,先看两个概念:HW(HighWatermark)和LEO(LogEndOffset):
- LEO指的是每个副本最后一个offset。
- HW指的是所有副本中最小的LEO,Consumer能看到的partition的最后位置,即HW之前的数据才对Consumer可见。
如图:

Leader与Follower中,都会维护各自的HW,对于新消息的写入,Consumer并不能立即被消费,需要等待ISR中的Followers从Leader中复制完成。
下图说明了新消息写入Partition后的数据复制过程:

由图可知,Kafka的复制既不是同步也不是异步,其在可靠性和吞吐量上有很好的平衡。
3、ACK应答机制与Exaclty Once语义
当Producer向Leader发送数据的时候,可以通过Kafka提供的三种ACK应答机制,对数据的可靠性与延迟的要求做平衡。
通过配置request.required.acks实现。
3.1、0
Producer不等待Broker的ACK,这能保证最低的延迟,但是当Broker故障时,数据可能丢失,即可靠性最低。
体现了At Most Once语义,最多一次,数据只会发送一次,不保证数据会丢失。
3.2、1
Producer等待Broker中partition的Leader落盘成功后返回ACK。如果在Follower同步结束之前Leader故障,数据会丢失。
3.3、-1
Producer等待Partition的Leader和Follower全部落盘成功后返回ACK。如果在数据同步完成后,发送ACK之前Leader故障,Producer会重新发送消息,造成数据重复。
这体现了At Least Once语义,至少一次,可以保证数据不会丢失,但是不保证数据重复。
3.4、Exactly Once恰好一次
At Least Once 幂等性 = Exactly Once。
Kafka中幂等性是通过Broker初始化时分配的PID来保证。发往同一Partition的消息会附带Sequence Number(SN),而Broker会对(PID,Partition,SN)做缓存,当相同主键的消息提交时,Broker只会持久化一条。
但是PID重启后就会变化,不同的Partition也具有不同的主键,所以幂等性无法保证跨分区会话的Exactly Once。
4、副本故障处理
4.1、Follower故障
Follower故障后会被临时踢出ISR,当Follower恢复后,Follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向Leader同步。等该Follower的LEO大于等于该partition的HW,即Follower追上Leader之后,就会被重新加入ISR。
4.2、Leader故障
Leader发生故障,会从ISR中选举出一个新的Leader,其余的Follower会先将各自的log文件高于各自HW的部分截取掉,之后从新的Leader同步数据。
5、Leader选举
kafka会在Zookeeper中为每个partition动态的维护着ISR,当Leader挂掉后,会从ISR中顺序选择一个Follower作为主。
如果碰巧ISR中Follower全部挂掉,那么有两种选择:
- 等待ISR中任意Follower恢复,选定其为Leader。
- 选择第一个恢复的Follower作为Leader,这个Follower不一定在ISR中。
怎么选择就要在可用性与一致性之间做权衡了。

深入了解Kafka【三】数据可靠性分析的更多相关文章
- kafka生产者数据可靠性保证
为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 producer 发送 ack(ackn ...
- kafka如何保证数据可靠性和数据一致性
数据可靠性 Kafka 作为一个商业级消息中间件,消息可靠性的重要性可想而知.本文从 Producter 往 Broker 发送消息.Topic 分区副本以及 Leader 选举几个角度介绍数据的可靠 ...
- Kafka数据可靠性深度解读
原文链接:http://www.infoq.com/cn/articles/depth-interpretation-of-kafka-data-reliability Kafka起初是由Linked ...
- 【Kafka】Kafka数据可靠性深度解读
转帖:http://www.infoq.com/cn/articles/depth-interpretation-of-kafka-data-reliability Kafka起初是由LinkedIn ...
- kafka数据可靠性深度解读【转】
1 概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...
- Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据
不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...
- Kafka数据可靠性与一致性解析
Partition Recovery机制 每个Partition会在磁盘记录一个RecoveryPoint, 记录已经flush到磁盘的最大offset.broker fail 重启时,会进行load ...
- RabbitMQ消息可靠性分析 - 简书
原文:RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就 ...
- ActiveMQ、RabbitMQ、RocketMQ、Kafka四种消息中间件分析介绍
ActiveMQ.RabbitMQ.RocketMQ.Kafka四种消息中间件分析介绍 我们从四种消息中间件的介绍到基本使用,以及高可用,消息重复性,消息丢失,消息顺序性能方面进行分析介绍! 一.消息 ...
随机推荐
- Chrome简洁高效管理下载项
每次要查看下载记录时,Chrome新建下载标签页的速度能让我抓狂 之前用的 Chrono 界面太过传统,而且还不能点击打开.所以一直在寻找好用的下载管理插件,经过多次在拓展商城搜索比对,找到了这款拓展 ...
- MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由
目前可用于文件存储的网络服务选择有很多,比如阿里云OSS.七牛云.腾讯云等等,但是收费都有点小贵.为了帮公司节约成本,之前一直是使用fastDFS作为文件服务器,准确的说是图片服务器.直到我发现了Mi ...
- TCP学习指北
限于博主水平有限不敢说指南,但应该能够避免刚学TCP的同学出现找不着北的情况. TCP与UDP的区别 区别: UDP是无连接的,而TCP是面向连接的,传数据前要先建立连接. UDP可以一对多,多对多通 ...
- 恕我直言,你可能真没用过这些 IDEA 插件!
一.前言 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具. 不是我说的喔,百度百科说的... IDEA 如此好用,插 ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- 看DLI服务4核心如何提升云服务自动化运维
摘要:今天我们来说说DLI是如何实现监控告警来提升整体运维能力,从而为客户更好的提供Serverless的DLI. DLI是支持多模引擎的Serverless大数据计算服务,免运维也是其作为Serve ...
- 在java中,怎样创建编写javascript的环境?
刚开始还没有学到这一块的时候,预习的时候也是在网上搜索这一类的信息时候, 可是都是八竿子碰不到边的!在此也是呕心沥血的为读者献上最好的: 1.首先:点击空白处>右键>project: 2. ...
- CSS动画实例:旋转的圆角正方形
在页面中放置一个类名为container的层作为效果呈现容器,在该层中再定义十个名为shape的层层嵌套的子层,HTML代码描述如下: <div class="container&qu ...
- 一些Java中不为人知的特殊方法,学完后面试官可能都没你知道的多!
如果你用过反射并且执行过getDeclaredMethods方法的话,你可能会感到很吃惊.你会发现出现了很多源代码里没有的方法.如果你看一下这些方法的修饰符的话,可能会发现里面有些方法是volatil ...
- 【接口自动化】Python+Requests接口自动化测试框架搭建【三】
经过上两篇文章的讲解,我们已经完成接口自动化的基础框架,现在开始根据实际项目丰满起来. 在PyCharm中新建项目,项目工程结构如下: config:配置文件夹,可以将一些全局变量放于配置文件中,方便 ...