消息队列MQ

Kafka - 04数据存储及查询

本文主要是介绍Kafka - 04数据存储及查询,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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, 并保存数据。

 

这篇关于Kafka - 04数据存储及查询的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!