小红书消息中间件的运维实践与治理之路
简介:近年来,消息领域的全面云原生化逐渐走向深入,比如 RocketMQ 5.0 版本的存算分离设计和 raft 模式,再比如 Kafka3.0 引入了分层设计的方式(tiered storage)和 raft 模式,以及近年来新崛起的 Pulsar 也开始采用云原生架构,在未来都可以针对具体业务需求引入进行功能迭代,发挥组件的最大价值。
作者:张亿皓|小红书消息中间件负责人
一、消息队列业务场景与挑战
1、整体规模
下图展示了 RocketMQ 和 Kafka 的总体规模。其中峰值 TPS 的 8000w/s 一般出现在晚上下班以后的时间段,写入量达到50GB/s,每天新增2-3PB数据,节点数1200+个。
2、业务架构
虽然 RocketMQ 和 Kafka 的性能相似,但在使用场景上还是有所区别的。RocketMQ 丰富的业务特性更适用于在线业务场景,而 Kafka 的高吞吐性使其更偏向离线、近线业务。当然,在实际应用中也会有交叉使用的现象,有时在线业务也会使用 Kafka 解耦,有的流处理数据也会使用 RocketMQ 存储。
业务总体架构如下图所示,业务日志和APP用户行为打点类的内容会发给 Kafka,数据库增量日志、在线业务、线上数据交换等会发给 RocketMQ。Kafka 和 RocketMQ 中的数据会有一部分流入 flink 中构建实时数仓、离线数仓以及一些数据产品(如报表、监控,等),RocketMQ 中另一部分数据会用于在线业务APP异步解耦。
消息队列业务架构
3、稳定性挑战
a. 背景:
小红书整体收敛消息组件较晚,公司技术架构最大的目标是提升系统稳定性;
b. 挑战:
现存消息组件使用量极大,但没有稳定性保障;同时面临人手紧缺、时间紧,对MQ原理了解不深入的困境;
c. 策略:
先做监控,增强集群的可观测能力是了解其健康状况的最高效手段。
4、稳定性治理
除了监控告警,我们在稳定性治理方面还做了以下改造工作:
a. 引擎:资源隔离,新增监控打点等;
b. 平台:工单审核,权限管控,业务追溯;
c. 治理:针对集群可视化能力和集群可运维能力的建设;
二、消息队列治理实践
1、集群可视化:监控metrics
下图是基于 Prometheus Grafana 构建的消息中间件体系架构。
消息中间件监控体系架构图
图中包含三个监控维度:硬件维度、服务维度和业务维度,累计收集监控指标150+项。
那么如何定义这三个维度的监控指标呢?
a. 硬件维度:主要包括网络带宽、CPU使用率、磁盘容量/IO、TCP丢包/延迟等资源指标;
b. 服务维度:主要指运行状况的指标,如:宕机监控、JVM指标、读写时延、请求队列等;
c. 业务维度:即面向用户的指标,这是客户比较关心的指标,如:消费延迟/积压、QPS、Topic吞吐量、Offset等;
由于公司内部规定一个节点只能使用一个端口给Prometheus,而各项监控指标大多是分开收集,于是设计了指标聚合服务 MAS 将所有指标汇集在一起,同时又增加了一些元信息帮助进一步排查问题。这里 MAS 相当于metric 的一个代理层,可以根据业务的实际情况来添加。
2、告警处理
下图列举了一些发生在监控体系刚建立时候的告警信息,当时每天的告警信息约有600-700条之多,告警的问题也是各式各样,根本无法处理,造成监控系统形同虚设。
鉴于以上情况,我们提出监控的核心原则要宁缺毋滥,不要淹没在告警海中,告警太多和没有告警没什么区别。根据这一原则制定了一系列应对策略:
- 初期:关闭低优告警,以确保每一条高优告警能得到及时发现和处理;
- 中期:随着高优告警的减少,逐步打开之前屏蔽的告警,进一步处理,实现告警数量逐步减少;
- 后期:打开全部告警,确保日常告警每一条都能及时发现和处理。
根据我们的经验,到后期基本不会有“服务不可用”这类的告警,大部分告警属于预警,如果预警能及时介入处理,就可以确保在问题进一步扩大之前解决。
告警处理阶段性策略
3、集群可视化:metric设计与优化
RocketMQ 的服务、业务指标监控,基于开源 RocketMQ-exporter 进行改造,解决 metrics 泄漏、部分指标采集偏差等问题。
这里着重介绍两个比较重要的改造:
a. lag监控优化
- 问题一:consumer metric 泄露,exporter 运行几天指标量就可达到 300w+,curl 一次接口花费时间 25s,log文本有600MB;
原因:如下图所示,每接入新的客户端,端口值就会增加,由于exporter实现中没能将离线客户端指标值及时清理造成客户端端口持续增加导致系统告警。
改造:在exporter中加入metric expire模块;
结果:curl一次接口花费的时间降到2s;
- 问题二:lag指标不准,造成线上误告警
原因:export只提供group维度的 rocketmq_group_diff,没有 broker 维度的,要额外计算;
改造:在 broker 中加入计算逻辑,先将 lag 计算好;
结果:可以从下图中看到,消息积压值从 6K 的抖动恢复成平稳值;
b. 分位线/滑动窗优化
- 问题一:线上时常会遇到 broker busy 的问题,需要对发生的时间点进行监控。虽然 exporter自带 send pool 等指标,但为瞬时值,几乎没有参考意义;
改造:在 broker 中加入计算5分钟内最大值的指标;
结果:
- 问题二:消息写入耗时是历史最大值,参考作用有限;
改造:优化为5分钟内耗时,以及P99/P999等分位值;
结果:得到准确的消息写入耗时。
4、集群可视化:巡检系统
巡检系统与监控系统的区别是:监控系统是反应瞬时的问题,变化很快,需要及时发现和处理,呈现形式相对固定;巡检系统则是长期工作的监督,针对静态环境和配置,变化较少,呈现形式更加自由。
随着治理工作的持续开展,如何确认一个集群达到健康状态?
a. 严格按照部署标准部署集群,包括硬件配置、运行参数、可用区等,对所有集群进行定期巡检,产出报表反映集群状况;
b. 共制定核心标准20+项,巡检结果以表格形式呈现,如下图表格。
c. 由于指标过多无法从判断问题,因此设定了集群健康分体系,是基于集群的可用性只能通过唯一指标反映的思想,将每个指标设置一个权重,通过最终的分值来判断集群是否存在问题,如下图所示:
5、集群可视化:消息对账监控
在设计告警时,总会有些没有考虑到的告警项,这里的解决方案是消息对账系统,它可以有效监控消息延迟、丢失和集群健康度。
消息对账系统的优势在于它提供端对端的监控,包罗多项监控的效果,并且它的自驱力可以替没有考虑到的告警项兜底,故障的发现和定位也被独立开。
消息对账监控系统
在 Kafka 社区提供了相应的 Kafka Monitor 组件,我们将这个组件进行服务化改造,提供自动化添加新集群监控的能力,减轻运维的压力。
6、集群可运维:自动化平台
可运维能力的建设是通过自动化来实现的,其根本目的是释放人力。
下图展示的是topic迁移工具,从RocketMQ和Kafka两部分改造:
a. RocketMQ
- 修改 nameserver delete 逻辑,支持在 broker 间自动迁移 topic;
- 同时处理 consumer-group,retry/dlq topic;
- 依赖自研管理平台;
b. Kafka
- 基于 reassign 改造,自定义 reassign 算法,减少 partition 搬迁的影响;
- stage 工作流化,每一步自动执行,人工确认下一步操作;
- 集成自研管理平台。
Topic迁移工具
三、未来的探索与规划
近年来,消息领域的全面云原生化逐渐走向深入,比如 RocketMQ 5.0 版本的存算分离设计和 raft 模式,再比如 Kafka3.0 引入了分层设计的方式(tiered storage)和 raft 模式,以及近年来新崛起的 Pulsar 也开始采用云原生架构,在未来都可以针对具体业务需求引入进行功能迭代,发挥组件的最大价值。
原文链接
本文为阿里云原创内容,未经允许不得转载。
小红书消息中间件的运维实践与治理之路相关推荐
- 云原生2.0时代,华为云DevOps立体运维实践
摘要:随着云原生2.0时代的来临,越来越多的企业及个人选择使用云原生技术来构建业务,云原生技术给业务构建.交付带了便利的同时,对运维也提出了更高的要求. 2020年12月,中国DevOps社区峰会在北 ...
- linux框架下搭建orl,DevOps和自动化运维实践/Linux\Unix技术丛书
导语 内容提要 随着云计算.Docker.Kubernetes技术的流行,相信大家经常会听到"容器云"这个专业词汇,容器技术的兴起,对于传统的运维知识体系而言也是一种冲击和挑战.& ...
- DBA很忙—MySQL的性能优化及自动化运维实践
作者:王辰 来自:高效运维(ID:greatops) DBA的日常工作 首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 D ...
- 容器 PaaS 新技术架构下的运维实践
2018年11月16-17日,运维&容器技术盛会 CNUTCon 全球运维技术大会在上海·光大会展中心成功举办.时速云联合创始人兼 CTO 王磊受邀参加此次大会,并发表主题演讲. 王磊此次演讲 ...
- MaxCompute作业日常监控与运维实践
简介: MaxCompute作业日常监控与运维实践 监控项目作业超时运行 案例一 专用于业务团队取数的project_A ,基本都是手动跑SQL查询,每个作业执行基本不会很长时间,由于目前使用的是包年 ...
- OceanBase在蚂蚁金服的智能运维实践之路
OB君:蚂蚁金服资深技术专家虞舜将在本文为大家分享蚂蚁金服数据库所面对的业务挑战,解读OceanBase的自治数据库体系,解密OceanBase在天猫双11大促期间的稳定性解决方案,探索OceanBa ...
- 飞天5K实战经验:大规模分布式系统运维实践
摘要:随着阿里体量越来越大,数据也在呈几何倍数增长.因此,在运维工作上已很难找到其他企业的成功经验来借鉴,但又不能凭空揣测解决方案.本文详解了阿里飞天5K实战经验,带你了解大规模分布式系统运维实践. ...
- 第十四期百度技术沙龙:探讨大型互联网产品的运维实践
导读:互联网发展至今,搜索.社交.视频.娱乐.电子商务等层出不穷的应用,极大地丰富并影响着人类社会的运作模式.但随着人们对互联网依赖度的提高,以及用户规模呈几何级数增长,所产生的庞大数据流和海量计算要 ...
- 网易有数海量任务调度和智能运维实践(整理)
网易有数海量任务调度和智能运维实践 https://mp.weixin.qq.com/s/LJIS7xeHsiTpf12os3DtNw 根据依赖关系,智能推算出每个具体实例的完成时间. 实现:任务运维 ...
最新文章
- zeroc-ice的全双工通信策略
- Top 10 steps to optimize data access in SQL Server
- 一个技术管理者的苦逼【技术管理漫谈】
- Silverlight + WCF异步调用 例子
- 【Python】实现最大最小距离算法
- php页面不刷新 图片的src不更新,详解iframe的src指向的内容不刷新的解决办法
- [GIS教程] 6.1空间数据采集与处理具体步骤
- Google BETA版本测试介绍
- jlink怎么调试linux程序_Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序
- 4.服务器的品牌和型号
- 中国联通(广东省分公司)研发技术初面
- VScode 显示垂直标尺
- C#基础知识点个人整理【菜鸟教程】
- 【数据分析干货】全网最全!各行业常见的业务指标整理(四)-财务指标
- 北京燕化附中2021年高考成绩查询,2021年北京最好的高中排名,北京重点高中排名榜公布...
- 卡罗拉 (COROLLA) 更换空气滤清器
- python+beautifulsoup/xpath实现新浪微博某互粉好友全部好友圈微博爬虫
- 根据汉字获取拼音,别人写的,留着有用
- 嵌入式linux使用ros,ARM平台基于嵌入式Linux部署ROS
- 第一节课:从零起步编码实现多层次神经网络
热门文章
- 多元相关性分析_研究 | 精神分裂症症状与超氧化物歧化酶相关性的性别差异
- JAVA入门级教学之(if语句)
- linux命令cp命令行参数,linux命令之cp命令参数及用法详解
- 当前操作系统缺少黑体等字体_从零开始开发一个操作系统
- oracle命令行原理,Oracle命令行操作方式
- 【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)
- android 自定义控件的宽高_巧用Handler获取View控件信息
- mpython 直接访问_如何从python代码中直接访问Android的Service
- php 类常量用法,php类常量用法实例分析
- 单目相机 svd 从图像恢复3维位置_论文学习——VINSMono:一种鲁棒且通用的单目视觉惯性系统...