kafka 系列 -- 1、基本概念

374 阅读3分钟

前言

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

kafka 应用场景

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

基本概念

在说基本概念前,先看一下 kafka 的系统架构 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rzgHFqtU-1594494576370)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2828)]

  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 个副本 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lzYwnMLX-1594494576372)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2829)]

    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 的关系 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Q5TQ47b-1594494576374)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2831)] 图 3 - 图4: leader 副本、follower、HW、LEO 关系 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w7Hir518-1594494576376)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2834)] 消息写入之后,LEO 变成5,follower,会从 leader 中拉取消息,进行同步 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMl7hBuD-1594494576377)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2835)] 当 ISR 集合的副本都写入 3 后,HW 就会变成 4,表示 0-3 的消息为可消费 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-taPYNEOx-1594494576378)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2836)] 当 ISR 集合都写入 3 、4 之后,HW、LEO 值都变成 5 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UstzunLJ-1594494576379)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p2839)]

    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 不适合要求消息不能丢的场景。