快速成长期应用架构实践 (13): 应用健康检查

勿忘初心2018-11-15 11:28

欢迎访问网易云社区,了解更多网易技术产品运营经验。


4.4 应用诊断


对于线上业务来说,提供稳定的服务是最基本的保障,而稳定服务的大前提就是业务 正常运行。为了保障业务正常运行,就要能够判断业务是否正常工作。


4.4.1 应用健康检查 


对于线上应用,首先我们要有基础监控,知道线上服务是否活着,是否正常对外提供 服务。其次需要考虑性能问题,通过性能监控来了解线上服务的运行情况,判断是否需要 扩容、优化,并发现服务中的热点。最后通过日志监控分析线上业务运行情况,来进行问 题的复盘和排查。


基础监控是业务稳定运行的第一重保证!对于一些缺少监控,而且用户反馈渠道不通 畅的业务来说,一个业务挂上几个小时甚至几天都是有可能的。按照判断方式判断业务是 否成功,可以分为内部判断和外部判断。


内部判断:指的是在程序内部植入监控模块,通过检查应用内部运行情况来获取 应用的运行状态。应用开发的数据一般比较准确,可以进行细致地检查。但是与 具体应用相关,缺乏广泛的适用性,我们在此不再展开介绍。


外部判断:指的是把系统作为黑盒处理,通过外部监控来判断系统是否正常运行。 这种判断方式一般依赖于通用的网络协议,不依赖应用本身,因此有广泛的适用 性,也是本节的主要内容。


应用健康检查一般和负载均衡、服务管理等功能结合使用,在发现系统运行异常时进 行相关操作,自动运行异常的节点,保障整个系统平稳运行。


健康检查类型 

一般来说,判断业务是否存活有以下方式。


进程监控:这是最直接的监控方式。依赖操作系统实现,只能判断进程是否存活, 是较基础的判断。


基于网络协议的健康检查:直接使用网络协议来判断服务是否正常。因为需要明 确到进程,最常用的做法就是 TCP 健康检查。这种做法好处是实现简单,适用性强(任何 TCP 之上的协议都可以用),缺点是存在网络正常但是系统异常的情况。 最常见的问题就是监听端口进程卡死,这时 TCP 连接仍然可以正常建立(系统层 面),但是应用已经无法正常工作。


基于应用协议的健康检查:一般使用业务对外提供的只读接口,或者专门实现的 健康端口,对应用协议自身进行健康检查。


健康检查配置参数

基于网络协议或者应用接口的健康检查的核心参数如下。

 rise:健康阈值,经过该次数检查后认为服务器状态正常。

fall:不健康阈值,经过该次失败后认为服务器宕机。

timeout:请求超时。

period:请求间隔。

port:健康检查端口号。

protocol(可选) :请求协议。

rl(可选):请求的 URL。


SQL 和 Redis 的健康检查还涉及协议相关的具体参数,这里就不再赘述。


在配置健康检查时,特别要注意 fall、timeout、period,要根据业务类型和业务响应时 间进行调整。不合适的设置不但起不到健康检查的作用,反而会因为健康检查误判而导致 系统雪崩效应。


避免雪崩效应 

下面以负载均衡后面的健康检查为例,来看一个因为健康检查配置问题导致的异常场 景(根据真人真事改编) 。


一个业务需要配置健康检查,该业务在低负载时平均响应时间是 3s,偶尔会超过 5s,而在系统压力较高时(负载 50%),平均响应时间会达到 6s,随着系统压力增 加,响应时间还会进一步延长。


系统配置人员在系统上线前测试了健康检查接口,得出响应时间 3s 的结论,因此在设置健康检查时,timeout 设置为 5s,其他的按照默认参数设置,最终参数 如下。

rise:2
fall:2
timeout: 5000ms
period: 10000ms
port:8080
protocol(可选): http
url(可选):/getStatus


在线上运行时,偶尔会有超时的情况,但是并没有连续 2 次触发异常。由于有多 个节点,偶尔去除 1 个节点也会快速拉起,不会影响用户业务。


产品方发起了一次业务推广活动,导致系统压力增加到原来的一倍。运维人员评 估任务压力增加后也只是到负载一半,因此没有进行扩容就开展了活动。


当线上压力增加时,首先是压力最大的节点超时,从转发列表中移除。接着流量 被分担到其他节点上,其他节点压力更大,导致继续移出。直到所有节点都被拿 掉,业务完全崩溃。在这个流程中,最恐怖的是,节点被移除的过程,都属于系 统正常逻辑,不会触发报警。
在移除的过程中,开始只是业务变慢,并没有异常发生。只有当剩下的集群负载过高 导致请求失败时,才会发现问题。
这个问题一旦发生,在入口流量下降之前,系统就无法正常工作。因为移出的节点会 因为压力降低而恢复正常,恢复正常后又被导入流量,然后负载过高又发生异常,给用户 的体验就是产品不稳定、响应变慢和时断时续。规避这种情况可以从以下角度着手。


设置超时时间需要考虑到系统在高负载情况下的实际响应能力,提供的接口响应 时间需要保证。


缓慢宕机,快速拉起,保证压力过高的时候不会过于频繁地关闭节点,同时在节 点恢复时可以快速扩充服务。


使用弹性伸缩服务,保证后面健康的实例数量,在系统负载过高时自动拉起新的 节点来降低负载。


配置实践 

下面以网易云基础服务为例,提供健康检查的配置实践。


负载均衡提供两种检查模式,是在负载均衡服务中直接对后端进行检查,如图 4-29 所示。


负载均衡服务可以直接在对应监听中配置健康检查参数,也可以自定义健康检查参数。 异常的节点可以直接移出转发集群。 

图 4-29 负载均衡提供的两种健康检查方式

APM 

APM 本身提供了对请求的详细分析,通过 APM 提供完善的健康检查功能,可以直接 设置报警,发现系统异常。


文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著 


网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用