通过一个Kafka故障解决过程阐述架构师必须具备的架构思维

简介: 通过一个Kafka故障解决过程阐述架构师必须具备的架构思维

1、问题描述


某一天突然收到开发环境Kafka报 IO Exception(many open files),其相关的日志如下:

278ee807c4e6048c5119c4ab91cb8be5.png

5eeae27dcaa472aab2ff793280e98653.png

问题是发生在公司的开发环境,为了避免信息泄露,我在本地进行了模拟,不影响本次问题的分析与学习。


2、问题分析


bdf4586c5f4d6d4a5d83c95ede7a967d.png

首先我们要能看懂Kafka-manager上的一些监控指标,topic列表中关于topic的信息项如下所示:


  • topic
    topic名称
  • Partitions
    分区数
  • Brokers
    该topic 队列分布的broker数量。
    Brokers Spread %
    该topic中队列在Broker中的使用率,例如集群中有5个broker,但topic只在4个broker上创建了队列,那使用率为80%。
    Brokers Skew %
    topic的队列倾斜率。如果集群中存在5个broker节点,topic的总分区数量为4,副本因子为2,但这些队列只分布在其中的4台broker中。那topic的broker使用率(Broker Spread)为80%


众所周知,引入多节点的目的就是负载均衡,队列在broker中的分配自然是希望越均衡越好,期望每台broker上存储2个队列(副本因子为2,总共8个队列),表示没有发生倾斜,如果一台broker中的存在3个队列,而另外一个broker上1个队列,那说明发生了倾斜,计算公式为超过平均队列数的broker节点个数除以总所在Broker数量,其Brokers Skew等于(1/3)=33%。
Brokers Leader Skew %

topic分区中Leader分区的倾斜率。在Kafka中,只有分区的Leader节点具有读写权限,真正影响性能读写性能的是Leader分区是否均衡,试想一下,如果一个topic有6个分区,但所有的Leader分区只分布在一两个Broker节点上,这个topic的写入、读取性能将受到制约,这个值建议维持在0%


Replicas


副本数、副本因子,即一个分区数据存储的份数,该数值包含Leader分区。
Under Replicated %
没有跟上复制进度的副本比例,在Kafka的复制模型中,主分区负责读写,该复制组内的其他副本从主节点同步数据,如果跟不上主节点的复制进度,将被提出ISR,被剔除ISR的副本不具备选举Leader的资格,这个数据如果长期或频繁高于0,说明集群一定出现了问题


Producer Message/Sec

消息发送实时TPS,通过JMX采集,需要在kafka-manager中开启如下参数:
f8b7a5dffdeca6a4ae1e7fab3bad9d8f.png

  • Summed Recent Offsets
    该主题当前最大的消息偏移量。


经过对Topic列表观察,发现开发环境存在大量的topic都只有一个队列,并且都分布在第一节点上,其截图如下:

7bac8f719ac6dcedfb348da7b8bdb733.png

从界面上对应的指标:Brokers Spread即Broker的利用率只有3分之一,抽取几个数据量大的主题,判断其路由信息,得知都分布在第一个Broker节点上,这样就导致其中一个节点大量出现文章开头部分提到的错误:Too many open files


3、解决方案


3.1 扩分区


问题定位出来了,由于Broker利用率不均匀,大量topic只创建了一个队列,并且还集中落到了第一个节点。


针对这种情况,首先想到的方案:扩分区。


3.1.1 通过Kafka-manager


Step1:在Kafka-manager的topic列表,点击具体的topic,进入详情页面,点击[add Partitions],如图所示:

12fef52a7b3f4afec0f101e26415ec88.png

Step2:点击增加分区,弹出如下框:

4f98276fa0d26792b0bfe821e4946aee.png

说明如下:


  • Partitions
    扩容后的总分区个数,并不是本次增加的分区个数。
  • Brokers
    分区需要分布的Broker,建议全选,充分利用整个集群的性能。


3.1.2 运维命令


可以通过Kafka提供的kafka-topics命令,修改topic的分区,具体参考如下:

46b9b90d5c29f9257633bc2141bcff07.png

温馨提示:对这些运维命令不熟悉没关系,基本都提供了--help


3.2 分区移动


由于存在大量的只有一个分区的topic,并且这些topic都分布到了第一个节点,是不是可以将某些topic的分区移动到其他节点呢?


接下来介绍一下分区移动如何操作。


3.2.1 kafka-manager


Step1:进入topic详情页面,点击[Generate Partition Assignments],如下图所示:

48a1ade79a145e218c9e70e206294b66.png

Step2:进入页面后,选择需要迁移到的brroker,还可以改变topic的副本因子,最后点击[Generate Partition Assignments],如下图所示:

e714ae036a8ba8a0cb6d5ce4b7bf018c.png

Step3:点击完成后,此时只是生成了分区迁移计划,并没有真正的执行,需要点击[Reassign Parttions]按钮。

a1392fe5ebf070a98a4969ad9fb24d6e.png


3.2.2 运维命令


Step1:首先我们需要准备需要执行迁移的topic信息,例如将如下信息保存在文件dw_test_kafka_040802-topics-to-move.json中。

{"topics":
    [
        {"topic":"dw_test_kafka_040802"}
    ],
    "version": 1
}

Step2:使用kafka提供的kafka-reassign-partitions.sh命令生成执行计划

d79954b1a0ff633aeaaeb1672ec3e8d0.png

上面的参数其实对照kafka-manager的图理解起来会更快,点出如下关键点:


  • --broker-list
    分区需要分布的broker。如果多个,使用双引号,例如 "0,1,2"。
  • --topics-to-move-json-file
    需要执行迁移的topic列表。
  • --generate
    表示生成执行计划(并不真正执行)


执行成功后会输出当前的分区分布计划与新的执行计划,通常我们可以先将当前的执行计划存储到一个备份目录中,将新生成的计划存储到一个文件中。


Step3:使用kafka提供的kafka-reassign-partitions.sh命令执行分区迁移计划

b5618def22dc205fcf507e5c0f4e74e2.png

其关键点如下:


  • --reassignment-json-file
    指定上一步骤生成的执行计划。


执行成功过后输出Successfully,重分区是一个非常复杂的过程,命令执行完成后,并不会真正执行完成,可以通过查询主题的详细信息来判断是否真正迁移成功。

430baea2fe259dff3b1d2239af8c92cb.png


4、进阶与架构思维


通过kafka-reassign-partitions.sh对分区进行迁移,会影响业务方的正常使用吗?即会影响消息的消费与发送吗?


作为一名架构师,特别是对中间件做变更时,考虑对业务的影响范围是必备的一步,直接影响到实施的复杂度。


我们需要对分区迁移的实现原理做进一步探究,本文暂不从源码角度详细剖析,只是举例阐述一下分区迁移的实现机制。


需求:一个TopicA的其中一个分区p0,分布在broker id为1,2,3上,目前要将其迁移到brokerId为4,5,6。


在介绍迁移过程之前,我们先定义三个变量:


  • OAR
    迁移前分区的分布情况。
  • RAR
    迁移后的分区分布情况
  • AR
    当前运行过程中的分区分布情况


结合上述例子,其整个迁移步骤如下:

image.png

从上面这个过程,只有在Leader选举期间会对消息发送、消息消费造成影响,但通过Zookeeper实现Leader选举可在秒级别响应,结合Kafka消息发送端的缓冲队列、重试机制,在理论上可以做到对业务无影响。


相关文章
|
1月前
|
消息中间件 缓存 架构师
关于 Kafka 高性能架构,这篇说得最全面,建议收藏!
Kafka 是一个高吞吐量、高性能的消息中间件,关于 Kafka 高性能背后的实现,是大厂面试高频问题。本篇全面详解 Kafka 高性能背后的实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
关于 Kafka 高性能架构,这篇说得最全面,建议收藏!
|
2月前
|
缓存 NoSQL Java
秒杀圣经:10Wqps秒杀,16大架构绝招,一文帮你秒变架构师 (2)
高并发下的秒杀系统设计是一个复杂的挑战,涉及多个关键技术点。40岁老架构师尼恩在其读者交流群中分享了16个关键架构要点,帮助解决高并发下的秒杀问题,如每秒上万次下单请求的处理、超卖问题的解决等。这些要点包括业务架构设计、流量控制、异步处理、缓存策略、限流熔断、分布式锁、消息队列、数据一致性、存储架构等多个方面。尼恩还提供了详细的实战案例和代码示例,帮助读者全面理解和掌握秒杀系统的架构设计。此外,他还分享了《尼恩Java面试宝典》等资源,帮助读者在面试中脱颖而出。如果你对高并发秒杀系统感兴趣,可以关注尼恩的技术自由圈,获取更多详细资料。
秒杀圣经:10Wqps秒杀,16大架构绝招,一文帮你秒变架构师 (2)
|
1月前
|
消息中间件 存储 负载均衡
【赵渝强老师】Kafka的体系架构
Kafka消息系统是一个分布式系统,包含生产者、消费者、Broker和ZooKeeper。生产者将消息发送到Broker,消费者从Broker中拉取消息并处理。主题按分区存储,每个分区有唯一的偏移量地址,确保消息顺序。Kafka支持负载均衡和容错。视频讲解和术语表进一步帮助理解。
|
2月前
|
缓存 NoSQL Java
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
高并发下,如何设计秒杀系统?这是一个高频面试题。40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试Shopee时遇到了这个问题,未能很好地回答,导致面试失败。为此,尼恩进行了系统化、体系化的梳理,帮助大家提升“技术肌肉”,让面试官刮目相看。秒杀系统设计涉及16个架构要点,涵盖业务架构、流量架构、异步架构、分层架构、缓存架构、库存扣减、MQ异步处理、限流、熔断、降级、存储架构等多个方面。掌握这些要点,可以有效应对高并发场景下的秒杀系统设计挑战。
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
|
2月前
|
消息中间件 NoSQL Kafka
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
73 5
|
2月前
|
消息中间件 存储 分布式计算
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
81 4
|
16天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
26天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
40 3
|
1月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
16天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
129 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
下一篇
DataWorks