kafka存储机制

kafka
kafka一个topic对应一个或多个partition,一个partition中的数据都是有序的,每个partition根据对应一个或多个segment。每个segment对应两个文件:.index和.log文件。

kafka存储机制实验

启动zookeeper命令:

bin/zookeeper-server-start.sh config/zookeeper.properties

启动kafka命令:

bin/kafka-server-start.sh config/server.properties

我这里创建名字为yangcan,分区数量为1,副本数量为1的topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic yangcan

通过控制台输入向名为yangcan的topic 生产数据

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic yangcan

查看topic消费数据是否成功

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic yangcan --new-consumer

查看配置文件,kafka的数据默认存储到/tmp/kafka-logs文件下面
在这里插入图片描述
进入此/tmp/kafka-logs目录后,因为创建topic时,指定topic只有一个分区,这里自动生成名为yangcan-0的分区名字,如有第二个分区,则下一个分区名称为yangcan-1,第三个分区名字则为yangcan-2,以此类推。

进入分区可以看到.index文件和.log文件,.index文件存储大量的索引信息,.log 文件存储大量的数据,索引文件中的元数据指向对应数据文件中 Message 的物理偏移量。index 和 log 文件以当前 segment 的第一条消息的 offset 命名,因为这是新创建topic,可以看出文件名称全部是0。
在这里插入图片描述
可以通过命令查看.index和.log文件相关内容:

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/yangcan-0/00000000000000000000.log  --print-data-log

此时分区0中只有一个segment,修改配置文件,将产生新的segment数据阈值调小,调成100(最小不能少于14。另外这只是产生新segment的方式之一)。
在这里插入图片描述
在这里插入图片描述
此时继续向topic生产数据,当数据大于100bytes时,进入分区数据目录查看,这时产生了新的segment名为00000000000000000008的.index文件和log文件。
在这里插入图片描述

如果某个topic中的分区很多,数据如何选择分区?

1.如果在发消息的时候指定了分区,则消息存储到指定的分区
2.如果没有指定分区,但是消息的key不为空,则基于key的哈希值来选择一个分区
3.如果既没有指定分区,且消息的key也是空,则用轮询的方式选择一个分区。

kafka如何查找数据?

kafka内部维护了一个ConcurrentSkipListMap的数据结构来保存在每个segment,通过跳表方式,定位到具体的日志偏移量索引文件(.index),然后在此文件中,根据二分法来查找不大于需要查找的offset对应的postion,然后在日志文件(.log文件)中从postion处往后遍历,找到offset等于要查找的offset对应的消息。删除数据也是如此。

kafka中segment什么时候删除?

在这里插入图片描述
配置文件里面注释很详细:
可以配置log.retention.hours 和 log.retention.bytes两种,并且两种策略都是独立的互不干扰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值