优质博文:IT-BLOG-CN
一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一。下面将从
Kafka
文件存储机制和物理结构角度,分析Kafka
是如何实现高效文件存储,及实际应用效果。Kafka
的基本存储单位是分区。在配置Kafka
的时候,管理员指定了一个用于存储分区的目录清单log.dirs
参数的值。
一、分区分配
创建主题时,Kafka
首先决定如何在broker
之间分配分区。假设有6
个broker
,打算创建一个包含10
个分区的主题。并且复制系数是3
,相当于30
个分区副本。在被分配到6
个broker
上时,要达到如下的目标:
【1】在broker
间平均分配分区副本。对于上述例子来说,就是要保证每个broker
可以分到5
个副本。
【2】确保每个分区的每个副本分布在不同的broker
上。
【3】如果为broker
指定了机架信息,那么尽可能把每个分区的副本分配到不同机架的broker
上。这样做是为了保证一个机架不可用不会导致整个分区不可用。
为了实现这个目标,我们先随机选择一个broker
(假设是2
),然后通过轮询给每个broker
分配分区来确定首领的位置。如果分区0
的首领在broker2
上,那么分区1
的首领就在broker3
上,以此类推。然后,从分区首领开始,以此分配跟随者副本。如分区0
首领在broker2
上,那么它的第一个副本会出现在broker3
上,第二个出现在 broker4
上。如果配置了机架信息,那么就不是按照数字顺序来选择broker
了,而是按照交替机架的方式来选择broker
。假设broker0
、broker1
、broker2
放在同一个机架,broker3
、broker4
、broker5
放在其他不同的机架。此时就不是按照0
到5
的顺序来选择broker
,而是按照0
,3
,1
,4
,2
,5
的顺序进行选择的。
二、文件管理
保留数据时Kafka
的一个基本特性,Kafka
不会一直保留数据,也不会等到所有消费者都读取了消息之后才删除消息。相反,Kafka
管理员为每个主题配置了数据保留期限,规定数据被删除之前可以保留多长时间,或者清理数据之前可以保留的数据量大小。 因为在一个大文件里查找和删除消息是很费时的,也很容易出错,所以我们把分区分成若干个片段。默认情况下,index
大小为10M
,每个片段log
包含1GB
或一周数据,以较小的那个为准。当前正在写入数据的片段叫做活跃片段,活跃片段永远不会被删除。
三、文件格式
我们把Kafka
的消息和偏移量保存在文件里。保存在磁盘上的数据格式与从生产者发送过来或者发送给消费者的消息格式是一样的。因为使用相同的消息格式进行磁盘存储和网络传输,Kafka
可以使用零复制技术给消费者发送消息,同时避免了对生产者已经压缩过的消息进行解压缩。除了键、值和偏移量外,消息里还包含了消息大小、校验和、消息格式版本号、压缩算法和时间戳。时间戳可以是生产者发送消息的时间,也可以是消息到达broker
的时间,这个是可配置的。如果生产者发送的是压缩过的消息,那么同一个批次的消息会被再压缩一次,被当做包装消息进行发送。下面是普通消息和包装消息图:
四、文件存储机制
【1】Broker
: 消息中间件处理结点,一个Kafka
节点就是一个Broker
,多个Broker
可以组成一个Kafka
集群。
【2】Topic