kafka数据 落盘_Kafka数据可靠性保证三板斧-ACK/ISR/HW

点击上方蓝色字体,选择“设为星标”

回复”资源“获取更多资源

点击右侧关注,大数据开发领域最强公众号!

点击右侧关注,暴走大数据!

为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。

1.副本数据同步策略

Kafka选择了第二种方案(全部完成同步,才发送ack),原因如下:

同样为了容忍n台节点的故障,第一种方案需要2n+1个副本,而第二种方案只需要n+1个副本,而Kafka的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。

虽然第二种方案的网络延迟会比较高,但网络延迟对Kafka的影响较小。

2.ISR,AR

采用第二种方案之后,设想以下情景:leader收到数据,所有follower都开始同步数据,但有一个follower,因为某种故障,迟迟不能与leader进行同步,那leader就要一直等下去,直到它完成同步,才能发送ack。这个问题怎么解决呢?

Leader维护了一个动态的in-sync replica set (ISR-同步副本列表),意为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给follower发送ack。如果follower长时间未向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.lag.time.max.ms参数设定。Leader发生故障之后,就会从ISR中选举新的leader。

ISR(In-Sync Replicas ):与leader保持同步的follower集合

AR(Assigned Replicas):分区的所有副本

ISR是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度, 当前最新的版本0.10.x中只支持replica.lag.time.max.ms这个维度),任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。

3.ack应答机制

对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,所以没必要等ISR中的follower全部接收成功。

所以Kafka为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡,选择以下的配置。

acks参数配置:

0:producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据;

1:producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,而由于已经返回了ack,系统默认新选举的leader已经有了数据,从而不会进行失败重试,那么将会丢失数据

-1(all):producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack。但是如果在follower同步完成后,broker发送ack之前,leader发生故障,导致没有返回ack给Producer,由于失败重试机制,又会给新选举出来的leader发送数据,造成数据重复。

4. HW,LEO,LSO,LW名词解释

上图表示一个日志文件,这个日志文件中只有9条消息,第一条消息的offset(LogStartOffset)为0,最后一条消息的offset为8,offset为9的消息使用虚线表示的,代表下一条待写入的消息。日志文件的 HW 为6,表示消费者只能拉取offset在 0 到 5 之间的消息,offset为6的消息对消费者而言是不可见的。

LEO(log end offset):标识当前日志文件中已写入消息的最后一条的下一条待写入的消息的offset。上图中offset为9的位置即为当前日志文件的 LEO,LEO 的大小相当于当前日志分区中最后一条消息的offset值加1.分区 ISR 集合中的每个副本都会维护自身的 LEO ,而 ISR 集合中最小的 LEO 即为分区的 HW,对消费者而言只能消费 HW 之前的消息。

HW(High Watermark):所有副本中最小的LEO, 一个分区中所有副本最小的offset,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置上一条信息。

注意:HW/LEO这两个都是指已写入消息的最后一条的下一条的位置而不是指最后一条的位置。

LSO(Last Stable Offset): 对未完成的事务而言,LSO 的值等于事务中第一条消息的位置(firstUnstableOffset),对已完成的事务而言,它的值同 HW 相同

LW(Low Watermark): 低水位, 代表 AR(分区中的所有副本)集合中最小的 logStartOffset 值

注意: LogStartOffset不可以缩写为LSO,因为在Kafka中,LSO特指LogStableOffset

5.故障处理细节

1.follower故障

follower发生故障后会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。等该follower的LEO大于等于该Partition的HW,即follower追上leader之后,就可以重新加入ISR了。

2.leader故障

leader发生故障之后,会从ISR中选出一个新的leader,之后,为保证多个副本之间的数据一致性,其余的follower会先将各自的log文件高于HW的部分截掉,然后从新的leader同步数据。

注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

6.ISR 集合和 HW、LEO的关系

下面具体分析一下 ISR 集合和 HW、LEO的关系。

假设某分区的 ISR 集合中有 3 个副本,即一个 leader 副本和 2 个 follower 副本,此时分区的 LEO 和 HW 都分别为 3 。消息3和消息4从生产者出发之后先被存入leader副本。

在消息被写入leader副本之后,follower副本会发送拉取请求来拉取消息3和消息4进行消息同步。

在同步过程中不同的副本同步的效率不尽相同,在某一时刻follower1完全跟上了leader副本而follower2只同步了消息3,如此leader副本的LEO为5,follower1的LEO为5,follower2的LEO 为4,那么当前分区的HW取最小值4,此时消费者可以消费到offset0至3之间的消息。

当所有副本都成功写入消息3和消息4之后,整个分区的HW和LEO都变为5,因此消费者可以消费到offset为4的消息了

由此可见kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。事实上,同步复制要求所有能工作的follower副本都复制完,这条消息才会被确认已成功提交,这种复制方式极大的影响了性能。而在异步复制的方式下,follower副本异步的从leader副本中复制数据,数据只要被leader副本写入就会被认为已经成功提交。在这种情况下,如果follower副本都还没有复制完而落后于leader副本,然后leader副本宕机,则会造成数据丢失。kafka使用这种ISR的方式有效的权衡了数据可靠性和性能之间的关系。

欢迎点赞+收藏+转发朋友圈素质三连

文章不错?点个【在看】吧!👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼

转眼又已过去了一年,在这一年里,Firefox 和 Chrome 在拼升级,版本号不断飙升;IE10 随着 Windows 8 在去年10月底正式发布,在 JavaScript 性能和对 HTML5 和 CSS3 的支持方面让人眼前一亮。这篇文章给大家带来《五大主流…

一句话引发的思考 - synchronized/super

https://blog.csdn.net/cool__wang/article/details/52459380#commentBox 转载于:https://www.cnblogs.com/rainydayfmb/p/9883864.html

计算机科学方向的会议或期刊,计算机顶会和顶刊_计算机顶会_顶会

《计算机应用研究》正刊和增刊什么区别,是不是增刊不是正规的核心期刊,求...展开全部《计算机应用研究》是核心期刊,其增刊一年只出版一或两期,和月刊一样具有相同复的正式出版刊号。正刊和增刊的区别如下:1、目的用途…

PAT L3-007 天梯地图

https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线;一条是最短距离的路线…

JavaFX中的塔防(4)

好的,到目前为止,我们已经创建了一个TileMap,将其显示在屏幕上,并使其在第一部分中可编辑。 在第二部分中,我们使用A *算法实现了攻击路径的计算,并使敌人跟随该路径。 在第三部分中,我们创建了…

Two.js – 为现代浏览器而生的 2D 绘图 API

Two.js 是面向现代 Web 浏览器的一个二维绘图 API。Two.js 可以用于多个场合:SVG,Canvas 和 WebGL,旨在使平面形状和动画的创建更方便,更简洁。 Two.js 有一个内置的动画循环,可搭配其他动画库。Two.js 包含可伸缩矢量…

apache arm 交叉编译_MacOS 下交叉编译的折腾笔记

这是这个系列 “折腾笔记” 的第一篇,希望能用更直白的方式去展现交叉编译的时候做了些什么。因此,这个教程并不是最佳实践,但是可以让小伙伴们有一个更直白的理解。之后,我会把笔记的重点放在 bazel 上交叉编译的最佳实践&#x…

python - 使用traceback获取详细的异常信息

try: 1/0except Exception,e: print e 输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个函数哪一行报的错。下面使用traceback模块 import tracebacktry: 1/0except Exception,e: traceback.print_exc() 输…

计算机科学研究生规划,2019计算机考研备考:计算机科学与技术研究方向及复习规划...

考研之路永远都不是轻松着度过的,想要在这条道路上稳稳妥妥的走完,并到达设立在远处的目标,了解目标专业的各项考研备考信息是第一步。新东方在线为大家整理了2019计算机考研备考:计算机科学与技术研究方向及复习规划,…

快速的远程服务测试

测试与远程服务交互的代码通常很困难。 有很多折衷因素会影响您可以编写哪些测试以及要编写的测试数量。 在大多数情况下,您对从服务中获取的数据的控制为零,这使得断言至少很难说。 不久前,我使用VCR库针对远程服务编写了一些Ruby测试。 VC…

树-二叉树、满二叉树和完全二叉树

树-二叉树、满二叉树和完全二叉树 二叉树的定义: (1)当n0时,为空树; (2)当n>0时,是由一个根结点和称为根结点的左、右子树构成,并且两颗子树互不相交。 满二叉树&…

Codrops 优秀教程:基于 CSS3 的全屏网页过渡特效

向大家分享一个来自 Codrops 的基于 CSS3 实现的全屏网页过渡特效。页面初始布局是四个盒子,点击其中一个会扩张到全屏,其它的会淡出隐藏;关闭当前视图的时候又恢复到初始状态。 您可能感兴趣的相关文章-prefix-free:帮你从 CSS 前…

上海职称英语计算机取消,小编简析2017年职称英语考试是否取消

近日出台的《关于深化人才发展体制机制改革的意见》(以下简称《意见》)直接提出了我国将改革职称制度和职业资格制度,对职称外语和计算机应用能力考试不作统一要求;探索高层次人才等职称直聘办法。《意见》出台的是2016年职称英语考试前几天,…

elasticsearch 条件去重_elasticsearch 笔记四 之聚合查询之去重计数、基础统计、百分位、字符串统计...

这一节笔记还是聚合查询,以下是本节目录:去重统计 cardinality基础统计 stats百分位 percentiles字符串统计 string_stats1、去重统计 cardinality去重统计,就是统计某个字段的值,去重后的数量。先导入如下数据:PUT /e…

openstack基础环境

主机环境: centos7.5 ip:192.168.2.11 修改主机名,修改后主机名不得再更改 yum install chrony -y (控制节点和计算节点都要装)编辑 vi /etc/chrony.conf 文件,按照你环境的要求,对下面的键进行添加&#x…

Java内存模型又回来了

Java内存模型已经被遗忘了九年多了,但是大多数开放源代码Java支持者都希望对其进行现代化,并专注于并发,因为Java内存模型中引入的过程仅朝现代化迈出了一步 。 一个JEP(JDK增强建议),编号188 &#xff0c…

Redis缓存设计模式与失效策略

大家好,我是升仔 引言 Redis作为一个灵活的键值数据库,广泛用于实现高性能缓存解决方案。理解其缓存设计模式和失效策略对于开发高效、可靠的应用程序至关重要。 缓存设计模式 缓存 aside(旁路缓存): 基本原理:应用…

【Python 19】BMR计算器3.0(字符串分割与格式化输出)

1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上。 计算公式: BMR(男) (13.7*体重kg&#xff0…

经典案例:2012年最佳25个响应式网站设计作品《下篇》

2012年,响应式网站设计成为主流,这个概念由著名网页设计师 Ethan Marcotte 在2010年5月份提出,其目标是要让设计的网站能够响应用户的行为,根据不同终端设备自动调整尺寸。 响应式设计不再只是一个概念,众多大公司也把…

发布Akka Toolkit 2.3

最近宣布了Akka工具包 2.3.0版本的发布。 Akka是一个非常有用的工具包和运行时,用于在JVM上构建高度并发,分布式和容错的事件驱动应用程序。 它是分布式的,并提供了Actor,Future和STM等高级抽象。 它的新版本在2.2.0发布之后八个…