基础架构

kafka是一个开源的分布式消息系统,具有高吞吐、低延迟、高容错、高并发等特点

avatar


Producer:消息的生产者

Cluster:集群,由多台broker组成

Broker:kafka的实例

Topic:消息的主题,信息在kafka上以Topic为分类进行存储,一个Broker上可以有多个Topic

Partition:Topic的分区,每个Partition的内容不同,起负载作用,提高吞吐量。具体表现为一个文件夹,下面又包含多个segment,segment下面又有index,log,timeindex等文件,log是存放文件的地方,另外两个是索引

Replication:同一个Partition在不同的Broker上存有副本,这些副本当中由一个leader和多个follower组成,当一个leader挂了,会从剩下的follower当中选出新的leader,副本不能存在于同一台机器

Consumer:消费者

Consumer group:由多个消费者组成的组,同一个partition只能被同一组中的一个消费者消费

生产模式

avatar

生产者产生数据后,只会发给leader,follower上的备份信息需要从leader机上pull。

1.生产者从集群获取leader信息
2.生产者把消息发送给leader
3.leader将消息写入磁盘
4.followers从leader获取数据
5.follower消息落盘并给leader发个ack
6.leader给producer发送ack

如果topic存在多个partition,那么按照以下情形选择写入的分区:
1.如有指定,则写入指定的分区
2.如无指定,但是设置了数据的key,则根据key的hash来选取
3.如果以上都没有,则轮询

ack应答机制:生产者在给kafka发送数据的时候,可以选择0,1,all三种参数
0:生产者发送数据后不需要等到集群返回
1:leader应答了就可以继续
all:所有都ack了才可以继续

如往不存在的topic发送数据,则kafka会自动创建topic,partition和replication默认都是1

avatar
partition是一个有序不可变的消息记录集合,当有新的消息会被写到partition的末尾,每个消息都有一个唯一的标识符offset。但是要注意在不同的partition之间卡夫卡不能保证消息的顺序
kafka可以设置一个保留期限,超过期限的数据将会被清除,或者也可以基于大小来限制

avatar
利用segment+offset来寻找数据:
先找到offset的368801message所在的segment文件(利用二分法查找),这里找到的就是在第二个segment文件。
打开找到的segment中的.index文件(也就是368796.index文件,该文件起始偏移量为368796+1,我们要查找的offset为368801的message在该index内的偏移量为368796+5=368801,所以这里要查找的相对offset为5)。由于该文件采用的是稀疏索引的方式存储着相对offset及对应message物理偏移量的关系,所以直接找相对offset为5的索引找不到,这里同样利用二分法查找相对offset小于或者等于指定的相对offset的索引条目中最大的那个相对offset,所以找到的是相对offset为4的这个索引。
根据找到的相对offset为4的索引确定message存储的物理偏移位置为256。打开数据文件,从位置为256的那个地方开始顺序扫描直到找到offset为368801的那条Message。

https://blog.csdn.net/wanghailan1818/article/details/125166287

标签: none

评论已关闭