Kafka消息队列 | 青训营笔记

107 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

消息队列

消息队列在各个领域扮演的角色

消息队列的应用场景

  1. MQ消息通道(类比Queue的概念)
    • 异步解耦
    • 削峰填谷(消息可暂时缓存)
    • 高可用(大模块解耦为小模块)
    • 发布订阅(topic订阅)
  2. EventBridge事件总线
    • 事件源:将云服务、自定义应用、SaaS应用等应用程序产生的事件消息发布到事件集
    • 事件集:存储接收到的事件消息,根据事件规则路由到事件目标
    • 事件目标:消费事件消息(云函数,MQ,Kafka,更多触发)
  3. Data Platform 数据流平台
    1. 提供批流数据处理能力
    2. 各类组件提供各类Connect
    3. 提供Streaming/Function能力
    4. 提供数据schema灵活的进行数据预处理

主流消息队列

  • RabbitMQ(Erlang,主从)
  • RocketMQ(java,主从)
  • Kafka(java/Scala,分布式)
  • Pulsar(java,分布式)

由于大数据的兴起,大数据生态组件都是由java开发,消息队列往往配合其他大数据组件使用,所以后面较新的消息队列都由java或scala开发

kafka详解

Kafka官网:kafka.apache.org/

Kafka 架构介绍

架构图:

Kafka架构图.png

Zookeeper

存储Kafka的一些元数据

  1. Broker Meta信息(临时节点)
  2. Controller 信息(临时节点)
  3. Topic 信息(持久节点)
  4. Config信息(持久节点)

zk的选举机制:Paxos机制

提供一致性:写入(强一致性);读取(会话一致性)

可用性:一半以上节点存活即可读写

功能:watch机制和持久/临时节点能力

Broker

kafka集群中包含的服务器,使用NIO模型

  • 若干个Broker系欸但组成Kafka集群
  • 作为消息接收模块,使用React网络模型进行消息数据的接收
  • 作为消息持久化模块,进行消息的副本复制以及持久化
  • 作为高可用模块,通过副本间的Failover进行高可用保证

Controller

特殊的broker

Broker启动尝试去zk中注册controller节点; 抢锁,抢到锁的为controller节点; 其余broker会watch controller节点,节点出现异常则重新进行注册

作用:

  • 副本Failover切换
  • Topic 创建/删除时,负责Topic信息广播
  • 集群扩缩容时,进行状态控制
  • Partition/Replica状态机维护

Coordinator

  • 负责topic-partition与consumer的负载均衡
  • 灵活调整分配策略

aa.png

Kafka 高可用

可用性定义:服务的正常运行时间

副本ISR机制

  • AR 已经分配的所有副本
  • OSR 很久没有同步数据的副本
  • ISR 一直在同步数据的副本,可作为热备切换

对于由三台broker组成的集群,一个leader,两个follower

  1. leader和follower统称为Replica
  2. leader+follower+follower = AR
  3. 正在进行数据同步的follower+leader = ISR
  4. 如果某个follower由于故障没有进行数据同步则为OSR

写入Ack机制

  • Ack=1
    • leader 副本写入成功,则Producer认为写入成功
  • Ack=0
    • OneWay模式
    • Producer发送即为成功
  • Ack=-1
    • ISR 所有副本写入成功,则Producer认为写入成功

副本同步

两个概念:

  1. LEO:日志最末尾的数据
  2. HW:ISR中最小的LEO作为HW,HW的消息为Comsumer可见的消息

所以消费者只能消费HW也就是所有ISR中都已经同步的数据

副本选举

  • Clean选举 更注重数据一致性
  • Unclean选举 做出数据可用性和一致性的权衡

Kafka 集群扩缩容

为什么扩缩容?

  1. partition在各个broker之间的分布是均匀的
  2. 同一个partition的replica不会分布在一台broker上
  3. broker之间的replica的数据是均匀的

扩容步骤

  1. 扩容broker节点
  2. 计算均衡的Replica分布拓扑
  3. controller负责新的副本分布元数据广播
  4. broker负责新副本的数据同步

缩容和扩容大同小异

扩缩容问题

  • 时间长
  • 扩缩容期间集群不稳定
  • 扩缩容期间无法执行其他运维操作

Kafka 未来演进之路

  1. 去除zk的依赖
  2. 使用kRaft作为元数据和数据存储介质
  3. 存储计算分离演进

Kafka 运维/调优经验介绍

  1. 单机吞吐
  2. 参数配置
  3. 扩缩容优化
  4. 指标可视化

总结

本次课程介绍了大数据组件消息队列kafka,深入探讨了Kafka的基础架构,介绍了kafka的关于副本的一些重要机制,例如副本ISR机制、写入Ack机制、副本同步;有利于开发人员对kafka的底层原理的理解,也有助于后续kafka开发的学习。后续会进行另外一个消息队列Pulsar的课程笔记总结,关于kafka的运维调优可以参考官网和网上博客。