1.Partition Recovery机制
每个Partition会在磁盘记录一个RecoveryPoint, 记录已经flush到磁盘的最大offset。当broker fail 重启时,会进行loadLogs。 首先会读取该Partition的RecoveryPoint,找到包含RecoveryPoint的segment及以后的segment, 这些segment就是可能没有 完全flush到磁盘segments。然后调用segment的recover,重新读取各个segment的msg,并重建索引
优点
- 1.以segment为单位管理Partition数据,方便数据生命周期的管理,删除过期数据简单
- 2.在程序崩溃重启时,加快recovery速度,只需恢复未完全flush到磁盘的segment
- 3.通过index中offset与物理偏移映射,用二分查找能快速定位msg,并且通过分多个Segment,每个index文件很小,查找速度更快。
2.Partition Replica同步机制
- 1.Partition的多个replica中一个为Leader,其余为follower
- 2.Producer只与Leader交互,把数据写入到Leader中
- 3.Followers从Leader中拉取数据进行数据同步
- 4.Consumer只从Leader拉取数据
ISR:所有不落后的replica集合, 不落后有两层含义:距离上次FetchRequest的时间不大于某一个值或落后的消息数不大于某一个值, Leader失败后会从ISR中选取一个Follower做Leader
关于replica复制详解请移步:Kafka副本同步机制理解
3.数据可靠性保证
当Producer向Leader发送数据时,可以通过acks参数设置数据可靠性的级别
- 1.0: 不论写入是否成功,server不需要给Producer发送Response,如果发生异常,server会终止连接,触发Producer更新meta数据;
- 2.1: Leader写入成功后即发送Response,此种情况如果Leader fail,会丢失数据
-
3.-1: 等待所有ISR接收到消息后再给Producer发送Response,这是最强保证
仅设置acks=-1也不能保证数据不丢失,当Isr列表中只有Leader时,同样有可能造成数据丢失。要保证数据不丢除了设置acks=-1, 还要保 证ISR的大小大于等于2,具体参数设置: -
1.request.required.acks:设置为-1 等待所有ISR列表中的Replica接收到消息后采算写成功;
- 2.min.insync.replicas: 设置为大于等于2,保证ISR中至少有两个Replica
Producer要在吞吐率和数据可靠性之间做一个权衡
4.数据一致性保证
一致性定义:若某条消息对Consumer可见,那么即使Leader宕机了,在新Leader上数据依然可以被读到
- 1.HighWaterMark简称HW: Partition的高水位,取一个partition对应的ISR中最小的LEO作为HW,消费者最多只能消费到HW所在的位置,另外每个replica都有highWatermark,leader和follower各自负责更新自己的highWatermark状态,highWatermark <= leader. LogEndOffset
- 2.对于Leader新写入的msg,Consumer不能立刻消费,Leader会等待该消息被所有ISR中的replica同步后,更新HW,此时该消息才能被Consumer消费,即Consumer最多只能消费到HW位置
这样就保证了如果Leader Broker失效,该消息仍然可以从新选举的Leader中获取。对于来自内部Broker的读取请求,没有HW的限制。同时,Follower也会维护一份自己的HW,Folloer.HW = min(Leader.HW, Follower.offset)
相关推荐
Kafka数据可靠性深度解读
总结kafka数据可靠性与一致性实现方式,对需要深入学习kakfa的同学有极大帮助,包含架构解析、leader选举、存储格式、HW、ACK等有详细的描述
kafka数据可靠性机制详解共4页.pdf.zip
kafka 数据可靠性深度解读.zip
向kafka插入数据测试
Kafka源码解析与实战.zip
kafka读取写入数据
消费kafka数据,然后批量导入到Elasticsearch,本例子使用的kafka版本0.10,es版本是6.4,使用bulk方式批量导入到es中,也可以一条一条的导入,不过比较慢。 <groupId>org.elasticsearch <artifactId>elastic...
unity利用kafka接收数据,只需填写ip端口,topic 即可接收消息;适用范围,unity编辑器,发布PC应用 说明:如果发布PC不可用,请手动将Plugins\X64文件夹里的dll 文件拷贝到发布文件kafka-Test_Data\Managed 路径下...
Kafka的以下几个基本特性保证了基本的可靠性: Kafka保证一个分区的消息是FIFO的 只有消息写入了所有分区的同步副本时,才认为是已提交的 只要有一个副本活跃,则消息就不会丢失 消费者只能读取已提交的消息 生产者...
本文首先从Kafka的架构着手,先了解下Kafka的基本原理,然后通过对kakfa的存储机制、复制原理、同步原理、可靠性和持久性保证等等一步步对其可靠性进行分析,最后通过benchmark来增强对Kafka高可靠性的认知。...
Kafka Producer机制优化-提高发送消息可靠性
flink 实现将kafka的数据读取出来,并经过xml配置和重写算子方式实现数据处理并写到kafka
Scala代码积累之spark streaming kafka 数据存入到hive源码实例,Scala代码积累之spark streaming kafka 数据存入到hive源码实例。
3、Druid的load data 示例(实时kafka数据和离线-本地或hdfs数据) 网页地址:...本文介绍了Druid摄取离线与实时数据的过程,离线数据包括本地文件和hdfs数据,实时数据以kafka为示例进行说明。
Kafka源码解析以及实战,为深度学习kafka的童鞋提供研究教材呦
Kafka作为一个商业级消息中间件,消息可靠性的重要性可想而知。如何确保消息的精确传输?如何确保消息的准确存储?如何确保消息的正确消费?这些都是需要考虑的问题。本文首先从Kafka的架构着手,先了解下Kafka的...
Flink实时读取Kafka数据批量聚合(定时/按数量)写入Mysql源码+kafka安装包+zookeeper安装包