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机制:

  1. leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护
  2. 如果一个flower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其重ISR中移除
  3. 当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相关推荐

  1. [Big Data - Kafka] kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许 ...

  2. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  3. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  4. Kafka学习-入门

    在上一篇kafka简介的基础之上,本篇主要介绍如何快速的运行kafka. 在进行如下配置前,首先要启动Zookeeper. 配置单机kafka 1.进入kafka解压目录 2.启动kafka bin\ ...

  5. Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

    1. CAP理论 1.1 Cosistency(一致性) 通过某个节点的写操作结果对后面通过其他节点的读操作可见. 如果更新数据后,并发访问的情况下可立即感知该更新,称为强一致性 如果允许之后部分或全 ...

  6. Kafka学习【1】

    Kafka学习[1] Kafka的用途有哪些?使用场景如何?### 消息系统: Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦.冗余存储.流量削峰.缓冲.异步通信.扩展性.可恢复性等功 ...

  7. Kafka学习记录(三)——Broker

    Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...

  8. Kafka学习之消费者

    Kafka学习之消费者 前言 本博客主要介绍up在学习kafka中间件时候觉得需要记录的知识点. 内容 1.消费者与消费组 消费者(Consumer)负责订阅Kafka中的主题(Topic),并且从订 ...

  9. Kafka学习之四 Kafka常用命令

    2019独角兽企业重金招聘Python工程师标准>>> Kafka学习之四 Kafka常用命令 Kafka常用命令 以下是kafka常用命令行总结: 1.查看topic的详细信息 . ...

最新文章

  1. 考csp所需算法_CSP vs RxJS:您所不知道的。
  2. IDC:预计全球人工智能支出将在四年内翻一番
  3. css内边距与外边距的区别
  4. 计算机默认存储格式,office2007默认保存文件格式的修改方法
  5. 2019年有三AI“春季”划,给我一个荣耀,还你一生荣耀
  6. linux系统fuser命令,Linux系统使用Fuser命令的方法
  7. 在 Mac 上创建和移除替身
  8. 用户体验很棒的Git学习网站
  9. Linux 内核第一宏
  10. Keli μVision中 STR指令写入内存无效
  11. Win Server 2012 R2 安装SQL 2016先决条件
  12. 互联网电视牌照商那点事
  13. 如何设计最惊艳的PPT
  14. SSM 运行报错Failed to load resource: the server responded with a status of 404 (Not Found)
  15. 程序员软考真题__专项:数据结构与算法 02
  16. 【杂】孔明锁6根解法 九连环的拆卸方法及还原
  17. 【学习笔记】树莓派(3B+)及VMware对于代理Proxy的使用
  18. 【读书笔记】《云计算关键领域安全指南V4.0》(一)
  19. 《嘉工资》--Python实现工资管理系统
  20. 浅谈 Arbitrum 生态

热门文章

  1. predict函数 R_R工程化(1) Rest API 之plumber包
  2. [转载] 罗辑思维的「成功」之道
  3. OSChina 周日乱弹 ——该用什么表情面对这个世界
  4. 2018.8.4T2(贪心,dp,线段树,优先队列)
  5. 【来日复制粘贴】关于排名
  6. Python【jieba】词性标注表
  7. 写给创业者:如何打造让用户离不开的App
  8. 洛谷 P4324 [JSOI2016]扭动的回文串 manacher+字符串hash
  9. 安科瑞“智慧用电”一个适合高校学生公寓安全用电的智能控制与管理系统
  10. 树莓派对RGB-LED传感的实验