微服务架构谈(6):从监控到故障定位(下)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务架构谈(6):从监控到故障定位(下)

image.png


周日和工作时间的业务规模,用户影响业务模型有差别,亦可通过动态阈值方案来尽量减少误报,规避漏报。周期性可以分为几种:按日、按周、按月、按工作日等方式,需要针对不同业务定义不同的预警方式。通过多次优化可以总结出如下预警阈值的优化方法:


分类法:把业务按业务波动分类:定时任务类业务、平稳类业务,针对不同业务配置的阈值及取值方式不对。例如:外部商户交易是平稳业务性的,业务曲线相对平稳,取值方式可以环比和同比结合起来使用配置,而XX代扣、XX代发业务都是波动性业务,对应监控阈值除了同比还需要考虑业务量范围。


业务波动学习法:经过分析部分业务在固定时间点会有波动,可以考虑针对业务分段监控,在波动段采用环比+值范围的监控方式。例如:XX交易每天在10点、20点、0点都是有比较大的波动,其他整点时间有小量波动。


时间分段法:针对现有业务变更一般都是在白天发生,同时晚上有一些业务存在定时和由于量小导致的波动曲线大的问题,可以考针对09:0021:0021:0009:00配置不同阈值。


因此,配置监控预警阈值会在预警准确性和去噪音两者之间取舍,人工配置预警的方式永远找不到银弹,未来还是需要考虑通过智能化的方式去学习业务波动渠道才是最终解决方案。


7.2 智能定位问题


在大型SOA架构的系统中,包括采用了微服务设计的一系列服务中,定位RootCause是一个老大难问题。交易下跌了,是支付的问题,还是营销的问题?是应用系统问题还是数据库切换到读库状态了?在传统的运维模式中基本靠。大盘出问题了,大家都看一下自己的系统!然后人肉综合判断。为了更好的做RootCause的定位,需要一套支撑根因分析与定位的系统。目前流行的有基于知识经验的定位、基于有监督算法的定位这2类。


基于知识经验的定位

顾名思义,基于知识经验的定位是把人肉经验固化的一种方法。特点是见效快,特别是历史出过的问题,而且可以举一反三,分门别类。确定是检测代码的维护问题,随着系统变更,调用链路和依赖存储的变化,检测代码需要做同步变更。另外,此方案对于发现完全陌生类型的问题,收效存疑。


image.png


如上图所示,其实质是关联指标法。比如,发现点击率下降,可以从人工经验总结的影响ctr波动的系统内部(模型、算法、索引、数据等)指标入手,依次检测是否正常。此类方法,可以描述成一棵可追溯的树,层次深入。

 

基于有监督算法的定位

系统风险的发现和定位属于异常检测(Anomaly Detection)的范畴,在该领域通常有监督模型法(SupervisedModel)、聚类模型法(Unsupervised Model)、近邻法(Nearest Neighbor)、统计法(Statistical)、信息论(Information Theory)和谱理论(Spectral Theory)等。一般来说,标注数据的获取是一大难题,所以半监督、无监督的算法在这类场景中大量使用,而我们利用故障注入得到种子标注数据,再通过对种子问题做同类扩展,得到大量标注样本,然后基于样本构建分类模型,预测每次系统调用的风险,对有问题的调用进行报警,并结合调用参数、系统变更数据对根因进行定位。我们将智能定位问题分为两步实现:1、检测问题;2、定位问题。这里展开一下检测问题,定位问题的解法后面专文叙述。


评估智能检测系统的发现问题的效果一般采用“系统风险覆盖率和误报率”。因为缺乏标注数据,这两个指标一直是很难度量的,我们利用故障注入平台的能力设计了有监督综合模型将其分解为4个阶段来实现定量评估:1、历史故障;2、同类延伸历史故障;3、覆盖用例库可能出现的故障及其延伸;4、有创造性的智能延伸故障。整体上,业务通过接入故障注入平台和精细化故障检测平台,使业务具备常态化进攻和防守的“左右互搏”的能力,常态化、周期性拿到系统在风险敞口的指标,辅助或在一些场景帮助业务作出最优决策。


image.png


上图描述了攻防结合的反馈与优化闭环,精细化智能检测平台作为防守方,涉及故障延伸方法的设计、有监督综合模型的设计、周期性演练效果的计算三个重要步骤,下面我以某故障为实例来具体说明:


某故障由于业务规则配置出错,引起业务量下降导致,从数据上看,表现为返回参数与正常请求相比有明显缺失,比如:



参数维度1

参数维度2

参数维度3

正常系统调用

abc

def

[zzz,yyy,  ...] (省略)

异常系统调用

abc

def

[]


显然,异常系统调用在参数维度3上有所体现。通过故障注入,我们便可以拿到历史故障数据,但是如果仅仅使用这些样本进行训练,检测系统也只能覆盖历史出现过的故障,极大的限制了系统的检测范围,所以我们将历史故障数据作为种子,在上面进行同类故障问题数据的扩展。


通过同类故障扩展,模型可以拥有覆盖一类问题的能力,扩大了故障覆盖范围,也更能符合真实的情况。后续我们也尝试基于遗传算法的创造式故障样本扩展,更全面的覆盖风险敞口。


基于拓展样本,我们构建了一个基于有监督算法的综合模型,对异常系统调用进行预测,同时结合特征重要性和实时参数来推理可能引起问题的参数,输出给定位模块。


八、故障注入与常态化演练


8.1 Chaos Principle

Netflix曾发布过Chaos Principle,来阐述chaos工程师的相关工作。Chaos Principle包含4个原则:


  • Build aHypothesis around Steady State Behavior
  • Vary Real-worldEvents
  • Run Experimentsin Production
  • AutomateExperiments to Run Continuously


Build a Hypothesis around Steady State Behavior:把系统当成黑盒,chaos专注在系统does work,而不是尽量验证它如何工作。 例如当故障或某一个状态发生到恢复期间,系统的吞吐量,错误率,延时分布等。


Chaos Monkey是最受关注的一个产品,顾名思义就是用来捣乱的,怎么捣乱?

把某些运算设备定制掉;把系统延迟时间调长等等。Chaos系列还可以模拟单机房故障。Chaos Monkey 最新版本依赖于Spinnaker这个持续发布平台。


Vary Real-world Events:实际创造真实环境的事件,比如硬件fail,软件不可用来观察演练。

Run Experiments in Production:系统的行为取决于环境和通讯模式,采样真正的流量是唯一的方法来可靠地捕获请求路径。为了保证系统运行的真实性和当前部署的系统的相关性的真实性,chaos喜欢直接在生产流量实验。


Automate Experiments to Run Continuouslychaos工程师通过手工的故障演练不可持续,因此构建自动化演练的机制。


8.2 故障注入

结合chaos principle不难得到结论,由于分布式系统把fail作为常态对待,不能等到出现问题采取解决它,应该通过练兵的方式做演习,而演习的目标要做到尽量可重复、安全、接近真实。


故障注入的方式之一通过服务路由来想办法,比如通过Filter模式对于路由进行处理。下图简单示意了通过隔离服务路由,导入测试流量到演练机的一般方法。


image.png


如上图所示,系统A>B>C,系统A调用BB调用C。假设选定对应集群中A MonkeyB MonkeyC Monkey为测试机,则测试流量进入的时候通过服务路由中设置路由到正确的测试机;而正常流量会按照常规配置的路由策略路由到比如A-1-30.xxzone等其他机器中。


目前笔者所见的注入故障分类大致覆盖调用/负载变化、单机服务器故障(比如磁盘、cpu full、内存full等)、下游故障(DB响应变慢、下游返回失败结果等)。


8.3 常态化演练

分布式系统有一个不成文的原则,就是面向fail设计。任何系统、任何资源都可能不可用,要考虑不可用的异常发生时,对应的解决方案。比如ebay的架构原则就有一条,Remember Everything Fails


在大型互联网站点的架构师心中都形成了一些共识,比如Remember Everything FailsAutomateEverything。如何做到呢?我们可以把Remember Everything Fails分为三个阶段:

  • 面向Everything Fails设计
  • 验证Everything Fails时的系统表现是否符合预期
  • 常态化、自动化验证(演练)

常态化演练的基本动作包括演练计划、执行场景case注入、观测、故障止血、总结改进等。常态化也包括一些突袭演练,采用红蓝军攻防对抗模式,不仅仅模拟系统表现、也是对整体的应急响应处置流程包括组织流程的检验。

 

总结:分布式服务化,服务和存储拆分都还算容易,但会对基础设施和技能有更高的要求。如林昊所说,能不服务化的尽量不服务化;无数前辈也告诫过,能不用分布式事务的尽量不用。一入江湖,不得回头。随着业务规模化的发展,在服务治理上需要下的功夫愈走向精细化。

 

声明:

本文部分插图引用网络公开资料,包括高德稳定性架构实践(雷娃)、支付宝无线-从前端到后端的服务治理 以及 阿里妈妈全景业务监控平台Goldeneye。


相关文章
|
20小时前
|
监控 API 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第12天】 在现代软件开发的浪潮中,微服务架构已经成为了设计复杂系统的首选模式。它通过将大型应用程序拆分成一组小而专注的服务来增强系统的可维护性和可扩展性。本文将探讨微服务架构的关键概念、优势以及如何在后端开发中实现一个高效的微服务系统。我们还将讨论一些常见的挑战和最佳实践,以帮助开发者避免陷入常见的陷阱。
13 6
|
1天前
|
存储 NoSQL MongoDB
【MongoDB 专栏】MongoDB 与微服务架构的结合
【5月更文挑战第11天】微服务架构流行趋势下,选择合适的数据库至关重要。MongoDB作为非关系型数据库,与微服务有天然契合度。其灵活的文档模型、水平扩展性、高性能及局部事务支持,满足微服务对数据模型多样性、高可用性、快速读写的需求。实践中,需注意数据划分、索引优化、监控调优和版本控制。未来,MongoDB在微服务中的应用将更广泛,新技术将提升其在微服务架构中的价值。
【MongoDB 专栏】MongoDB 与微服务架构的结合
|
1天前
|
监控 数据库 开发者
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第11天】在当今软件开发的世界中,微服务架构已经成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了设计、部署和维护微服务系统时面临的挑战,并提出了一系列实用的策略和最佳实践。我们将从服务的划分原则出发,讨论如何确保每个微服务的自治性,以及如何通过容器化和编排技术实现服务的高效运行。文章还将涉及监控、日志记录和故障恢复的策略,旨在帮助开发人员构建一个既高效又可靠的微服务环境。
|
1天前
|
Kubernetes API 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第11天】 在现代软件开发的快速演变中,微服务架构已成为企业追求敏捷性、可扩展性和技术多样性的关键解决方案。本文旨在探讨如何构建高效的微服务架构,并分析其对后端开发的影响。我们将通过一系列最佳实践和策略,展示如何优化服务的独立性、弹性和性能,同时确保系统的整体稳定性和安全性。文章还将介绍容器化、API网关、服务发现和分布式追踪等关键技术的应用,为后端开发者提供一份全面的微服务实施指南。
|
1天前
|
设计模式 监控 API
构建高效的微服务架构:后端开发的新范式
【5月更文挑战第11天】 在当今的软件开发领域,微服务架构已经成为一种流行的设计模式。它通过将应用程序分解为一组小型、松散耦合的服务来提供高度可扩展和灵活的解决方案。本文将探讨如何构建一个高效的微服务架构,包括选择合适的技术栈、设计原则以及应对常见挑战的策略。我们将深入讨论如何确保系统的可维护性、可靠性和性能,同时考虑到安全性和监控的需求。
|
2天前
|
监控 持续交付 Docker
使用Docker进行微服务架构的最佳实践
【5月更文挑战第10天】本文探讨了使用Docker实施微服务架构的最佳实践。首先,理解微服务架构是拆分小型独立服务的模式,借助Docker实现快速部署、高可移植性和环境一致性。Docker的优势在于服务扩展、容器编排、自动化构建与部署。最佳实践包括:定义清晰服务边界,使用Dockerfile和Docker Compose自动化构建,利用Docker Swarm或Kubernetes编排,实施服务发现和负载均衡,监控与日志记录,以及持续集成和持续部署。Docker虽重要,但需与其他技术结合以确保系统整体稳定性。
|
2天前
|
缓存 负载均衡 API
微服务架构下的API网关性能优化实践
【5月更文挑战第10天】在微服务架构中,API网关作为前端和后端服务之间的关键枢纽,其性能直接影响到整个系统的响应速度和稳定性。本文将探讨在高并发场景下,如何通过缓存策略、负载均衡、异步处理等技术手段对API网关进行性能优化,以确保用户体验和服务的可靠性。
|
3天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。
|
4天前
|
API 持续交付 开发者
构建高效微服务架构:后端开发的新视角
【5月更文挑战第8天】 随着现代软件开发的演变,微服务架构已经成为了企业追求敏捷、可扩展和灵活部署的重要解决方案。本文将深入探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术栈选择以及持续集成与部署的最佳实践。我们还将讨论微服务带来的挑战,如数据一致性、服务发现和网络延迟,并提出相应的解决策略。通过本文,后端开发者将获得构建和维护微服务系统所需的深度知识,并了解如何在不断变化的技术环境中保持系统的健壮性和可维护性。
40 8
|
2天前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第10天】在现代软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将大型应用程序拆分为一组小型、独立和松散耦合的服务来提供更高的可伸缩性和灵活性。本文深入探讨了微服务架构的设计理念、实施步骤以及面临的挑战,并提出了一套实用的策略和最佳实践,帮助后端开发者构建和维护高效的微服务系统。