总体概念关系图
topic
- topic是生产者和消费者生产和消费的时候都必须制定的一个标识,一般用来标识某个业务
- 一个topic包含多个partition,分布在不同的broker上,这里broker可以简单理解成一个kafka的一个逻辑节点
- 创建topic的时候,可以指定topic的 partition 数量,以及副本数量,如下
/opt/cloudera/parcels/KAFKA-3.0.0-1.3.0.0.p0.40/lib/kafka/bin/kafka-topics.sh --create --zookeeper t0:2181 --replication-factor 2 --partitions 3 --topic first
这样就创建了一个叫做first的topic,它有3个partition,每个partition有2个副本
- 可以通过命令查看topic的详细信息
/opt/cloudera/parcels/KAFKA-3.0.0-1.3.0.0.p0.40/lib/kafka/bin/kafka-topics.sh --describe --zookeeper t0:2181 --topic first
其中leader/replicas/isr后面跟的数字都是配置文件中broker的id,代表不同broker
isr表示当前partition的leader挂掉了,选哪个broker上的partition作为leader的顺序
partition
- 就是topic数据的一部分,数据分到哪部分(哪个partition)默认是根据哈希值来分的
- partion的物理位置在配置文件里面配置log.dirs进行配置,cdh默认是/var/local/kafka/data/,
如下图,这个是我们broker id为139的机器的log.dirs目录,我们刚刚创建了first这个topic,这个topic的partition0和partition1都在139有副本,所以看到了firsrt-0和first-1这2个目录
我们进入first-0目录,就可以看到topic first的partition1的内容了
- 在上面topic的讲解中我们可以看出一个partition可以有多个副本,但真正读写的副本只有一个,这个副本叫做leader
segment
- 上图中的以.log结尾的文件就是segment
- segment是存储kafka中数据(在kafka中叫message消息)的文件,一个segment存储partition的一部分message
- segment的命令为 n.log,其中 n 是这个文件中第一条消息的offset-1
- segment会定期删除(配置项:配置项log.retention.{ms,minutes,hours}和log.retention.bytes)
- segment默认配置保留时间为7天
message
- kafka数据的基本单位,只能追加到segment,不能修改删除
- message的物理组成如下
offset
- 每个message的offset表示该消息是partition的第几条消息
- 知道message的offset,可以定位到该message的物理位置,比如知道某条消息offset是666,寻址到改消息过程如下:
- 首先确定消息是在哪个segment,比如partition目录有0.log、 250.log 、444.log、579.log、699.log、 716.log,那offset 位666的消息就小于666的最近的那个log,这里就是在579.log
- 定位到579.log后,再用消息的offset666减去文件名的579,666-579=87
- 查找对应的.index文件,这里因为是579.log,所以找的是579.index,该文件是579.log文件中 消息是segment中第几个消息(这里就是第2点中的计算结果87) 和 消息开始与文件第几个字节 这2个信息的对应关系
- 通过579.index查找出87对应的 消息开始与文件第几个字节 这个信息,然后跳到那个字节,即可定位到消息
- 在579.index中不一定能找到87,因为它只是稀疏索引,很多情况是找到87前面的某个存在的数字,定位到对应的物理位置,然后再继续往下找直到定位到87那个位置
其他概念
broker:可以简单理解成一个broker技术kafka的一个逻辑节点
zookeeper: 主要保存kafka的一些元数据信息
producer/consumer:生产者消费者一般消息队列都有就不细讲了