一、 Kafka简介

1)什么是Kafka

  • 概念:
    1. 基于发布/订阅的分布式消息系统
    2. 由Linkedin开发,用Scala语言编写
  • 特性:
    1. 消息持久化: 采用时间复杂度O(1)的磁盘存储结构,即使TB级以上数据也能保证常数时间的访问速度
    2. 高吞吐: 即使在廉价的商用机器上,也能达到单机每秒10万条消息的传输
    3. 高容错: 多分区多副本
    4. 易扩展: 新增机器,集群无需停机,自动感知
    5. 同时支持离线、实时数据处理

2)应用场景

  1. 异步通信
    • 将消息放入Kafka,可以不立即处理
  2. 应用解耦
    • 在应用处理过程中插入一个隐含的、基于数据的接口层
  3. 峰值处理
    • 使关键应用能够顶住访问峰值,不会因超出负荷而崩溃

二、 Kafka原理

1)基本概念

  1. Broker(代理)
    • Kafka的一个实例或节点,一个或多个Broker组成一个Kafka集群
  2. Topic(主题)
    • Topic是Kafka中同一类数据的集合,相当于数据库中的表
    • Producer将同一类数据写入同一个Topic,Consumer从同一个Topic中读取同类数据
    • Topic是逻辑概念,用户只需指定Topic就可以生产或消费数据,不必关心数据存于何处
  3. Partition(分区)
    • 分区是一个有序的、不可修改的消息队列,分区内消息有序存储
    • 一个Topic可分为多个分区,相当于把一个数据集分成多份,分别存储不同的分区中
    • Parition是物理概念,每个分区对应一个文件夹,其中存储分区的数据和索引文件
  4. Replication(副本)
    • 一个分区可以设置多个副本,副本存储在不同的Broker中
  5. Producer(消息生产者)
    • 向Broker发布消息的客户端
  6. Consumer(消息消费者)
    • 从Broker消费消息的客户端
  7. Consumer Group(CG,消费者组)
    • 每个Consumer都隶属于一个特定的CG
    • 一条消息可以发送给多个不同的CG,但一个CG中只能有一个Consumer读取该消息
  8. Zookeeper
    • Kafka将元数据保存在Zookeeper中
    • 负责Kafka集群管理,包括配置管理、动态扩展、Broker负载均衡、Leader选举,以及 Consumer Group变化时的Rebalance等

2)工作机制

  • 消息在Broker中按照Topic(主题)进行分类,相当于为每个消息打个标签
  • 一个Topic可以划分为多个Partition(分区)
  • 每个Partition可以有多个Replication(副本)
  • 消息存储在Broker的某一Topic的某一Partition中,同时存在多个副本
  • Partition是一个FIFO队列,写入消息采用在队列尾部追加的方式,消费消息采用在队列头部顺序读取的方式
  • 一个Topic可分为多个Partitoin,仅保证同一分区内消息有序存储,不保证Topic整体(多个分区之间)有序
  • 为了加快读取速度,多个Consumer可划分为一个组(Consumer Group, CG),并行消费同一个Topic
  • 一个Topic可以被多个CG订阅,CG之间是平等的,即一个消息可同时被多个CG消费
  • 一个CG中可以有多个Consumer,同一个CG中的Consumer之间是竞争关系,即一个消息在一个CG中只能被一个Consumer消费

3)数据存储

  • 每个Partition副本都是一个目录,目录中包含若干Segment文件
  • Segment(段文件)
    1. Segment文件是Kafka的最小数据存储单元,一个Partition包含多个Segment文件
    2. Segment文件由以Message在Partition中的起始偏移量命名的数据文件(*.log)和索引文件(*.index、*.timeindex)组成
  • Offset(偏移量)
    1. Offset是用于定位分区中消息的顺序编号
    2. Offset用于在分区中唯一标识消息
    3. 使用Zookeeper维护Offset
  • Kafka索引
    1. 为了提高消息写入和查询速度,为每个Partition创建索引,索引文件存储在Partition文件夹下
    2. 偏移量索引
      • 文件以offset偏移量为名称,以index为后缀
      • 索引内容格式:offset,position
      • 采用稀疏存储方式
    3. 时间戳索引
      • 文件以timeindex为后缀
      • 索引内容格式:timestamp,offset
      • 采用稀疏存储方式

4)Kafka高可用

a. 多分区多副本

  • Kafka早期版本没有Replication概念,一旦某个Brocker宕机,其上的分区数据就可能丢失
  • 一个Topic可以有多个分区,每个分区可以有多个副本,副本存储在不同的Broker中
  • 从一个分区的多个副本中选举一个Partition Leader,由Leader负责读写,其他副本作为 Follower从Leader同步消息

b. 双层选举

  1. Kafka Controller Leader选举

    • 每个Broker启动时都会创建一个Kafka Controller进程
    • 通过Zookeeper,从Kafka集群中选举出一个Broker作为Kafka Controller Leader
    • Kafka Controller Leader负责管理Kafka集群的分区和副本状态,避免分区副本直接在Zookeeper上注册Watcher和竞争创建临时Znode,导致Zookeeper集群负载过重
  2. Kafka Partition Leader选举

    • Kafka Controller Leader负责Partition Leader的选举
    • ISR列表(In Sync Replica)
      • ISR是Zookeeper中的候选分区副本同步列表,负责保存候选分区副本(Partition Follower)的状态信息
      • Partition Leader负责跟踪和维护ISR
      • Partition Follower定期从Leader同步数据,若Follower心跳超时或消息落后太多,将被移除出ISR
    • Partition Leader挂掉后,Kafka Controller Leader从ISR中选择一个Follower作为新的Leader

三、 Kafka使用

参考资料:
[1]Kafka 工作机制