kafka基础原理

131 阅读4分钟

概念

术语

  • 消息(Message)

    消息是Kafka的最小数据单位,实质是一个字节数组

  • 批次(batch)

    一个或者多个相同主题和分区的消息,为了节约网络开销而生

  • 主题(topic)

    一组相同类型消息的组合,物理上则是由多个分区组成。多个分区无法保证主题内消息的顺序性,单个分区除外。

  • 分区(partition)

    kafka是通过分区来做水平扩展和高可用的,分区分布在不同的服务器上。每一个分区的消息都是有序的,可以看作顺序的消息队列。

  • 分区器(Partitioner)

    一个分区消息选择器,默认通过murmur2对消息的key进行hash计算,然后对总分区数进行取模运算。也可自定义分区器,只要实现Partitioner接口即可。

  • 分区Leader

    为了实现高可用,一个逻辑分区实质通常由多个物理分区组成,其中只有一个分区选举为leader,负责读写,其他作为follower

  • 分区Follower

    负责同步leader的数据,leader崩溃时,会被选举为新leader,从而实现高可用。

  • 生产者(producer)

    负责生产各个主题的消息,通过消息选择器分批次投递到指定分区。

  • 消费者(consumer)

    负责消费消息,可以订阅多个主题,同一主题下分批次顺序消费消息。

  • 消费者集群(consumer group)

    一个或者多个消费者订阅同一个主题,每个消息只会被一个消费者消息。整个集群作为整体消费同一主题的消息。

  • broker

    独立的kafka服务节点,负责接收并持久化生产者的消息。同时为消费者提供服务,返回其请求分区的持久化消息。

  • 分区副本(Partition Replica)

    分区Leader和Follower的总称,同一分区的副本不会在同一个broker上,Leader负责对外提供读写服务,follower负责同步数据。

  • Offset

    kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka

特性

  • 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
  • 高吞吐量:即使是非常普通的硬件kafka也可以支持每秒数十万的消息。
  • 支持同步和异步复制两种HA
  • Consumer客户端pull,随机读,利用sendfile系统调用,zero-copy ,批量拉数据
  • 消费状态保存在客户端
  • 消息存储顺序写
  • 数据迁移、扩容对用户透明
  • 支持Hadoop并行数据加载。
  • 支持online和offline的场景。
  • 持久化:通过将数据持久化到硬盘以及replication防止数据丢失。
  • scale out:无需停机即可扩展机器。
  • 定期删除机制,支持设定partitions的segment file保留时间。

目标

高吞吐

  • 持久化:直接顺序写入磁盘,无需内存。
  • 零拷贝:减少IO
  • 批量推送和拉取:减少网络开销
  • 数据压缩
  • 多分区并行处理
  • broker水平扩展

高可用

  • broker一主多从
  • 分区副本

文件机制

一条消息是如何写入到broker,又是如何读取的?

分析过程分为以下4个步骤:

  • topic中partition存储分布
  • partiton中文件存储方式
  • partiton中segment文件存储结构
  • 在partition中如何通过offset查找message

partition的存储分布

Kafka文件存储中,同一个topic下有多个不同partition,每个partition实际为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。

partition的存储格式

每个partion实际是被分割成多个大小不一的segment文件,这样做的好处是方便清理过期消息。

segment文件的存储格式

  • 物理组成:“offset.log”的数据文件和“offset.index”的索引文件组成。
  • 命名规则:offset为消息偏移量,方便快速找到segment文件。

索引文件存储多组元数据[messageid,物理偏移量],数据文件存储大量消息,messageid表示在该segment文件中的id,并不是全局id,物理偏移量则是在数据文件中的物理偏移量。 其中以索引文件中元数据3,497为例,依次在数据文件中表示第3个message(在全局partiton表示第368772个message)、以及该消息的物理偏移地址为497。

如何通过offset找到消息呢

  1. 通过offset二分查找到具体的.log索引文件,根据offset计算出对应的message ID
  2. 再顺序查找到数据文件message ID的消息