深入了解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四种消息中间件分析介绍 我们从四种消息中间件的介绍到基本使用,以及高可用,消息重复性,消息丢失,消息顺序性能方面进行分析介绍! 一.消息 ...
随机推荐
- Python自动化爬取App数据
基本环境配置 版本:Python3 系统:Windows 需要安装: 1.JDK - Download JDK,Appium要求用户必须配置JAVA环境, 否则启动Seesion报错. 很多人学习py ...
- Html视频播放同时获取当前帧下的图片
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...
- 20、Java 泛型
1.晓之以理,动之以码 学Java就是很上头哦,一来直接三连问!!! 什么是泛型?为什么要用泛型?泛型怎么用? 当然泛型在Java中有很重要的一个地位,在面向对象编程以及在各种设计模式中有非常广泛的应 ...
- 2020-08-01:MySQL 的数据如何恢复到任意时间点?
福哥答案2020-08-01: 恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提.恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间 ...
- C#设计模式之7-桥接模式
桥接模式(Bridge Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/401 访问. 桥接模式属于结构 ...
- Android 开发学习进程0.17 Android资源文件selector textview显示两种不同字体
selector 是安卓资源文件的一种,它可以使按钮等实现不同状态下的不同UI,不用在代码中实现,而使用方式有两种,一种在color文件下 创建.xml可以使按钮等字体在不同状态下的变化,其二是在dr ...
- oracle正则表达式语法介绍及实现手机号码匹配方法
Oracle10g提供了在查询中使用正则表达的功能,它是通过各种支持正则表达式的函数在where子句中实现的.本文将简单的介绍oracle正则表达式常用语法,并通过一个手机特号匹配的例子演示正则表达式 ...
- PowerJob 的自实现高可用方案,妙妙妙!
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. 碎碎念 高可用放到今天已经不是一个新颖的词汇了,怎 ...
- 【ZJOI2007】棋盘制作 - 悬线法
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个 \(8 \times 8\) 大小的黑白相间的方阵,对应八八六十四卦 ...