前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kafka数据可靠性保证三板斧-ACK/ISR/HW

Kafka数据可靠性保证三板斧-ACK/ISR/HW

作者头像
王知无-import_bigdata
发布于 2020-07-21 06:14:20
发布于 2020-07-21 06:14:20
4.3K211
代码可运行
举报
运行总次数:11
代码可运行

为保证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的方式有效的权衡了数据可靠性和性能之间的关系。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术与架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
工程购买连接有新的吗
工程购买连接有新的吗
回复回复点赞举报
工程购买链接怎么失效了
工程购买链接怎么失效了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
1.原理: 通过定时器每隔一段时间触发一次DAC转换,然后通过DMA发送正玄波码表值给DAC. 当需要改变频率HZ时,只需要修改定时器频率即可(最高只能达到20KHz) 当需要改变正玄波的正峰峰值/负峰峰值时,只需要修改正玄波码表即可 2.实现 代码如下所示(采用的是定时器2,DAC引脚是PA4) #define HZ(x) (u16)(72000000/sizeof(Sine12bit)*2/x) //计算Hz #define DAC_DHR12R1 0x40007408 //外设DAC通道1的
诺谦
2018/04/17
2.9K1
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使用到定时采集。定时采样有如下三种方法:
wenzid
2021/03/04
9K0
STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现。关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用,不会发现,复杂使用就很容易踩到了。
Simon223
2018/09/04
1.1K0
【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
【STM32】PWM输出
PWM是“Pulse Width Modulation”的缩写,即脉冲宽度调制,简称脉宽调制。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说,就是对脉冲宽度的控制。
DevFrank
2024/07/24
1720
【STM32】PWM输出
M-Arch(5)第四个示例:ADC&DMA
本文我们将总结下ADC和DMA的基本使用方法,并给出示例,从中我们可以看到GD和STM在设计上的差别。
滚神大人
2021/10/08
5630
开发者成长激励计划-基于TencentOS Tiny和ch32v307的三相多功能表方案
多功能电表是采集配电参数的主要设备,应用广泛。Modbus通讯在工业网络通讯中应用十分广泛,而且方便,受到大家的欢迎。
zes
2022/08/10
1.1K0
开发者成长激励计划-基于TencentOS Tiny和ch32v307的三相多功能表方案
(29)STM32——PWM DAC实验笔记
目录 学习目标 成果展示  介绍 简介 硬件 代码 总结  ---- 学习目标         本节内容讲解的是有关PWM转DAC的知识点,其实这种做法我们已经不陌生了,因为在学习51单片机的时候,DA也是通过PWM来实现的。51单片机——AD/DA转换,好了,接下来就让我们开始吧! 成果展示  https://live.csdn.net/v/embed/233690 PWM DAC 介绍 简介         PWM 本质上其实就是是一种周期一定,而高低电平占空比可调的方波。      
小点点
2022/12/12
9020
(29)STM32——PWM DAC实验笔记
STM8S——Analog/digital converter (ADC)
本文介绍了如何使用STM8S105F4单片机实现一个ADC1型的模拟数字转换器,通过硬件电路和软件程序的设计,实现电压信号的采集、处理和存储,并可通过指令控制ADC1的工作状态以及读取转换结果。
Christal_R
2017/12/25
1.8K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但
杨奉武
2018/04/18
1K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
STM32中AD采样的三种方法分析
在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式。三种方法按照处理复杂方法DMA模式处理模式效率最高,其次是中断处理模式,最差是查询模式,相信很多学者在学习AD采样程序时,很多例程采用DMA模式,在这里我针对三种程序进行分别分析。
用户6754675
2020/07/08
1.4K0
stm32f103波形发生器_示波器波形分析
摘要
全栈程序员站长
2022/11/04
1.6K2
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。**改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。**因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。 传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
全栈程序员站长
2022/08/23
8.6K2
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
开发者成长激励计划-基于TencentOS Tiny的植物土壤湿度监测机
本次有幸参与开放原子开源基金会举办的开发者成长激励计划,植物土壤湿度监测机基于TencentOS Tiny CH32V_EVB RISC-V开发套件(采用WCH的RISC-V CH32V307VCT6 MCU)开发套件,外接WiFi模组及土壤湿度传感器监测植物生长环境湿度数据上传至云端,支持本地自动水泵运行,也可以通过腾讯云IoT实现云端手动控制水泵。
不爱吃胡萝卜
2022/08/11
7590
开发者成长激励计划-基于TencentOS Tiny的植物土壤湿度监测机
STM32单片机-输入捕获、FFT测频
​本内容介绍基于STM32F103VET6的一个实际工程中添加采集A相电压信号或B相电流信号频率的功能,分别通过输入捕获与FFT实现,均测试可用。持续更新,原创不易!
爱上电路设计
2024/05/28
2660
STM32单片机-输入捕获、FFT测频
2016TI杯——寻迹小车
B题:自动循迹小车 1.任务 设计制作一个自动循迹小车。小车采用一片 TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。
全栈程序员站长
2022/06/26
6400
2016TI杯——寻迹小车
开发者成长激励计划-基于TencentOS Tiny 的物联网小车机械臂
随之物联网的发展,各类设备都能通过物联网进行控制,本次方案尝试了通过腾讯物联网平台实现设备控制设备的功能,使用了小型机械臂和小车进行测试,验证控制的物联网控制的实时性。机械臂由5个舵机实现5个自由度。小车由一个转向舵机和一个驱动电机组成。控制端采用WCH沁恒RISC-V TencentOS Tiny CH32V_EVB_AIoT RevB02开发套件负责读取电位器和姿态传感器数据并上传到云端,执行端由STM32L431RCT6控制器负责驱动电机和舵机。
海内天涯
2022/08/06
1.1K0
开发者成长激励计划-基于TencentOS Tiny 的物联网小车机械臂
STM32 BMP280模块 获取气压温度高度传感器数据
BMP280是博世最新推出的数字气压传感器,具有卓越的性能和低廉的价格,相对精度为±0.12 hPa(相当于±1米),传感器功耗仅有2.7μA,包括压力和温度测量功能。
CoderEnd
2023/05/07
9090
STM32 BMP280模块 获取气压温度高度传感器数据
2016年四川省TI杯电子设计竞赛B题
B题:自动循迹小车 1.任务 设计制作一个自动循迹小车。小车采用一片 TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。
全栈程序员站长
2022/06/26
6850
2016年四川省TI杯电子设计竞赛B题
蓝桥杯嵌入式之光敏电阻、ADC*2讲解
Tr AO是光敏值的输出端,Tr DO是判断器LM393D的输出端,它是比较光敏电阻的电压和滑动变阻器电压的大小。
用户5935416
2019/08/01
1.3K0
蓝桥杯嵌入式之光敏电阻、ADC*2讲解
(35)STM32——红外遥控实验
https://blog.csdn.net/weixin_66578482/article/details/126141850        这一篇笔记对红外遥控进行了详细的介绍,感兴yxky'x'k 
小点点
2022/12/12
6740
推荐阅读
相关推荐
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验