前言

思考的过程往往比直接得到结论更加重要

kafka 应用场景

  1. 应用监控
  2. 网站用户行为追踪
  3. 流数据
  4. 持久性日志

基本概念

在说基本概念前,先看一下 kafka 的系统架构
image.png

  1. Broker
    一般而言,一台机器就是一个 broker,当然 1 台机器上可以部署多个 broker
  2. Producer
    消息的生产者
  3. Consumer
    消息的消费者
  4. Consumer Group
    消费者组,组内可以有多个消费者,共享同一个 groupid。消费组内的消费者,一般情况下为同一个消费者部署多个实例。
  5. Topic
    topic 在 kafka 中是一个逻辑上的概念,用于将 partition 分类。1 个 topic 有多个 partition。生产者将消息发送到指定的 topic 中,消费者从指定的 topic 进行消费。
  6. partition
    一个可追加的日志存储文件。kafka 的分区可以分布在不同的 broker 上
  7. 多副本机制
    kafka 为 partition 引入了多副本机制,可以通过增加副本数量来提升容灾能力。同一分区中的不同副本保存相同的消息。副本之间一般是 一主多从。如下图,每个分区有 3 个副本image.png

    1. AR
      集群中的副本,统称 AR(Assigned Replication),AR = ISR + OSR
    2. ISR
      与 leader 副本保持一定同步的副本,称为 ISR(in-sync-replication)。消息需先发送到 leader 副本,follower 才能从 leader 副本中拉取消息
    3. OSR
      与 leader 副本同步滞后过多的副本,称为 OSR(out-sync-replication)。
    4. leader 副本
      leader 副本负责维护 follower 副本的状态,当 ISR 副本中滞后 leader 副本过多,会被移除到 OSR 副本中。当 OSR 副本跟上了 leader 副本,会被移动到 ISR 副本。只有在 ISR 集合的副本,才有机会选举 leader
    5. HW、LEO
      HW(Hight Watermark)俗称高水位,标识一个特定的偏移量,消费者只能拉取该偏移量之前的消息
      LEO(Low End Offset)日志最后偏移量。标识日志文件中待写入消息的偏移量
    6. 关系图
      图 2: HW、LEO 的关系
      image.png
      图 3 - 图4: leader 副本、follower、HW、LEO 关系
      image.png
      消息写入之后,LEO 变成5,follower,会从 leader 中拉取消息,进行同步
      image.png
      当 ISR 集合的副本都写入 3 后,HW 就会变成 4,表示 0-3 的消息为可消费
      image.png
      当 ISR 集合都写入 3 、4 之后,HW、LEO 值都变成 5
      image.png
    7. 总结
      kafka 消息的写入,是可靠性和可用性的权衡。当 ISR 副本均写入消息时,不用等待 OSR 副本也写入消息。这里避免了 OSR 滞后太多,从而导致不可用性,且消息被写入到多个副本,也保证了消息的可靠性。
      当 leader 写入完消息立即挂掉后,ISR 副本因未能同步到消息,从而导致消息丢失。

与 RocketMQ 区别

  1. partition 在 RocketMQ 中为 队列。消费模型也几乎一致,基于消费组进行消费
  2. RocketMQ 有自带的注册中心,无需 zookeeper。
  3. kafka partition 有多副本机制,RocketMQ 队列没有多副本机制
  4. kafka 多副本机制有丢消息问题,RocketMQ 则没有
  5. 从设计上来看,RocketMQ 与 kafka 的解决的应用场景不一样。RocketMQ 注重消息的可靠性,而 kafka 在这一方面比较弱,kafka 更注重系统吞吐量。因此 kafka 不适合要求消息不能丢的场景。

心无私天地宽
513 声望22 粉丝