1.kafka消息的存储原理

1.简要说明:在kafka中,一个topic下面会有多个partition,partition在磁盘上是存在物理路径的,在partition目录下存放着kafka对应的日志文件。(我们存了哪些文件)

查看kafka服务状态_二分查找法


总结我们partition下存了哪些文件:index,log.timeindex2.kafka会使用分段的方式(LogSegment)来存储数据,LogSement只是一个逻辑上的概念,他在物理磁盘上的表现为一个.log文件与一个.index总是成对存在的。我们可已在config/server.properties下面配置每一个分段的大小。

查看kafka服务状态_查看kafka服务状态_02


他默认的logSement是1G。分段后的结果是:

查看kafka服务状态_二分查找法_03


如果kafka以partition必然会导致数据很难清理,所以使用在partition下面在细分logSement,这样就更加好管理数据。

查看kafka服务状态_kafka_04


总结:我们是怎么存储的:分段logSement存的4.他各个文件下面的内容以及命名规则:

(1).log文件

查看命令:sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /Users/michael/kafka/tmp/kafka-logs/quantopic-0/00000000000000000000.log --print-data-log

查看结果:

查看kafka服务状态_数据_05


命名规则:

发现第一个log文件的最后一个offset,是下一个logSegment里面log文件名,文件名都是20位字符长度的。

(2).index文件

查看命令:sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /Users/michael/kafka/tmp/kafka-logs/quantopic-0/00000000000000000000.index --print-data-log

查看结果:

查看kafka服务状态_kafka_06


5.logSement中index文件与log文件的关系

查看kafka服务状态_kafka_07


简要文字说明:index文件里面存的是offset和物理偏移量,而log文件里面存放的是offset,物理偏移量和消息内容,在index里面position是不重复的,而在log文件中,一段offset区间,它里面的position是相同的重复的。

总结一下:我们怎么看这些文件-对应的脚本,文件里面有什么内容-截图,index-log文件的关系(图),这些文件怎么命名-上一个文件最后的offset

6.基于这样的机制,我们是如何获取到一个offset的消息的内容的(过程)
(1)首先我们会根据offset值查找到对应的index文件,由于index文件是有上一个文件的最后一个offset命名的,我们使用二分查找法很快就可以找到index索引文件。
(2)得到索引文件之后,我们根据offset来定位,二分查找法确定索引范围得到一个[offset,position]。
(3)确定访问后我们会得到一个position,再从log中的这个position开始顺序遍历查找到对应的offset的信息
举例子:我们需要获取offset为208050的信息
(3.1).00000000000000206233.index<208050<00000000000000210308.index,,可以确定索引文件为00000000000000206233.index
(3.2).再索引文件中有:
offset: 206782 position: 5189
offset: 206783 position: 12094
offset: 207236 position: 22092
offset: 207800 position: 34400
offset: 208047 position: 39321
offset: 208920 position: 57194
offset: 209129 position: 61302
offset: 209337 position: 68328
offset: 209532 position: 72714
offset: 209674 position: 77123
offset: 209839 position: 81360
offset: 210162 position: 87227
你会发现:根据208050,二分查找法,小于或等于这个数,你会找到offset: 208047 position: 39321这条索引
(3.3).再到log文件中,根据39321这个position开始顺序查找,比较每条消息的offset是否大于等于208050。最后查找到对应的消息以后返回

7.使用分段处理的好处是:
1.清除旧的日志:默认清楚7天前的旧数据
2.也可以根据大小来清除日志,在server.properties配置
3.也可以进行日志压缩:其中一种压缩策略是根据相同的key进行压缩,取最新的values