kafka是一个高性能的分布式流处理平台,使用java和scala编写,使用zk进行协调,具有高吞吐量、高可靠性、低延迟(实时)的特点。

 

Kafka中的基本概念

Broker、Topic、Partition

Broker:Kafka的服务端程序,可以认为一个broker就是一个mq节点。
 

Topic 主题

  • 一个虚拟概念,由1个或多个Partition组成(至少1个)
  • topic名称可以包含英文字母、阿拉伯数字、点号、连词线、下划线。

 

Partition 分区

  • partition是kafka数据存储的基本单元,是topic物理上的分组,一个topic中的消息分散在1个或多个partition中,这些partition往往分散在多个broker上。每个partition都是一个有序队列。
  • 可以在server.properties中设置一个topic默认的分区数(默认1),如果创建topic时未指定分区数,则使用kafka配置文件中设置的默认值。
  • service.properties中的log.dirs指定本地日志存储目录,topic中的数据会持久化到这个目录下,类似于redis的rdb、aof文件。partition以文件夹的形式存储在broker机器上,目录名格式为topicName-partitionName,分区名称从0开始,依次递增。
  • 删除topic时会先将本地对应的分区目录重命名,再删除该目录,整个过程有一些延迟。

 

Offset、LEO、HW

offset 偏移量

  • partition是有序队列,partition使用一个连续的序列号唯一标识此partition中一条消息,这个序列号就是offset,类似于数组的下标,可以标识消息在partition(队列)中的位置。
  • 每个consumer实例需要在ConsumerGroup中维护自己消费的Partition的Offset,记录已消费的消息的位置。
     

LEO:LogEndOffset

  • 每个partition的log文件中最后一条消息的位置(offset)。
     

HW:HighWatermark

  • partition中各个replicas同步到的消息位置(offset)。
  • 此位置及之前位置的消息已经同步到了各个副本,对消费者可见、可以被消费者消费;此位置之后的消息尚未同步到所有副本,对消费者不可见、不能被消费者消费。

 

Segment 分段

  • 一个partition对应一个分区目录,每个分区目录下包含.log文件、.index文件,.log文件保存此分区中的消息,.index文件是.log文件中消息的索引,可根据索引快速找到消息存储位置。
  • 如果一个partition中的消息都存储在一个.log文件中,文件会太大,.index中的索引也会很长,所以一个partition中的消息是拆分为多个segment(分段)进行存储。
  • 1个segment包含一个.log文件、一个.index文件,.log文件尺寸上限1g,达到上限后会新建新的.log文件、.index文件(即使用新的分段)进行存储。
  • partition的第一个segment的log文件名为全0,后续每个.log文件名为上一个.log文件的最后一条消息的offset+1,.index文件名和.log文件名一一对应。
     

kafka高效文件存储的设计特点

  • 将一个大parition拆分为多个较小的segment,方便定期清除已经消费完的文件,减少磁盘占用。
  • 通过索引可以快速定位消息位置。
  • producer产生的消息,是直接追加.log文件的末尾,顺序写入,比随机写入效率高得多。

 

Producer、Consumer、ConsumerGroup

Producer:生产者,创建消息,然后发布到MQ中

Consumer:消费者,消费队列中的消息
 

ConsumerGroup 消费者组

  • 由多个消费者组成,一般是同一个消费者的不同实例。
  • Partition中的消息,会被订阅了此topic的所有ConsumerGroup消费,但一个ConsumerGroup中只会有一个Consumer会消费此消息。
     

使用ConsumerGroup可以实现

  • 基于队列的模型:消费者都在同一消费者组里,每条消息只会被一个消费者处理。
  • 基于发布/订阅的模型:消费者属于不同的消费者组,消息可以广播到多个消费者组中被消费。

 

Replication 副本

  • 副本是Partition级别的概念,一个Partition可以有1个或多个副本,这些副本组成一个副本集Replications。
  • 一个副本集中有1个ReplicationLeader,其它副本都是ReplicationFollower。ReplicationLeader接收处理生产者、消费者的请求;ReplicationFollower从ReplicationLeader同步数据,只是作为备份。
  • sql、redis有大量的读请求,可以做读写分离;kafka一般都是写请求,没必要读写分离,所以以前ReplicationFollower只是数据备份,不对外提供读服务。kafka2.4以后提供了有限度的读写分离,ReplicationFollower也可以对外提供读服务。
  • 当ReplicationLeader所在的Broker挂掉后,会从ReplicationFollower中选出一个新的ReplicationLeader。
  • 可以在kafka配置文件中指定每个Partition的默认副本数量(默认1),如果创建topic时未指定每个Partition的副本梳理,则使用配置文件中的默认值。
  • kafka会把同一个Partition的副本分散在多个Broker上,以保证数据安全,副本数量要小于等于broker的数量,大于broker的数量会报错、也没有意义。

ReplicationManager:负责维护副本信息,副本状态切换。

 

kafka特点总结

  • 高吞吐量、低延迟: 每秒可以处理几十万条消息
  • 高并发:支持几千个客户端同时读写
  • 高可用性:多副本、多分区,只要有一个副本正常此Partition就可以工作。
  • 扩展性强:支持热扩展