kafka的工作流程: kafka集群里面有许多broker,每个broker里面有许多Topic,Topic可以分为许多的partition,对partition又会进行备份操作,这样是为了保证数据的安全和稳定。对partition的备份又分为leader和follower,一般的读写操作都是在leader上面进行。为了数据的安全,相同Topic的相同partition不会存在于一个broker上面。每一个partition里面会有offset即消息的偏移量,偏移量是每个分区独立计算的,一般消费到哪个地方就是由偏移量标记的,偏移量一般是存在于kafka的磁盘中的(老版本是存在Zookeeper上面的)。消费者组里面会有许多的消费者,每个消费者组里面只有一个消费者去消费某个Topic的partition,不能让同一个消费者组的两个消费者去消费同一个Topic的partition里面的消息。所以最好是消费者组里面的消费者的数量和Topic里面的partition的数量相同,这样效率比较高。

java kafka 监控主题偏移量 kafka偏移量保存在哪里_偏移量

kafka中的消息是以Topic分类的,生产者生产消息和消费者消费消息都是面向Topic的。Topic是逻辑上面的概念,partition是物理上面的概念,生产者生产消息时都是以Topic-partition命名的。每个partition都会对应一个log文件,该Log文件中存储的就是生产者生产出来的数据,生产者生产出来的数据就会不断地追加到该log文件的末端,且每条数据都有自己的offset。消费者组中的每个消费者都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

kafka的文件存储机制

java kafka 监控主题偏移量 kafka偏移量保存在哪里_偏移量_02


由于生产者的消息会不断地堆加到log文件末尾,为了防止log文件过大导致搜索效率低下,Kafka使用了分片和索引的机制,将每个partition分为多个segment。每个segment对应了两个文件即.log文件和.index文件。这些文件位于同一个文件夹下面,该文件夹的名字规则是:topic名称+分区号。例如first这个Topic里面有三个partition,则其对应的文件夹为first-0, first-1, first-2.

.log文件和.index文件以当前segment的第一条消息的offset命名,下图为index文件和log文件的结构示意图。

java kafka 监控主题偏移量 kafka偏移量保存在哪里_kafka_03


从图中可以看见,.log文件和.index文件是对应的关系。如果直接从.log文件中找offset为3的message,这样查询速度会比较慢,因为每条消息的大小不一样,如果消息很大去找第三条消息就会很浪费时间。于是kafka在每个partition的segment中就维护了这样一个.index文件,.index文件维护了offset的在磁盘中的起始位置和该条消息的大小如offset为1000 大小为2000 那该条消息就是从1000到3000,这样的.index文件查询起来十分快,因为存储这样几条信息不需要占用很大空间而且基本上维护的每条信息大小是一样的,这样查询起来就更加方便了。

.index文件中存储了大量的索引信息,.log文件中存储了许多的数据,索引文件的元数据指向对应数据文件中的message的物理偏移地址。