Kafka – 04数据存储及查询
一、Kafka数据存储
1.1 存储结构
topic在broker上存储方式
- 创建topic时,指定分区和副本数量
- 分区目录ttopic2-0, 格式: 主题-分区号
- 目录下是数据文件,Kafka数据就是message,数据存储在log文件里
- .log结尾的就是日志文件, 在Kafka中把数据文件就叫做日志文件。
- 一个分区下面默认有很多个日志文件(分段存储),一个.log日志文件默认大小是1G。
- index是索引文件, timeindex是时间索引文件
- partition 物理上由多个segment文件组成,每个segment大小相等。
- 每个 segment 数据文件以该段中最小的 offset 为文件名, 扩展名为.log。
[root@my-node51 bin]./kafka-topics.sh --bootstrap-server 192.168.6.51:9092 --create --topic ttopic2 --partitions 3 --replication-factor 2 [root@my-node51 kafka-logs]# ll drwxr-xr-x 2 root root 141 7月 3 09:26 ttopic2-0 drwxr-xr-x 2 root root 141 7月 3 12:10 ttopic2-1 [root@my-node52 kafka-logs]# ll drwxr-xr-x 2 root root 141 7月 3 12:10 ttopic2-1 drwxr-xr-x 2 root root 141 7月 3 12:10 ttopic2-2 [root@my-node53 kafka-logs]# ll drwxr-xr-x 2 root root 141 7月 3 12:10 ttopic2-0 drwxr-xr-x 2 root root 141 7月 3 12:10 ttopic2-2 [root@my-node51 ttopic2-0]# ll 总用量 20480 -rw-r--r-- 1 root root 10485760 7月 3 12:10 00000000000000000000.index -rw-r--r-- 1 root root 0 7月 3 09:26 00000000000000000000.log -rw-r--r-- 1 root root 10485756 7月 3 12:10 00000000000000000000.timeindex -rw-r--r-- 1 root root 0 7月 3 09:26 leader-epoch-checkpoint
二、Kafka数据查询
当查找offset的Message时,通过二分查找快速找到Message所处于的segment中。
2.1 日志位置
- offset: Kafka里面每一条消息都有自己的offset(相对偏移量)
- 消息在日志中的位置, 理解为消息在partition上的偏移量,代表消息的唯一序号。
- 同时也是 主从partition 需要同步的消息。
- position: 在物理磁盘上面的位置
2.2 稀疏索引
- Kafka中采用了稀疏索引的方式读取索引。
- Kafka每当写入了4k大小的日志数据(.log),就往index里写入一个记录索引。
2.3 日志数据的消费策略
- 从开始位置进行消费:
- 从当前位置开始消费:
- 从指定的offset位置开始进行消费:
--offset <String: consume offset> The offset id to consume from (a non-negative number), or 'earliest' which means from beginning, or 'latest' which means from end (default: latest)
三、 Kafka高可用
3.1 Kafka冗余副本保证高可用
在kafka里面分区是有副本的,注:0.8以前是没有副本机制的。
- 创建主题时,可以指定分区 和 副本个数。
- partition 有一个leader与多个follower。
- 副本是有角色的:
- leader partition: 写数据、读数据操作都是从leader partition去操作的。
- 维护一个ISR(in-sync- replica )列表,但是会根据一定的规则删除ISR列表里面的值
- follower partition:从leader partition同步数据。
3.2 节点数据同步及一致性
- 生产者发送来一个消息,消息首先要写入到leader partition中,写完了以后,还要消息会被复制到其它分区。
- 每一个 follower 可以理解为一个消费者,定期到leader拉取消息。
- 只有数据同步后, kafka才会给生产者返回一个ACK, 告诉生产者已经存储落盘了。
3.3 ISR
- 为了保证性能, Kafka 不会采用强一致性的方式来同步主从数据。kafka维护了一个 ISR(in-sync replica) 列表。
- Leader 不需要等待所有 Follower 都完成同步, 只要在ISR中Follower 完成数据同步 就可以发送ACK给生产者。
- 当发现ISR中某个 follower 落后太多时,就会被剔除。
3.4 故障恢复
- Kafka通过多副本机制最大限度保证消息不丢失,数据写入到OS Cache中,未刷新到磁盘中,机器宕机会丢失数据。
- 生产者发送消息给leader, leader 完成数据存储,发生故障,未返回ACK给生产者。
- 通过Zookeeper选举,一个follower成为leader, producer重新请求新的leader, 并保存数据。
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/273389.html