Kafka基本概念
主题
将一组消息抽象归纳为一个主题(topic),一个主题是对消息的一个分类。生产者将消息发送到特定主题,消费者订阅主题或主题的某些分区进行消费
消息
kafka通信的基本单位,由一个固定长度的消息头和一个可变长度的消息体构成。Kafka消息格式经历3此变迁,分别为V0,V1,V2,目前大部分用户使用的仍是V1,完整格式如下所示:
分区
每个主题会被分成一个或多个分区(Partition)。每个分区由一系列有序、不可变的消息组成,是一个有序队列。
每个分区在物理上对应一个文件夹,分区的明明规则为:主题名称+’-’+分区编号(0,1,2,…)。
理论上,分区数越多吞吐量越高,分区是Kafka保证消息被顺序消费以及对消息进行负载均衡的基础。但Kafka只能保证一个分区之内消息的有序性,并不能保证跨分区消息的有序性。
Kafka的高吞吐率保障是每条消息被追加到相应的分区时,是顺序写磁盘。另外Kafka不会立即删除已被消费的消息,基于消息已存储的时间长度或分区的大小来清除老数据。
副本
每个分区又有一到多个副本(Replica),分区的副本分布在集群的不同机器,以提高可用性。从存储角度看,分区的每个副本在逻辑上抽象为一个日志(Log)对象。Kafka保证同一个partition的多个replica一定不会分散在同一台broker上。
Kafka需要保证分区中不同副本的数据一致性,因而会选出一个Leader副本,而分区的其他副本即为Follower副本。只有Leader副本才负责处理客户端读/写请求,Follower副本从Leader副本同步数据。
偏移量
任何发布到分区的消息会被直接追加到日志文件的尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移量,他不表示消息在磁盘上的无力位置,只是一个分区下严格有序的逻辑值。
Kafka几乎不支持随机读写,因而没有提供额外索引机制。消费者可以通过控制消息偏移量来对消息进行消费,如消费者可以指定消费的起始偏移量,为了保证消息被顺序消费,消费者已消费的消息对应的偏移量也需要保存。
日志段
一个日志又被划分为多个日志段(LogSegement),日志段是Kafka日志对象分片的最小单位。一个日志段对应磁盘上的一个具体日志文件和两个索引文件,日志文件以".log"为后缀,用于保存消息实际数据;两个索引文件分别以".index"和’.timeindex"为文件名后缀,分别表示消息偏移量索引文件和消息时间戳索引文件
broker和集群
一个Kafka集群有一个或多个Kafka实例构成,每个Kafka实例可以称为broker,每个broker有一个唯一的非负整数标志id,也称为brokerId。
生产者
生产者负责将消息发送给代理,也即为向Kafka代理发送消息的客户端
消费者和消费组
消费者以拉去方式拉去数据,在Kafka中每一个消费者属于一个特定消费组,我们可以为每个消费者指定一个消费组,以groupId代表消费组名称。如果不指定消费组,则归属默认消费组test-consumer-group。
Kafka会为每个消费者生成一个全局唯一的id,格式为 g r o