1、概述
同一个topic下有多个不同的partition,每个partition为一个目录,partition命名的规则是topic的名称加上一个序号,序号从0开始。
每一个partition目录下的文件被平均切割成大小相等(默认一个文件是1G,可以手动去设置)的数据文件,每一个数据文件都被称为一个段(segment file),但每个段消息数量不一定相等,这种特性能够使得老的segment可以被快速清除。默认保留7天的数据。
每次满1G后,在写入到一个新的文件中。
另外每个partition只需要支持顺序读写就可以。如上图所示:首先0000000000000.log是最早产生的文件,该文件达到1G后又产生了新的000000000002025849.log文件,新的数据会写入到这个新的文件里面。
这个文件到达1G后,数据又会写入到下一个文件中。。也就是说它只会往文件的末尾追加数据,这就是数据写的过程,生产者只会对每一个partition做数据的追加(写操作)。
2、数据消费问题讨论
问题:如何保证消息消费的有序性呢?比如说生产者生成了0到100个商品,那么消费者在消费的时候按照0到100这个从小到大的顺序消费?
****那么kafka如何保证这种有序性呢?***
难度就在于,生产者生成出0到100这100条数据之后,通过一定的分组策略存储到broker的partition中的时候,比如0到10这10条消息被存放到了这个partition中,10到20这10条消息被存到了那个partition中,这样的话,消息在分组存到partition中的时候就已经被分组策略搞得无序了。
那么能否做到消费者在消费消息的时候全局有序呢》
遇到这个问题,我们可以回答,在大多数情况下是做不到全局有序的。但在某些情况下是可以做到的。比如我的partition只有一个,这种情况下可以全局有序的。
那么可能有人又要问了,只有一个Partition的话,哪里来的分布式呢?哪里来的负载均衡呢?
所以说,全局有序是一个伪命题!全局有序根本没有办法在kafka要实现的大数据的场景来做到。但是我们只能保证当前这个partition内部消息消费的有序性。
结论:一个partition钟的数据是有序的吗?回答:间隔有序,不连续。
针对一个topic里面的数据,只能做到partiton内部有序,不能做到全局有序。特别是加入消费者的场景后,如何保证消费者的消费的消息的全局有序性,这是一个伪命题,只有在一种情况下才能保证消费的消息的全局有序性,那就是只有一个partition。
3、Segment文件
Segmetn file是什么
生产者生产的消息按照一定的分区策略被发送到topic中partition中,partiton在磁盘上就是一个目录,该目录名在topic的名称加上一个序号,在这个partiton目录下,有两类文件,一类以log为后缀的文件,一类是以index为后缀的文件,每一个log文件和一个index文件相对应,这一对文件就是一个segment file,也就是一个段。
其中的log文件就是数据文件,里面存放的就是消息,而index文件是索引文件,索引文件记录了元数据信息。log文件达到1个G后滚动重新生成新的log文件
Segment file是什么
生产者生产的消息按照一定的分区策略被发送到topic中partiton中,partition在磁盘上就是一个目录,该目录名是topic的名称加上一个序号,在这个partiton目录下,有两类文件,一类是以log为后缀的文件,一类是以index为后缀的文件,每一个log文件和一个index文件相对应,这一对文件就是一个segment file,也就是一个段。
其中的log文件就是数据文件,里面存放的就是小学,而index文件是索引文件,索引文件记录了元数据信息。log文件达到1个G后滚动重新生成新的log文件。
Segment文件特点
segment文件命名的规则:partiton全局的第一个segment从0(20个0)开始,后续的每一个segment文件名是上一个segment文件中最后一条消息的offset值。
那么这样命令有什么好处呢?
假如我们有一个消费者已经消费到了368776(offset值为368776),那么现在我们继续消费的话,怎么做呢?
看下图,分2个步骤;
第1步是从所有文件log文件的的文件名中找到对应的log文件,第368776条数据位于上图中的“00000000368769.log”这个文件中,这一步涉及到一个常用的算法叫做“二分查找法”(假如我现在给你一个offset值让你去找,你首先是将所有的log的文件名进行排序,然后通过二分查找法进行查找,很快就能定位到某一个文件,紧接着拿着这个offset值到索引文件中这条数据究竟存在哪里);
第二步是到index文件中去找第368776条数据所在的位置。
索引文件(index文件)中存储这大量的元数据,而数据文件(log文件)中存储这大量的消息。
索引文件(index文件)中的元数据指向对应的数据文件(log文件)中消息的物理偏移地址。
kafka的文件存储机制
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 3. 分布式发布订阅消息系统Kafka 3.1 Kafka概述 Kafka官网(http://kafka.apac...