kafka基本概念
- Producer 生产者:负责将消息发送到 Broker
- Consumer 消费者:从 Broker 接收消息
- Consumer Group 消费者组:由多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者组之间互不影响
- Broker:可以看做一个独立的 Kafka 服务节点或 Kafka 服务实例
- Topic:一个逻辑上的概念,包含很多 partition,同一个 topic 下的 partition 的消息内容是不相同的
- Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker 上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列
- Replica 副本:同一分区的不同副本保存的是相同的消息。为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 Kafka 仍然能够继续工作,Kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower
kafka架构图
如何确定当前能读到哪一条消息?
分区相当于一个日志文件,我们需要知道几个概念
- offset (消息偏移量)分别是 0~6
- 0 代表这个日志文件的开始
- HW(High Watermark)为 4。0~3 代表这个日志文件可以消费的区间,消费者只能消费到这 4 条消息
- LEO 代表即将要写入消息的偏移量 offset
分区 ISR 集合中的每个副本都会维护自己的 LEO,而 ISR 集合中最小的 LEO 即为分区的 HW
如上图所示,3 个分区副本都是 ISR 集合当中的。最小的 LEO 为 3,就代表分区的 HW 为3,所以,当前分区只能消费到 0~2 之间的 3 条数据
生产者发送消息有哪些模式?
- 发后即忘
- 同步
- 异步
发送消息的分区策略有哪些?
- 轮询
- key指定
- 自定义策略
- 指定 Partiton 发送
Kafka 支持读写分离吗,为什么?
读写分离有两个缺点
- 数据不一致的问题
- 延时问题
kafka不支持读写分离
Kafka 如何实现负载均衡?
- kafka 独特的架构方式可以通过主写主读来实现负载均衡
Kafka 的可靠性是怎么保证的?
- acks
- acks = 1,默认为1。生产者发送消息,只要 leader 副本成功写入消息,就代表成功
- acks = 0。生产者发送消息后直接算写入成功,不需要等待响应
- acks = -1 或 acks = all。生产者发送消息后,需要等待 ISR 中的所有副本都成功写入消息后才能收到服务端的响应
- 我们可以通过同步或者异步获取响应结果,失败做重试来保证消息的可靠性.
- 手动提交位移
- 通过副本LEO来确定分区HW
kafka为什么会重复消费消息?
- 在kafka提交offset的时候,可能由网络延迟或者某些原因导致offset没有同步,导致其他consumer消费了已经消费的消息.
如何保证kafka消息被顺序消费
- 如果消息需要被顺序消费,就需要将这类消息指定发送到一个partition中.
副本 leader 是怎么选举的
- 优先副本选举:优先副本就是说在 AR 集合中的第一个副本
如何增强消费者的消费能力?
- 可以考虑增加 topic 的分区数,并且同时提升消费组的消费者数量,消费者数=分区数
- 如果是消费者消费不及时,可以采用多线程的方式进行消费,并且优化业务方法流程
Kafka 控制器是什么,有什么作用?
> 在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器,它负责管理整个集群中所有分区和副本的状态,Kafka 集群中只能有一个控制器
- 当某个分区的 leader 副本出现故障时,由控制器负责为该分区选举新的 leader 副本;
- 当检测到某个分区的 ISR 集合发生变化时,由控制器负责通知所有 broker 更新其元数据信息
- 当为某个 topic 增加分区数量时,由控制器负责分区的重新分配。
Kafka 为什么这么快?
- 顺序读写
- Page Cache
- 零拷贝
- 分区分段+索引
- 批量读写
- 批量压缩
什么情况下 kafka 会丢失消息?
Kafka 有三次消息传递的过程:生产者发消息给 Broker,Broker 同步消息和持久化消息,Broker 将消息传递给消费者。
这其中每一步都有可能丢失消息
-
生产者发送数据
- 当 acks 为 0,只要服务端写消息时出现任何问题,都会导致消息丢失
- 当 acks 配置为 1 时,生产者发送消息,只要 leader 副本成功写入消息,就代表成功。这种方案的问题在于,当返回成功后,如果 leader 副本和 follower 副本还没有来得及同步,leader 就崩溃了,那么在选举后新的 leader 就没有这条消息,也就丢失了
-
Broker 存储数据
- kafka 通过 Page Cache 将数据写入磁盘,Page Cache 就是当往磁盘文件写入的时候,系统会先将数据流写入缓存中,但是什么时候将缓存的数据写入文件中是由操作系统自行决定。所以如果此时机器突然挂了,也是会丢失消息的
-
消费者消费数据
- 在开启自动提交 offset 时,只要消费者消费到消息,那么就会自动提交偏移量,如果业务还没有来得及处理,那么消息就会丢失。
Kafka的哪些场景中使用了零拷贝
- 基于mmap的索引
- 日志文件读写所用的TransportLayer