一个系统,搞定闲鱼服务端复杂问题告警-定位-快速处理

本文主要是介绍一个系统,搞定闲鱼服务端复杂问题告警-定位-快速处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg

作者|吴白

出品|阿里巴巴新零售淘系技术部

服务端问题排查对开发而言是家常便饭,问题并不可怕但要花大量时间去处理;另一方面故障的快速解决至关重要。

目前问题排查最大的障碍是什么呢?我们认为有以下几个原因:

  • 大量的告警信息。

  • 链路的复杂性。

  • 排查过程繁复。

  • 依赖经验。

实际工作中的排查思路并非无迹可寻,排查思路和手段可以沉淀出一套经验模型。

沉淀路径

下面是我的订单列表的简单抽象,其执行过程是先拿到我买到的订单列表。订单列表中又用到了卖家,商品以及店铺信息服务,每个服务又关联着单次请求中提供服务对应的主机信息。

640?wx_fmt=png

以线上常见的服务超时为例,上图中因为 127.123.12.12 这台机器出现异常导致商品服务超时,进而导致我的订单列表服务超时。根据日常中排查思路可以总结出以下分析范式:

640?wx_fmt=png

上面这种分析范式看起来很简单清晰,但是它首先面临着以下问题

  • 如何准确界定超时/异常。

  • 上下游调用链路如何生成。

  • 自己和下游,如何确定谁的问题(超时&异常)。

  • 下游异常时,如何区分超时/线程池满/未知异常。

以上问题本质上是底层数据埋点问题,幸运的是阿里集团完备的数据建设使得这些问题基本都能找到很好的解决方案。有了底层数据支撑再配合上层抽象出来的这样一套分析模型,设计并实现一套完全自动化问题定位系统是完全有可能的。

系统架构

我们认为这样一套问题自动定位的系统一定要满足 4 个目标,这同时也是整个系统的难点所在。

  • 准(定位准确率不亚于开发人员)

  • 快(定位结果早于监控发现)

  • 简单(从问题发现到定位结果之间的最短链路)

  • 自动化

640?wx_fmt=png

围绕着这4大目标,我们实现了上面这样一套完整的定位系统,实现了从告警->定位->快速处理这样一套完整闭环。自下而上划分为 4 个模块,下面讲一下每个模块解决的问题以及其难点。

数据采集

数据采集模块主要负责埋点数据的采集与上报,需要解决两个问题:

  • 海量数据。线上的埋点数据每时每刻都在产生,其数据量可达到 80G/ 分钟。

  • 采集时延。快作为整个系统追求的一大目标,数据采集需要满足低时延。

  • 可扩展指标。随着模型的不断演进完善,需要实现灵活的增加采集指标( cpu/gc/gc 耗时/线程数等)。

采用 SLS+ 自定义插件库来实现线上流量埋点数据的采集与上报。SLS 是阿里云研发针对日志类数据的一站式服务,其生命周期管理( TTL )以及极低的存储成本可以很好的解决海量数据带来的成本问题。

实时计算

实时计算以数据采集的输出作为输入,负责对数据进行一轮预处理,包括链路数据的关联(请求都有唯一标识,按照标识 group by ),数据清洗(只选取需要的数据)以及事件通知。

  • 计算延时。从拿到数据到最后过滤输出,要尽可能压缩计算延时来提升整个系统的时效性。

  • 多数据源协同。数据来源于底层不同的数据源,他们之前对应着不同的到达时间,需要解决数据等待问题。

  • 数据清洗。需要有一定的策略来进行一轮数据清洗,过滤出真正有效的数据,来减少计算量以及后续的存储成本。

  • 存储成本。虽然经过了一轮数据清洗,但是随着累积数据量还是会线性增长。

实时分析

当收到事件通知后根据实时计算产出的有效数据进行自动化的分析,输出问题的发生路径图。需要解决:

  • 实时拓扑 vs. 离线拓扑。实时拓扑对埋点数据有要求,需要能够实时还原调用链路,但依赖采集数据的完整度。离线拓扑离线生成,不依赖采集数据的完整度,但不能准确反应当前拓扑。最后选择了实时还原拓扑方式保证准确率。

  • 数据丢失。虽然实时计算中有解决数据协同等待的问题,但无法彻底解决数据的丢失问题(数据延时过大/埋点数据丢失),延时以及丢失数据需要采取不同的处理策略。

  • 分析准确率。影响准确率的因素很多,主要包括数据完整度以及分析模型的完备度。

聚合展示

按照时间窗口对问题发生路径进行实时聚合,还原问题发生时的现场。将监控,告警和诊断链路进行了互通,最大化的缩短从问题发现到结果展现的操作路径。

  • 实时聚合 vs. 查询时聚合。查询时聚合性能差但是很灵活(可以根据不同的条件聚合数据),反之实时聚合牺牲了灵活性来保证查询性能。这里我们选择保证查询性能。

  • 并发问题。采用实时聚合首先要解决的是并发写(线上集群对同一个接口的聚合结果进行修改)。最后采取将图拆解成原子 key,利用 redies 的线程安全特性保证线上集群的写并发问题。

  • 存储成本 vs. 聚合性能。为了解决并发问题,我们利用redis的线程安全特性来解决,但带来的一个问题就是成本问题。分析下来会发现聚合操作一般只会跨越 2~5 个窗口,超过之后聚合结果就会稳定下来。所以可以考虑将聚合结果持久化。

效果

系统上线以来经受住了实践的检验,故障以及日常问题的定位效率得到显著提升,并获得了稳定性的结果。将日常问题/故障定位时间从10分钟缩短到 5s 以内,以下是随机选取的两个真实 case 。 

案例1:闲鱼发布受影响,监控系统发现商品发布接口成功率下跌发出来告警信息,点击告警诊断直接跳转到问题现场,发现是因为安全某个服务错误率飙升导致,整个过程不到5s。2_04.png

640?wx_fmt=png

案例2: 首页因为单机问题受到影响,闲鱼首页因为单机gc问题抖动触发大量告警信息,秒级给出问题发生路径。根据诊断路径显示搜索单机出现大量异常。

640?wx_fmt=png

总结

目前整个系统主要聚焦服务稳定性相关的问题定位,仍然有许多场景有待覆盖,信息有待补全,措施有待执行,定位只是其中的一环。最终目的一定是建设问题定位,隔离,降级,与快速恢复这样一个完整闭环。要想实现这样一个完整闭环,离不开底层各个子系统的数据建设,核心在于两点一面的建设:

  • 底层数据建设。完备的数据支持一定是整个系统能够发挥价值的前提,虽然现阶段很多系统在产出这方面的数据,但仍然远远不够。

  • 完备的事件抽象。数据不仅仅局限于请求产生的埋点数据,其范围应该更为广泛(应用发布,线上变更,流量波动等),任意可能对线上造成影响的操作都应该可以抽象成一个事件。

  • 知识图谱的建立。仅仅有完备的事件并没有多大的价值,真正的价值在于把这些事件关联起来,在问题/故障发生时第一时间还原现场,快速定位问题。

One More Thing

就是现在!客户端/服务端Java/架构/算法/前端/质量 工程师,小闲鱼通通期待你的加入,base杭州阿里巴巴西溪园区。欢迎天马行空的你,加入这个颜值+才华逆天的团队,成就最好的自己! 投喂简历给小闲鱼→guicai.gxy@alibaba-inc.com

END

你可能还喜欢

点击下方图片即可阅读

640?wx_fmt=jpeg

“一次编码、到处运行”,淘宝云端一体化探索

640?wx_fmt=png

技术人必看!揭秘淘宝如何通过相似人群挖掘获取更多目标用户

640?wx_fmt=jpeg

阿里工程师谈,什么是好的代码?

640?wx_fmt=png

640?wx_fmt=png

在看点这里

640?wx_fmt=gif

这篇关于一个系统,搞定闲鱼服务端复杂问题告警-定位-快速处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817800

相关文章

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景