Kafka一致性

2023-11-18

一,存在的一致性问题
1,生产者和Kafka存储一致性的问题。即生产了多少条消息,就要成功保存多少条消息,不能丢失,不能重复,更重要的是不丢失。其实就是要确保消息写入成功,这可以通过acks=-1来保证,保证所有ISR的副本都是一致的,即一条消息写入所有副本才算写入成功。这里有个问题在于,ISR中的副本数不一定等于集群副本数,如果ISR为1,可能导致数据丢失,在这种情况下,相当于Leader写入成功即认为消息写入成功,但在极端情况下,Leader写入成功后宕机,其他副本未同步,生产者又认为写入成功,不会尝试再次写入,则这条消息丢失。这种情况可以通过设置ISR队列至少为2来解决,即保证一条消息至少写入两个副本才算成功。使用acks=-1假设ISR=2能保证消息不丢失,不能保证消息不重复,要保证消息不重复,则要开启幂等或者事务特性。开启幂等,同一个分区的消息会加上序列号,已经提交的序列号再次提交时会被认为是重复的,不会被再次保存。不过幂等限于同一个会话、同一个分区。

幂等是通过生产者从broker获取pid,并对每个partition维护一个随消息自增的seqNumber,形成一个三元组<pid,partition,seqNumber>主键,重复的主键被认为是重复数据,会被丢弃。
因为PID会在生产者启动时申请,所以不同会话的PID不一致,同时考虑到生产者的数据来源,不同分区的可能PID也不一致,所以无法在topic维度统一seqNumber,只能在partition维度统一管理seqNumber
2,副本的一致性

消息先写入leader,follower从leader复制,必然会出现follower和leader不一致的现象,如果我们设置ISR至少等于2,可以减小这种风险,ISR至少等于2表示消息至少写入两个副本,这样就保证类至少两个副本是完全同步的,而leader只会从ISR中选举,则能保证当leader失活之后,新的leader也能不丢失数据。

3,消费一致性

leader稳定运行,通过消费者提交的offset控制消费进度,保证消息不丢失,不能保证不重复。

当生产者设置ack=-1时,很多一致性问题都会被解决,acks=-1要求副本同步复制,所有副本复制完成则认为消息保存成功,不会出现副本不一致的问题。leader失活重新选举的新leader和原来的leader也会保持数据的一致性。

但同步复制会导致kafka的性能降低。当acks不设置为-1时,如何尽量保证数据的一致性,从而取得性能和可靠性的平衡呢?

Kafka提供了很多机制来平衡性能和可靠性:

1,ISR,ISR保存了最低限度同步的副本集合,leader只能从ISR中获取,ISR的标准是follow和leader上次同步成功时间距现在不能超过10秒,超过10S会将副本从ISR中剔除,这样在副本间异步复制的情况下,尽量保证follower和leader的同步。

2,LEO,log end offset,每个副本最后一条消息的offset+1就是offset,每个副本单独维护,ISR中最小的LEO称之为HW,小于HW的offset才能被消费者消费。HW能避免消费者重复消费,保证消费者消费的一致性。HW也是副本重新加入ISR的标准。

如果没有HW,消费者直接将leader的所有消息消费,offset为leader的LEO,在ISR其他副本落后于leader的情况下,leader失活,重新选举其他副本作为leader,生产者写入新的数据到leader,但由于新leader的offset落后于旧leader,而记录的消费者消费的offset是旧leader的LEO,导致新写入的offset小于旧Leader LEO的数据不会再被消费,出现消息丢失的情况。

当如果使用HW,重选leader后新写入的消息不会丢失,不过旧leader上高于HW的消息则可能丢失。

3,被踢出ISR的副本的HW赶上Leader的HW后,会被重新纳入ISR管理。

Kafka正是通过异步复制、ISR、HW来平衡消息系统的效能和可靠性的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kafka一致性 的相关文章

  • homework03

    1 编写一个程序来读入不指定个数的整数 然后决定已经读取的整数中有多少个正数和多少个负数 并计算这些输入值 不统计0 的总和 最终得出它们的平均值 这个程序以输入值0来结束 使用浮点数显示这个平均值 a 0 b 0 sum 0 count
  • Python之ML--机器学习分类算法

    Python之ML 机器学习分类算法 介绍最早以算法方式描述的分类机器学习算法 感知器 perceptron 和自适应线性神经元 adaptive linear neuron 我们将使用python循序渐进地实现一个感知器 并且通过训练使其

随机推荐

  • VSCode与PyCharm提示unresolved import解决方案

    问题描述 在VScode或者pyharm中采用python import自定义模块是 有时会显示unresolved import警告并且 无法跳转到自定义模块函数定义 出现问题的原因 没有安装import对应的模块 import的文件夹没
  • 使用STM32的TIMER进行外部计数

    使用ETR引脚的输入信号作为计数时钟 本例程使用Timer 2 其ETR输入引脚为PA1 该引脚工作模式为输 入模式 Timer的工作模式为从模式 另外使用PC6输出一模拟方波时钟信号 测试时将PC6与PA1短接 用户也可另外连接一个时钟信
  • 简述反射机制

    一 什么是反射 1 1 反射 所谓框架的灵魂 框架 半成品软件 可以在框架的基础上进行软件开发 简化代码 反射 将类的各个组成部分封装为其他对象 反射机制 简单来说反射就是在程序运行期间 动态的获取类或者对象中的属性 什么是动态获取 反射的
  • Swift语法学习--类(class)

    文章目录 类 初始化及实例 类的引用 reference 特征 类和结构体比较 类属性的set和get方法解析 类属性的willSet和didSet方法解析 类的下标 类方法和静态方法 将一个类的实例作为另一个类的属性 类的继承 父类在实例
  • MATLABdiag()用法

    1 提取矩阵的对角线元素 设A为m n矩阵 diag A 函数用于提取矩阵A主对角线元素 产生一个具有min m n 个元素的列向量 diag A k 提取矩阵A第k条对角线的元素 产生一个列向量 注意 矩阵的对角线 与主对角线平行 往上为
  • Unity核心5——Tilemap

    Tilemap 一般称之为瓦片地图或者平铺地图 是 Unity2017 中新增的功能 主要用于快速编辑 2D 游戏中的场景 通过复用资源的形式提升地图多样性 工作原理就是用一张张的小图排列组合为一张大地图 它和 SpriteShape 的异
  • android Scrollview里的内容不停留在顶部的问题

    先说明一下 任何一个页面都应该按照布局的先后顺序来显示 我这出现的问题就是 Scrollview里面嵌套Listview的头布局一进来看不见了 直接被Listview把焦点给抢了 最先显示的是Listview的item部分 直接上图 解决代
  • React中的“计算属性”

    React中的 计算属性 相信许多学习过vue的小伙伴对计算属性都不陌生吧 计算属性能帮我们数据进行一些计算操作 计算属性是依赖于data里面的数据的 在vue中只要计算属性依赖的data值发生改变 则计算属性就会调用 那React中也有计
  • gsaop 有头文件生成wsdl文件

    gsoap ns service name name area gsoap ns service style rpc gsoap ns service encoding encoded gsoap ns service namespace
  • SSM框架之MyBatis(二)--多表查询及查询结果映射

    使用MyBatis这一强大的框架可以解决很多赋值的问题 其中对于子配置文件中的小细节有很多需要注意的地方 使用这个框架后主要就是对于配置文件的编写和配置 今天我写了一个多表查询 表的基本结构如下 用户表t user 用户编号uid 账号ac
  • CNN中特征融合的一些策略

    Introduction 特征融合的方法很多 如果数学化地表示 大体可以分为以下几种 X Y textbf X textbf Y X Y X
  • 12. Xaml Calendar控价 时间控件-->像挂历

    1 运行图片 2 运行源码 a xaml 源码
  • 通信原理复习(四)——基带数字信号的表示和传输

    数字信号传输的标志 1 除去直流分量和频率很低的分量 2 在接收端得到的每个码元的起止时刻信息 3 使信号的频谱和信道的传输特性相匹配 波形 1 单极性波形 只适合用导线连接的各点之间做近距离传输 0和 V V 2 双极性波形 取 V和 V
  • AD导入3D模型

    我之前写过一篇文章也是说AD的3D模型的 http blog csdn net tq384998430 article details 78614014 介绍的是使用AD自带的功能绘制3D模型 但是这样绘制出来的形状并不是很好看 如果导入元
  • el-table的无限滚动(效果比虚拟滚动更优)

    步骤 1 前端安装 save el table infinite scrol npm install save el table infinite scroll 2 全局引用 在main js中引用 import Vue from vue
  • C语言实现八进制转十进制

    八进制转十进制 include
  • java类的生命周期

    如图 1 加载 我们编写一个java的源文件 经过编译后生成一个后缀名为 class的文件 这结合四字节码文件 java虚拟机就识别这种文件 java的生命周期就是class文件从加载到消亡的过程 关于加载 其实 就是将源文件的class文
  • 关键元器件选型设计指引--通用逻辑器件(逻辑IC)

    1 物料分类 标准逻辑器件 标准数字逻辑IC集成电路可以从工艺 功能和电平三个方面划分 列表所示 注 常见的逻辑电路有54军用系列和74商用系列 两者电路功能一致 本文仅讨论74系列 按照制造工艺特点分类 工艺 逻辑器件产品族 优点 不足
  • sublime-text3-自定义代码补全

    自定义代码补全 打开sublime text3 选择菜单栏 工具 gt 新代码段 按以下模板填充 content 在CDATA中填补全内容 tabTrigger 触发代码 scope 文件类型 description 描述信息 下例为 输入
  • Kafka一致性

    一 存在的一致性问题 1 生产者和Kafka存储一致性的问题 即生产了多少条消息 就要成功保存多少条消息 不能丢失 不能重复 更重要的是不丢失 其实就是要确保消息写入成功 这可以通过acks 1来保证 保证所有ISR的副本都是一致的 即一条