MST

星途 面试题库

面试题:消息队列 Kafka 集群缩容时,如何保证数据一致性和可用性?

当要对 Kafka 集群进行缩容,移除部分节点时,详细说明你将如何通过调整副本策略、数据迁移等手段,保证数据的一致性,同时确保业务对 Kafka 集群的读写操作在缩容过程中尽量不受影响,维持高可用性。
30.7万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试
  1. 规划与准备
    • 评估节点:确认要移除的节点,分析这些节点上的分区分布以及副本分配情况。可以通过 kafka-topics.sh --describe --zookeeper <zookeeper_host:port> 命令查看每个主题的分区和副本信息。
    • 增加监控:在缩容前,增加对 Kafka 集群的监控指标,如分区滞后情况(consumer lag)、网络流量、磁盘 I/O 等。可以使用工具如 Prometheus + Grafana 来实时监控。
  2. 调整副本策略
    • 重新分配副本:使用 Kafka 自带的 kafka-reassign-partitions.sh 工具。
      • 首先生成当前集群的副本分配方案:kafka-reassign-partitions.sh --zookeeper <zookeeper_host:port> --generate --topics-to-move-json-file <topics.json> --broker-list <brokers_to_remove>。其中 <topics.json> 是包含要处理主题列表的 JSON 文件,<brokers_to_remove> 是要移除的节点列表。
      • 然后根据生成的方案,执行重新分配副本的操作:kafka-reassign-partitions.sh --zookeeper <zookeeper_host:port> --execute --reassignment-json-file <reassignment.json>,这里 <reassignment.json> 是上一步生成的重新分配副本的 JSON 文件。
    • 等待副本同步:密切监控副本同步进度,可以通过 kafka-topics.sh --describe --zookeeper <zookeeper_host:port> 查看每个分区的 ISR(In - Sync Replicas)列表和副本状态。确保所有副本都处于同步状态,即 LEO(Log End Offset)和 HW(High Watermark)一致。
  3. 数据迁移
    • 数据均衡:在重新分配副本后,Kafka 会自动在节点间迁移数据以平衡负载。但是如果数据量较大,可能需要一些辅助手段。例如,可以通过调整 replica.lag.time.max.msreplica.lag.max.messages 等参数来控制副本同步的速度和滞后情况。
    • 控制流量:为了减少数据迁移对业务读写的影响,可以适当降低业务写入速率。例如,在应用层通过限流(如使用令牌桶算法)来控制发送到 Kafka 的消息量。同时,对于读操作,可以引导消费者从其他正常节点读取数据,减少对正在进行数据迁移节点的读压力。
  4. 移除节点
    • 停止 Kafka 服务:在确认副本已重新分配且数据同步完成后,停止要移除节点上的 Kafka 服务。
    • 更新配置:从集群配置中移除该节点的相关配置,如在 Zookeeper 中删除该节点的注册信息(如果使用 Zookeeper 管理集群)。
  5. 验证与恢复
    • 验证数据一致性:缩容完成后,再次检查所有分区的副本状态和数据一致性。可以通过消费数据并验证其完整性,也可以使用一些 Kafka 数据验证工具(如 kafka-consumer-groups.sh 检查消费偏移量是否正常)。
    • 恢复业务流量:逐步恢复业务对 Kafka 集群的读写流量到正常水平,并持续监控集群的性能和稳定性,确保缩容没有对业务造成长期影响。