深入了解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四种消息中间件分析介绍 我们从四种消息中间件的介绍到基本使用,以及高可用,消息重复性,消息丢失,消息顺序性能方面进行分析介绍! 一.消息 ...
随机推荐
- 说说Spring中的 @RestController 和 @Controller
Spring MVC执行流程已是JAVA面试中老生常谈的问题,相信各位小伙伴也是信手拈来.今天我们来谈谈另一个面试中必会必知的问题: @RestController和@Controller的区别? S ...
- Springboot Xss注入过滤
1.编写 XssHttpServletRequestWrapper import javax.servlet.http.HttpServletRequest; import javax.servle ...
- Go之Gorm和BeegoORM简介及配置使用
简介 ORM Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作 G ...
- Golang | 既是接口又是类型,interface是什么神仙用法?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第12篇文章,我们来继续聊聊interface的使用. 在上一篇文章当中我们介绍了面向对象的一些基本概念,以及gol ...
- Nginx学习简记_part2
第4章:nginx配置实例 -反向代理 4.1 反向代理实例一 实现效果:使用 nginx 反向代理,访问 www.123.com 直接跳转到 127.0.0.1:8080 4.1.1 实验代码 1) ...
- SpringBoot中Mybatis打印sql日志
application.yml中加上 # springBoot+Mybatis 控制台打印SQL语句 (方式一) logging: level: com.zoctan.api.mapper : deb ...
- Linux系统修改服务器系统时间
修改Linux系统时间,需要执行两个命令,如下: 第一条指令:date –s '2017-07-12 10:22:30' 第二条指令:clock –w //将日期写入CMOS
- 第一篇Scrum冲刺博客
目录 一.Alpha 阶段认领的任务 二.明日成员的任务安排 三.整个项目预期的任务量 四.敏捷开发前的感想 五.团队期望 一.Alpha 阶段认领的任务 陈起廷 任务 预计时间 日记天气.心情选择 ...
- Kubernetes使用Eedpoints连接外部服务端口
Kubernetes使用Eedpoints连接外部服务端口 背景: 在Kubernetes的使用环境中,我们经常要连接外部的一些服务,比如mysql Elasticsearch kafka 等等外部的 ...
- 解Bug之路-dubbo应用无法重连zookeeper
前言 dubbo是一个成熟且被广泛运用的框架.饶是如此,在某些极端条件下基于dubbo的应用还会出现无法重连zookeeper的问题.由于此问题容易导致比较大的故障,所以笔者费了一番功夫去定位,现将排 ...