消息队列MQ

Kafka整体架构、工作流程与文件存储机制

本文主要是介绍Kafka整体架构、工作流程与文件存储机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Kafka架构图

image

总结:

  • 消息是分主题的,然后为了扩展性,每个主题又有许多分区(分片和索引机制),这些分片可以跨机存在

  • 每个分区内部又是有序的队列,索引从0.1.2..开始这种的

  • 注意副本的概念:副本是针对分区的,每个分区都有若干副本(一leader和多follower)

  • 副本的leader和follower又有崩溃后选主的策略,然后对应一些ISR的概念

Kafka工作流程及文件存储机制

工作流程

image
简单描述下:

  • 上图中Kafka集群中有3个broker,每个broker放了两个分区;

  • 整体只有一个主题Topic为A;A有三个分区:0/1/2;

  • 每个分区有2个副本(也就是一个leader一个follower);

Kafka中的消息是以topic来分类的,生产者和消费者都是面向topic的,不过topic是个逻辑上的概念,而partition是物理上的概念,所以存盘的最小粒度单位是分区。

每个partition都对应于一个log文件,log保存的就是生产者生产的数据,生产者的消息会不断追加到log文件,且每个消息都会有自己的offset。

每个partition中的消息是以log的形式存在,但是Kafka的消息最底层用的是LogSegment(日志段),因为单个log文件大小上限为1G,超过后会生成新的log文件。也就是说一个partition可能对应多个log文件。

Kafka的一个日志段包括一个消息日志文件和若干索引文件组成,即一个.log和.index文件

存储机制

image

由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了 分片和 索引机制,将每个 partition 分为多个 segment。每个 segment对应两个文件 ——“.index”文件和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic 名称+分区序号。例如,first 这个 topic 有三个分区,则其对应的文件夹为 first-0,first-1,first-2。

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log

kafka把数据存在磁盘中,怎样保证较快的读取呢?

  • partition是以文件夹的形式存储在具体Broker本机上

  • 数据保存为log,log有分片和索引机制,分为很多segment,

  • 保存形式为:000.index--000.log,然后超过1g以后生成新的segment。

  • 那么新的segment怎么命名呢?命名为本segment中最小的消息id,这样在查数据的时候就可以利用二分了。

  • xx.index文件存offset--(对应log中的起始位置和大小),比如xx.index中存【3--(756,1000)】,那么就会去xx.log中读取756-1756这段的数据。

  • 因此,虽然kafka是磁盘存储,但是读写速度还是很快的。

  • 磁盘的顺序读写比乱序内存读要快吗?

  • index 和 log 文件以当前 segment 的第一条消息的 offset 命名。


index文件和log文件详解:
image

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

因为索引的存在,所以查数据的时候使用了二分,故读写速度比较快。

总结

  • Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群;
  • Topic:一类消息,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发;
  • Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队;
  • Segment:每个partition又由多个segment file组成;
  • offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息;
  • message:这个算是kafka文件中最小的存储单位,即是 a commit log。

kafka的message是以topic为基本单位,不同topic之间是相互独立的。每个topic又可分为几个不同的partition,每个partition存储一部的分message。topic与partition的关系如下:
image

其中,partition是以文件夹的形式存储在具体Broker本机上。
参考:Kafka之数据存储

这篇关于Kafka整体架构、工作流程与文件存储机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!