中间件学习——消息队列 Kafka | 豆包MarsCode AI刷题

119 阅读6分钟

背景介绍

消息队列的发展历程

image.png

业界消息队列对比

  • Kafka:分布式、分区的、多副本的日志提交服务,在高吞吐场景下发挥比较出色
  • RocketMQ:低延迟、强一致、高性能、万亿级容量和灵活的可拓展性,在一些实时场景中运用比较广
  • Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用存算分离的架构设计
  • BMQ:与 Pulsar 架构类似,存算分离,一开始的定时是承接高吞吐的离线业务场景,逐步替换掉对应的 Kafka 集群。

image.png

消息队列——kafka

使用场景

image.png

如何使用 Kafka

  • 创建集群
  • 新增 Topic
  • 编写生产者逻辑
  • 编写消费者逻辑

基本概念

  • Topic:逻辑队列,不同 topic 可以建立不同的 Topic
  • Cluster:物理集群,每个集群中可以建立多个不同的 Topic
  • Producer:生产者,负责将业务消息发送到 Topic 中
  • Consumer:消费者,负责消费 Topic 中的消息
  • Consumer Group:消费者组,不同组 Consumer 消费进度互不干涉

Offerset

image.png

Replica

image.png

数据复制

image.png

Kafka 架构

image.png

Broker 消息文件结构

image.png

Broker——磁盘结构

image.png

Broker——顺序写

image.png

Broker 如何找到消息

image.png

Broker 偏移量索引文件

image.png

image.png

Broker——传统数据拷贝

image.png

Broker——零拷贝

image.png

Consumer——消息接收端

image.png

Consumer-Low Level

image.png

Consumer——High Level

image.png

Consumer Rebalance

image.png

kafka-数据复制问题

image.png

kafka-重启操作

image.png

Kafka 替换、扩容、缩容

一、Kafka 替换流程

1. 规划新集群

  • 确定新 Kafka 集群的硬件资源,包括服务器数量、CPU、内存、存储等配置,确保新集群能够满足业务需求。
  • 配置新集群的网络,保证新集群与旧集群以及生产者和消费者之间能够进行通信。
  • 安装和配置新的 Kafka 软件版本,设置好相关参数,如 broker.id(每个 broker 需要有唯一的标识符)、zookeeper.connect(连接 Zookeeper 的地址)等。

2. 数据迁移

  • 对于有状态的数据(主题数据、偏移量等),需要进行迁移。如果数据量较小,可以使用 Kafka 自带的工具(如 kafka - console - consumer 和 kafka - console - producer)将旧集群主题中的数据导出并导入到新集群相应的主题中。
  • 如果数据量较大,可以考虑使用更高效的数据迁移工具,或者编写自定义脚本。例如,使用 MirrorMaker 工具,它可以在不同的 Kafka 集群之间进行数据复制。在迁移过程中,需要注意数据的一致性和完整性,确保没有数据丢失或损坏。

3. 切换生产者和消费者

  • 逐步将生产者的消息发送目标从旧集群切换到新集群。这可能需要修改生产者的配置文件,将 bootstrap.servers 属性指向新集群的 broker 地址。
  • 对于消费者,同样修改配置文件,将其指向新集群,并且根据迁移情况,正确设置消费者组的偏移量,以确保消费者能够从正确的位置开始消费消息。在切换过程中,需要密切监控生产者和消费者的状态,确保消息的正常发送和接收。

4. 验证和清理

  • 在切换完成后,对新集群进行全面验证,包括检查消息的发送和接收是否正常、消息的顺序是否正确、数据的完整性等。
  • 确认新集群稳定运行后,可以选择关闭旧集群,清理旧集群的数据和相关配置,释放资源。

二、Kafka 扩容流程

1. 硬件资源准备

  • 根据扩容需求,准备新增的服务器或虚拟机,确保其硬件配置(如 CPU、内存、磁盘空间等)符合 Kafka 集群的要求。
  • 将新节点加入到集群所在的网络环境中,确保新节点与现有节点之间能够相互通信。

2. 安装和配置 Kafka 软件

  • 在新节点上安装 Kafka 软件,安装步骤与现有节点相同。
  • 配置新节点的 broker.id,确保每个 broker 在集群中有唯一的标识符。同时,配置 zookeeper.connect 参数,使其能够连接到集群使用的 Zookeeper 服务器。

3. 集群配置更新

  • 对 Kafka 集群的配置文件进行更新,将新节点的信息添加到 broker 列表中。例如,在 server.properties 文件中的 broker.list 属性或者类似的配置项中添加新节点的地址和端口。
  • 根据需要,调整其他集群级别的参数,如副本分配策略(如果要重新平衡副本分布)等。

4. 数据同步和重新平衡

  • 新节点加入后,Kafka 会自动进行数据同步,将部分主题分区的副本分配到新节点上,以实现负载均衡。这个过程是由 Kafka 的控制器(Controller)自动管理的。
  • 可以通过 Kafka 提供的工具(如 kafka - reassign - partitions.sh)来手动触发分区重新分配,确保数据在集群中的合理分布。在重新分配过程中,需要注意监控集群的性能和数据一致性。

5. 性能测试和监控

  • 完成扩容后,对集群进行性能测试,检查消息的吞吐量、延迟等指标是否满足预期。
  • 持续监控集群的状态,包括各个节点的资源使用情况(CPU、内存、磁盘 I/O、网络 I/O)、主题分区的分布情况等,确保集群稳定运行。

三、Kafka 缩容流程

1. 数据迁移(可选)

  • 如果要删除的节点上存储有重要数据,并且希望将这些数据迁移到其他节点上,可以使用 Kafka 的分区重新分配工具(如 kafka - reassign - partitions.sh)将该节点上的分区副本迁移到其他节点。
  • 在迁移过程中,需要注意确保数据的完整性和一致性,并且监控迁移进度和集群状态。

2. 集群配置更新

  • 在缩容之前,修改 Kafka 集群的配置文件,将需要删除的节点从 broker 列表中移除。例如,从 server.properties 文件中的 broker.list 属性或者类似的配置项中删除要删除节点的地址和端口。
  • 根据需要,调整其他与集群拓扑相关的参数,如副本分配策略等。

3. 关闭节点

  • 停止要删除的 Kafka 节点上的 Kafka 服务。可以通过操作系统的服务管理工具或者直接执行 Kafka 的停止脚本(如 bin/kafka - server - stop.sh)来关闭服务。
  • 确认节点上的 Kafka 服务已完全停止后,可以选择将该节点从集群的网络环境中移除,释放硬件资源。

4. 重新平衡和监控

  • 在节点删除后,Kafka 集群会自动进行重新平衡,调整剩余节点上的分区副本分布。可以通过监控工具观察重新平衡的过程和集群的状态。
  • 持续监控集群的性能指标,如消息吞吐量、延迟等,确保缩容后集群能够稳定高效地运行。