万亿级洪峰下,RocketMQ 作者十年运维心路历程!
【CSDN 编者按】消息中间件 RocketMQ 从诞生至今,已经经历过无数核心场景的考验,不仅能应对高并发场景,还能稳定处理亿万级别的消息。然而,上云时代,对于许多行业使用者和企业而言,其在使用 RocketMQ 的运维管理时,仍然存在层层挑战。
本文中,开源软件 Apache RocketMQ 作者 & PMC Chair、 AutoMQ 联合创始人 & CEO 王小瑞基于十年运维经验,与团队重磅发布 RocketMQ Copilot。该工具以系统巡检、专家诊断和集群治理为核心功能,旨在协助开发者在系统故障之前提前发现问题,并在故障发生后迅速而准确地定位问题。
缘起
最近,我听到了有人用“皮实”来形容 RocketMQ,RocketMQ 一直给人简单、稳定和可靠的形象,其实稳定性的认可得来是最不容易的。
回想起来,2012 年是 RocketMQ 参与的第一次阿里双十一,成功处理了 10 亿级的消息量,算是小试牛刀,随后 RocketMQ 跟着阿里巴巴的电商业务逐渐从百亿、千亿、五千亿,直到 2016 年双十一当天,RocketMQ 零问题支撑了万亿级的消息量。
这四年,RocketMQ 积累了大量的稳定性经验,RocketMQ 团队从来不吝啬将这些经验开源到社区,所以今天如果大家仔细挖掘,可以在 RocketMQ 零散的代码片段里找到很多稳定性细节,比如客户端里面的小黑屋机制;Broker 侧的请求快速失败;os.sh 对内存、磁盘调度器、文件句柄等的调整;服务端时不时就有一类 RPC 请求拥有了自己的独立线程池。这些冰冷的代码变更背后,可能是 RocketMQ 团队背下的一个又一个的故障。
上云之路
时间来到了上云的时刻,技术人终于有一天能把技术变成产品,能直接给公司的营收做出贡献,RocketMQ 开始为云上数万的企业客户提供全托管的服务。相比较支撑阿里的双十一业务,我们开始意识到,即使在内部做到了万亿级的规模,实际上 RocketMQ 的客户也只有阿里巴巴这一个。彼时在云上,不同的客户、不同的业务规模、不同的流量模型,加上彼时还并不怎么成熟的云,给我们带来了全新的挑战。
RocketMQ 上云后不久,就出了一次令我印象深刻的故障,出问题的时候我正挤在公交车上,有客户反馈消费出现了延迟,这个看似简单的问题排查起来并不那么容易:
我们无法快速确认这是一个局部问题,还是一个全局问题。
集群也并没有突发的流量。
高效云盘的 Util 指标总是经常 100%,这到底是常态还是问题我们也无从判断。
队列的索引分发也是及时的。
...
最终,我们怀疑是不是因为有消费者在冷读,消耗了高效云盘为数不多的 IOPS,导致大量的消费者在排队拉取消息。在运维工具比较缺乏的阶段,要验证这个猜想也并不容易,最终我现场写了一行获取拉取消息延迟 Top 5 的消费者组的命令:
Bash
grep GROUP_GET_LATENCY stats.log | grep "In One Minute" | sort -nk14 | tail -n 5
该命令验证了我们的猜想,确实有消费者组在冷读,很高的拉取耗时消耗了大部分的线程,导致其他消费者组出现了饥饿。
这条命令,随着我写过很多类似的命令和脚本,在团队流行了很长一段时间,以年为单位的时间,这是一个有趣的现象,其背后的原因是因为很多团队对运维工具化和自动化的投入严重不足,运维人员靠着口口相传的经验与教训,苦苦支撑着关乎公司业务命脉的核心消息集群。这其中的辛苦与压力,我非常能感同身受。
到今天,我一直在思考一个问题,我们运维过全球最大的 RocketMQ 集群,服务过数万的 RocketMQ 企业客户,我们对每一行的代码,不仅仅是代码,甚至是这行代码在不同环境下的不同表现都清清楚楚,我们能否把这些经验,把曾经凌晨处理过的故障,把不分昼夜的报警电话,以及烂熟于心的日志,都通过代码的形式沉淀下来,能够帮助 RocketMQ 的运维团队,高效、轻松地运维好 RocketMQ 集群,给业务提供高质量的 RocketMQ 服务。
所以,RocketMQ Copilot 来了。
RocketMQ Copilot 来了!
RocketMQ Copilot 是我们团队倾心打造的一款面向 Apache RocketMQ 的智能辅助运维系统,其核心理念是将团队十多年 RocketMQ 集群的生产实战经验以产品化形式呈现,在辅助广大企业开发者运维管理自建集群的同时,也能方便掌握 RocketMQ 集群运维的最佳实践。
目前 RocketMQ Copilot 主要包含系统巡检、专家诊断和集群治理三块功能。我们希望 RocketMQ 曾经出过的故障不再被更多开发者重复去踩坑,能在系统出现故障之前就能提前发现,提前治理,防患于未然。出现故障后,也能快速精准定位问题。即使对源码不熟悉,也能有足够信心敢于在生产系统上部署。
系统巡检
系统巡检主要用来解决一个问题:集群到底正不正常?这个问题其实很难回答,因为集群的状态是动态、流量的变化,集群的健康状态也会发生变化,我们在处理了数千个生产问题后,终于灵魂拷问了自己一把:我们到底能不能先于用户发现问题?
这个问题的答案便是「系统巡检」这一功能模块。我们规划了上百个系统巡检项,目前 RocketMQ Copilot 已经实现了 40+,涵盖:
内核参数巡检,确保 RocketMQ 运行的内核环境是处于最佳配置的状态。
集群参数巡检,RocketMQ 有数百个配置项,要充分掌握每一个配置项其实相当有难度,Copilot 会根据集群的情况,动态确保每一个参数项在当前负载下是属于最佳配置。
消费者组巡检,检查每一个客户端配置是否正确,比如最常见的订阅关系是否一致,让大家能发现你的客户,是否正在以推荐的实践使用 RocketMQ。
Topic 级巡检,比如 Topic 的路由是否是一致的,是否出现了热点分区等。
其实,这每一个巡检项,背后都有一个或多个的生产故事(不一定是事故),如果大家愿意听,我们后面会出一个 RocketMQ Copilot 运维手册,会讲一讲背后的故事。
专家诊断
有了 RocketMQ Copilot 实时对 RocketMQ 集群做着体检,我们终于对 RocketMQ 集群的健康状况做到“心里有数”了。但 RocketMQ 作为业界首选的业务消息中间件,是微服务架构的核心异步组件,所以我们接触到了大量来自客户的问题,面对这些问题我们一方面要快速“自证清白”,又要能尽最大的努力帮助客户定位到问题的根因。
过去总是困扰我们的一个大的问题是客户反馈消息未消费,这到底是客户自身的问题,还是 RocketMQ 丢了消息?RocketMQ 保证至少投递一次的语义需要确保消息绝对不能丢失,被这类问题虐了千百遍后,我们终于整理出来了「消息未消费」问题的排查路径,如下图所示,数十个排查分支,可见排查这类问题的门槛有多高。
今天,我们将在云上运营 RocketMQ 丰富的问题诊断经验,都做成了 RocketMQ Copilot 专家诊断模板,帮助 RocketMQ 运维团队快速“自证清白”,同时给业务方最大程度的帮助,与业务双赢。
集群治理(SLI/SLO)
系统巡检和专家诊断两大利器主要手段是自检,也就是从内部看,从我们的经验来看往往有漏网之鱼。站在用户视角,以模拟真实用户的方式探测、度量、可视化整个集群的稳定性指标,是最后一道“先于用户发现问题”的防线。
通过 RocketMQ Copilot 内置的一系列端到端 SLI,结合自定义 SLO 的能力,我们可以快速以数字化的方式衡量集群的服务质量,同时能配置成精准的报警项,极大程度上消除无效报警和报警噪音。
结束语
感谢你阅读这篇文章,我们希望你能了解到 RocketMQ Copilot 的强大功能,它是我们团队倾注了心血和智慧的结晶,是我们对运维从业者感同身受的产物。RocketMQ Copilot 不仅能让你的 RocketMQ 集群更加稳定、高效和可靠,还能让你的运维工作更加轻松愉快。
RocketMQ Copilot 目前已经完成了第一个版本的开发,更多规划的能力即将发布。同时,该产品对于个人开发者永久免费,欢迎大家前往 AutoMQ 官网(https://play.automq.com)试用这款匠心之作,感受 RocketMQ Copilot 给你带来的不一样的运维体验。我们期待你的反馈和建议,让我们一起让 RocketMQ 更加美好!
作者介绍:王小瑞,开源软件 Apache RocketMQ 作者 & PMC Chair、 AutoMQ 联合创始人 & CEO
在 12 月 3 日 19:00 ~ 21:00,第二期 「RocketMQ 运维经验圆桌交流」将于线上举行,本次会议邀请了国内最有经验的 RocketMQ 专家,与大家一起畅聊 RocketMQ 的故事。