前言
思考的过程往往比直接得到结论更加重要
kafka 应用场景
- 应用监控
- 网站用户行为追踪
- 流数据
- 持久性日志
基本概念
在说基本概念前,先看一下 kafka 的系统架构
- Broker
一般而言,一台机器就是一个 broker,当然 1 台机器上可以部署多个 broker - Producer
消息的生产者 - Consumer
消息的消费者 - Consumer Group
消费者组,组内可以有多个消费者,共享同一个 groupid。消费组内的消费者,一般情况下为同一个消费者部署多个实例。 - Topic
topic 在 kafka 中是一个逻辑上的概念,用于将 partition 分类。1 个 topic 有多个 partition。生产者将消息发送到指定的 topic 中,消费者从指定的 topic 进行消费。 - partition
一个可追加的日志存储文件。kafka 的分区可以分布在不同的 broker 上 -
多副本机制
kafka 为 partition 引入了多副本机制,可以通过增加副本数量来提升容灾能力。同一分区中的不同副本保存相同的消息。副本之间一般是 一主多从。如下图,每个分区有 3 个副本- AR
集群中的副本,统称 AR(Assigned Replication),AR = ISR + OSR - ISR
与 leader 副本保持一定同步的副本,称为 ISR(in-sync-replication)。消息需先发送到 leader 副本,follower 才能从 leader 副本中拉取消息 - OSR
与 leader 副本同步滞后过多的副本,称为 OSR(out-sync-replication)。 - leader 副本
leader 副本负责维护 follower 副本的状态,当 ISR 副本中滞后 leader 副本过多,会被移除到 OSR 副本中。当 OSR 副本跟上了 leader 副本,会被移动到 ISR 副本。只有在 ISR 集合的副本,才有机会选举 leader - HW、LEO
HW(Hight Watermark)俗称高水位,标识一个特定的偏移量,消费者只能拉取该偏移量之前的消息
LEO(Low End Offset)日志最后偏移量。标识日志文件中待写入消息的偏移量 - 关系图
图 2: HW、LEO 的关系
图 3 - 图4: leader 副本、follower、HW、LEO 关系
消息写入之后,LEO 变成5,follower,会从 leader 中拉取消息,进行同步
当 ISR 集合的副本都写入 3 后,HW 就会变成 4,表示 0-3 的消息为可消费
当 ISR 集合都写入 3 、4 之后,HW、LEO 值都变成 5
- 总结
kafka 消息的写入,是可靠性和可用性的权衡。当 ISR 副本均写入消息时,不用等待 OSR 副本也写入消息。这里避免了 OSR 滞后太多,从而导致不可用性,且消息被写入到多个副本,也保证了消息的可靠性。
当 leader 写入完消息立即挂掉后,ISR 副本因未能同步到消息,从而导致消息丢失。
- AR
与 RocketMQ 区别
- partition 在 RocketMQ 中为 队列。消费模型也几乎一致,基于消费组进行消费
- RocketMQ 有自带的注册中心,无需 zookeeper。
- kafka partition 有多副本机制,RocketMQ 队列没有多副本机制
- kafka 多副本机制有丢消息问题,RocketMQ 则没有
- 从设计上来看,RocketMQ 与 kafka 的解决的应用场景不一样。RocketMQ 注重消息的可靠性,而 kafka 在这一方面比较弱,kafka 更注重系统吞吐量。因此 kafka 不适合要求消息不能丢的场景。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。