Kafka整体架构、工作流程与文件存储机制
Kafka架构图
总结:
-
消息是分主题的,然后为了扩展性,每个主题又有许多分区(分片和索引机制),这些分片可以跨机存在
-
每个分区内部又是有序的队列,索引从0.1.2..开始这种的
-
注意副本的概念:副本是针对分区的,每个分区都有若干副本(一leader和多follower)
-
副本的leader和follower又有崩溃后选主的策略,然后对应一些ISR的概念
Kafka工作流程及文件存储机制
工作流程
简单描述下:
-
上图中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文件
存储机制
由于生产者生产的消息会不断追加到 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文件详解:
".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的关系如下:
其中,partition是以文件夹的形式存储在具体Broker本机上。
参考:Kafka之数据存储