与传统的mq(如rabbitmq)不同,kafka以文件模式存储和传输音讯,官网将其定义为事件流式解决平台,它人造具备分布式属性。

2.8版本前,kafka须要zk存储broker和consumer局部信息(留神:producer不依赖zk);2.8之后,kafka曾经不再依赖kafka。

然而生产环境目前(kafka 3.1版本)还是要应用zk。

抄一段官网文档:

It is now possible to run Apache Kafka without Apache ZooKeeper! We call this the Kafka Raft metadata mode, typically shortened to KRaft mode. KRaft is intended to be pronounced like craft (as in craftsmanship).
It is currently PREVIEW AND SHOULD NOT BE USED IN PRODUCTION, but it is available for testing in the Kafka 3.1 release.

根本构造

  • 生产者

没啥可说的,负责向broker推送音讯

  • broker

kafka的一个服务节点,多个broker形成kafka集群;broker个别部署在不同的物理机上

  • topic

同一类音讯放入同一个主题中,比方订单属于一个主题,领取属于另一个主题;但有一点须要留神,topic只是逻辑层面的概念,音讯实在存在于partition中

  • partition
| --topic1-0     --> 这个文件夹就是partition    | --00000000000000000000.index    | --00000000000000000000.log    | --00000000000000368769.index    | --00000000000000368769.log| --topic2-0| --topic2-1

能够看到partition的序号是从0开始的。

partition实际上是服务器磁盘上一个文件夹,同一个topic能够蕴含很多partition。减少partition可能无效的减少吞吐量,相似于nginx下减少tomcat可无效减少吞吐。

比方上图中topic1,有5个partition均匀分布在3台broker中。如果发送音讯时指定主题是topic1,此音讯会按肯定规定推送到某一个partition上。当然,发送时也能够指定

音讯在一个partition中是有序的,在多个partition中无奈保障有序。

  • segment

partition外部是两种文件,*.index*.log文件。

log文件寄存音讯,index文件寄存索引,它们是成对呈现的;雷同名字的一对log+index文件称之为一个segment,是kafka文件存储的最小单位。

segment是概念性的货色,没啥实际意义。
  • replication

partition的正本,作为数据备份不对外提供服务。replication和partion个别不在同一台broker上以减少容错,相似上图的散布。

  • consumer

消费者负责生产音讯,通过保护offset来确定音讯。
offset能够了解成一个指针,指向以后生产的音讯;同时offset也和partition相干,这个前面细说。

音讯被生产后offset会减少,但音讯自身仍然存在于partition中不被清理。partition音讯只会被定时清理,默认保留7天。

  • group

生产端有个group的概念,一个group下能够有一个consumer,也能够有多个consumer。

一条音讯只会发送到同一个group下的其中一个consumer

多个partition能够对应一个consumer(上图group2);然而一个paratition不能对应多个consumer,最多对应一个(上图group1)。
如果一个group中的consumer数量比partition数多,会呈现闲置的consumer(上图consumer3)

音讯存储

来看一下kafka音讯存储形式

| --topic1-0     --> 这个文件夹就是partition    | --00000000000000000000.index    | --00000000000000000000.log    | --00000000000000368769.index    | --00000000000000368769.log    | --00000000000000744271.index    | --00000000000000744271.log| --topic2-0| --topic2-1

音讯采纳程序写的形式写入.log文件中,当文件大小达到阈值,会生成新的log和index文件。

开始只有00000000000000000000.log,当文件大小达到500m(默认)会生成
00000000000000368769.log。368769这个数字,正是00000000000000000000.log文件中offset的最大值。

log采纳这样的命名形式有一个益处,如果查找offset=728378的音讯,能够很快锁定它所在的文件,肯定在00000000000000744271.log文件中。

再看index索引文件,kafka采纳稠密索引的形式——不为每条数据建设索引,索引是不间断的。(上图为第1、3、6、8、N条数据建设了索引,2、4、5就没有索引)

依据log文件的名字(00000000000000368769.log),很容易晓得第1条数据对应的offset是368769+1=368770。

咱们看一下这个partition中数据offset=368776的音讯的查找过程:

  1. 368769<368776<744271,因而定位到00000000000000368769.log文件
  2. 368776-368769=7,因而找文件中的第7条数据
  3. 去00000000000000368769.index中查找,7没在索引中,但6和8都有索引
  4. 依据索引<6,1407>的value,定位到00000000000000368769.log中物理偏移地址1407,定位到音讯Message368775;但这是第6条数据数据应该找它的下一条,找到了Message368776

附录

P6-P7常识合辑