Kafka学习--------消息存储,ISR
1.Kafka消息存储
1.1Kafka集群中的几个概念
Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker能够组成一个Kafka集群。
Topic:一类消息,比如page view日志、click日志等都能够以topic的形式存在。Kafka集群能够同一时候负责多个topic的分发。
Partition:topic物理上的分组。一个topic能够分为多个partition,每一个partition是一个有序的队列。
Segment:partition物理上由多个segment组成。以下有具体说明。
offset:每一个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每一个消息都有一个连续的序列号叫做offset,用于partition中唯一标识的这条消息。
1.2 存储流程
一个topic被创建时会设置–replication-factor 和–partitions ,即设置topic的副本个数和分区数。一个topic可以设置>=1个分区(不设置默认为一个分区)和1<=副本数<=broker 个数。
一个topic可以对应多个分区,每一个分区会存在n个副本,分布在不同的Kafka集群节点上。在这些副本中有一个leader和多个follower组成。leader负责接受生产者发送的消息和存储消息到Kafka集群(0.9版本以后)。follower负责对leader的数据备份。每一个分区会在当前节点上的log.dir/toppicName-分区id/(log.dir 在Kafka server.proper配置文件中配置)目录下创建00000000000000000000.log和00000000000000000000.index两个文件。这两个文件组成了这个分区的一个Segment。log文件主要存储消息,而index文件负责对log的索引。
当log文件达到配置的log.segment.bytes=107370 (设置分段大小),默认是1Gb时,会新建一个0000000000000000XXXX.log和0000000000000000XXXX.index(XXXX为上一个segment的最大偏移量+1).这样有生成了一个新的segment。所以一个分区可以对应多个segment。
如图所示:
segment file 由 2 大部分组成,分别为 index file 和 datafile,此 2 个文件一一对应,成对出现,后缀".index"和“.log”分别表示为 segment 索引文件、数据文件.segment 文件命名规则:partion 全局的第一个 segment从 0 开始,后续每个 segment 文件名为上一个 segment文件最后一条消息的 offset 值进行递增。数值最大为 64 位long 大小,20 位数字字符长度,没有数字用 0 填充(为了方便,例子中少写了一些0)
举例说明:
当消费者之前已经获取了三条消息,现在需要继续获取消息,此时他需要读取的消息偏移量为3(从0开始)。首先会在多个index文件中根据文件名利用二分查找,定位消息所在的index文件,由于需要读取第四条消息偏移量为3,所以定位到00000000.index文件(如果需要获取第8条数据(偏移量为7),就会定位到000006.index文件)。
index文件中每条索引的大小为固定值,假设为100个字节。根据偏移量*100,可以获取到这条消息所对应的索引的起始地址。读取索引内的起始位置的值,就对应了这条消息在000000.log文件的起始地址值。根据消息的大小和起始地址就可以很快的从000000.log中取出第四条消息。
2. ISR
同步复制: 只有所有的follower把数据拿过去后才commit,一致性好,可用性不高。
异步复制: 只要leader拿到数据立即commit,等follower慢慢去复制,可用性高,立即返回,一致性差一些。
Commit:是指leader告诉客户端,这条数据写成功了。kafka尽量保证commit后立即leader挂掉,其他flower都有该条数据。
kafka不是完全同步,也不是完全异步,是一种ISR机制:
- leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护
- 如果一个flower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其重ISR中移除
- 当ISR中所有Replica都向Leader发送ACK时,leader才commit
既然所有Replica都向Leader发送ACK时,leader才commit,那么flower怎么会leader落后太多?
producer往kafka中发送数据,不仅可以一次发送一条数据,还可以发送message的数组;批量发送,同步的时候批量发送,异步的时候本身就是就是批量;底层会有队列缓存起来,批量发送,对应broker而言,就会收到很多数据(假设1000),这时候leader发现自己有1000条数据,flower只有500条数据,落后了500条数据,就把它从ISR中移除出去,这时候发现其他的flower与他的差距都很小,就等待;如果因为内存等原因,差距很大,就把它从ISR中移除出去。
————————————————
原文链接:https://blog.csdn.net/qq_37502106/article/details/80271800
在Kafka0.9版本之后,ISR移除了数据条数这一条件,只保留了超时时间这一条件。原因:由于生产者发送数据为批批量发送,假设一次发送12条数据,如果ISR设置的条数限制为10条,此时ISR里面的所有follower都不满足条件,都被踢出ISR队列,但是在10000ms以内,大部分follower已经同步完成leader的数据,又被重新加入到ISR队列中。由于ISR存储在zookeeper之中,多次踢出,重新加入,导致频繁读写zookeeper,导致效率降低,所有0.9以后,移除了条数这个限制,保留了时间限制。
Kafka学习--------消息存储,ISR相关推荐
- [Big Data - Kafka] kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许 ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- 大数据 -- kafka学习笔记:知识点整理(部分转载)
一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...
- Kafka学习-入门
在上一篇kafka简介的基础之上,本篇主要介绍如何快速的运行kafka. 在进行如下配置前,首先要启动Zookeeper. 配置单机kafka 1.进入kafka解压目录 2.启动kafka bin\ ...
- Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover
1. CAP理论 1.1 Cosistency(一致性) 通过某个节点的写操作结果对后面通过其他节点的读操作可见. 如果更新数据后,并发访问的情况下可立即感知该更新,称为强一致性 如果允许之后部分或全 ...
- Kafka学习【1】
Kafka学习[1] Kafka的用途有哪些?使用场景如何?### 消息系统: Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦.冗余存储.流量削峰.缓冲.异步通信.扩展性.可恢复性等功 ...
- Kafka学习记录(三)——Broker
Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...
- Kafka学习之消费者
Kafka学习之消费者 前言 本博客主要介绍up在学习kafka中间件时候觉得需要记录的知识点. 内容 1.消费者与消费组 消费者(Consumer)负责订阅Kafka中的主题(Topic),并且从订 ...
- Kafka学习之四 Kafka常用命令
2019独角兽企业重金招聘Python工程师标准>>> Kafka学习之四 Kafka常用命令 Kafka常用命令 以下是kafka常用命令行总结: 1.查看topic的详细信息 . ...
最新文章
- 考csp所需算法_CSP vs RxJS:您所不知道的。
- IDC:预计全球人工智能支出将在四年内翻一番
- css内边距与外边距的区别
- 计算机默认存储格式,office2007默认保存文件格式的修改方法
- 2019年有三AI“春季”划,给我一个荣耀,还你一生荣耀
- linux系统fuser命令,Linux系统使用Fuser命令的方法
- 在 Mac 上创建和移除替身
- 用户体验很棒的Git学习网站
- Linux 内核第一宏
- Keli μVision中 STR指令写入内存无效
- Win Server 2012 R2 安装SQL 2016先决条件
- 互联网电视牌照商那点事
- 如何设计最惊艳的PPT
- SSM 运行报错Failed to load resource: the server responded with a status of 404 (Not Found)
- 程序员软考真题__专项:数据结构与算法 02
- 【杂】孔明锁6根解法 九连环的拆卸方法及还原
- 【学习笔记】树莓派(3B+)及VMware对于代理Proxy的使用
- 【读书笔记】《云计算关键领域安全指南V4.0》(一)
- 《嘉工资》--Python实现工资管理系统
- 浅谈 Arbitrum 生态
热门文章
- predict函数 R_R工程化(1) Rest API 之plumber包
- [转载] 罗辑思维的「成功」之道
- OSChina 周日乱弹 ——该用什么表情面对这个世界
- 2018.8.4T2(贪心,dp,线段树,优先队列)
- 【来日复制粘贴】关于排名
- Python【jieba】词性标注表
- 写给创业者:如何打造让用户离不开的App
- 洛谷 P4324 [JSOI2016]扭动的回文串 manacher+字符串hash
- 安科瑞“智慧用电”一个适合高校学生公寓安全用电的智能控制与管理系统
- 树莓派对RGB-LED传感的实验