异常检测

异常检测和踢出异常主机是一个动态检查上游主机是否正常工作,对不健康主机进行移除的过程。异常检测是一种被动健康检查,根据返回状态码来判断是否满足移除条件,最后将主机移除,首先我们来了解下驱逐算法。

从上图中,可以看出来主机异常时首先会检查是不是有主机已经被移除了,如果没有被移除,那么直接移除这个不健康的主机,如果有主机被移除,则会率先检测是否超过移除阈值(maxEjectionPercent),如果超过这个阈值,则不会有任何行为发生,如果没超过这个阈值,那么则会将该主机移除一段时间,这段时间后则会将主机放入负载均衡池中供下游主机选择并分发请求。

 

什么是Panic_Threshold?

在负载均衡的过程中,Envoy只会考虑健康的上游主机。然而,如果健康主机的比例过低,Envoy将会无视健康状态分发所有的请求,这就是所谓的Panic Threshold,这个阈值默认为50%。这个设计的目的是防止大规模主机崩溃导致整个集群负载过高。Panic阈值需要和优先级一起配合工作。如果在某个优先级下健康主机数少了,Envoy将会将一些流量转移到低优先级的主机。如果在低优先级主机中,Envoy发现足够数量的的健康主机。Envoy将会无视Panic阈值。如果各个优先级健康程度都是100%。Envoy将忽略panic阈值而根据既定负载均衡算法路由流量。如果整体健康程度低100%,envoy认定没有足够数量健康的宿主机,但是他仍会给所有优先级的主机分发流量。但是如果给定优先级的健康宿主机比例低于了Panic阈值,这时候对于这部分优先级的宿主机,所有流量将会分发给这部分宿主机而不考虑他们的健康状态。

我们定位到代码中来看下Panic Threshold是如何配置和工作的。

如图,我们可以看出healthy_panic_threshold被默认设定为50%。

在判断流程当中,Envoy先会拿到实时的panic_threshold值,然后通过计算健康的hosts数量与总hosts的数量比值来比较。

在Envoy种有一个hostSourceToUse的方法,这个方法则是作为负载均衡的一部分,来将可用的hosts作为对象返回给调用方。其中包含很多种情况,我们在此只列举处在panic状态下的情况。如下图,若isGlobalPanic方法返回True也就是说集群内处在Panic模式,首先统计数据上会记录一次相应的数据,再次可用hosts列表将会包含所有存在的hosts而无视他们的健康状态。

 

熔断的触发与实现

Istio现在本身支持的四个参数是:连续错误个数,检测周期,主机移除比例以及基本移除时间。这四个参数看上去可以大致归类一下,连续错误个数和检测周期有点像是触发条件,但实际上真正的触发条件只有一个连续错误个数也就是consecutive_5xx。主机移除比例和基本移除时间,更像是熔断结果。我们接下来将这四个参数逐一分析下作用和实现。

Consecutive_5xx:设置的是5xx以上错误的个数。Envoy中的putHttpResponseCode方法根据请求结果的http状态码来进行统计。如果返回状态码不高于500则会设定envoy统计数据中consecutive_5xx为0并且结束方法,若返回码高于500则需要进行两次判断。首先判断状态码是否是502,503以及504,如果是则会首先将gateway failure 统计数据自增1,而后判断是否触发了gateway failure的熔断,这部分和istio设定的参数关系不大,我们暂不展开。同样即便是Gateway failure或者返回值为500,501,consecutive_5xx这个统计数据也会自增1然后和设定的熔断条件进行比较(consecutive_errors)。

如过consecutive_5xx和配置中的比较相等,则会触发相应的onConsecutive5xx方法,这个方法则是通知主线程,这个主机发生了触发了5xx错误熔断。

有趣的是我们没展开的gateway failure达到触发条件也是会触发这个通知主线程函数,只不过参数上传入的是gateway failure这个参数。这个通知方法内会触发onConsecutiveErrorWorker,正是这个方法最重隔离主机。

我们在分析隔离主机之前先来分析另一个参数MaxEjectionPercent,这个参数是最大主机隔离比例。在ejectHost这个方法中,首先会获得已配置的max_ejection_percent这个参数的值,若果没有配置则会引用默认的10%。在截图中,我们可以看出如果ejected_percent如果小于max_ejection_percent,就会对主机进行移除操作。此时我们分析下,如果我们设定为1%,即便移除后ejected_percent比例高于max_ejection_percent也会执行移除行为,类似向上取整。例如,10个主机,设定移除比例为11%,则最多会移除2个主机而不是1个。如果我们将max_ejection_percent设成0又会发生什么呢?是否像我们想象的那样一个都不移除因为毕竟0<0这个条件是不成立的。

我在Istio中对应的destinationrule中将max_ejection_percent设置为0,但是发现还是会熔断1个。进而去查询istio-proxy的配置,发现max_ejection_percent并未配置下去,也就是说这个值采用的默认10%。在查询Istio中的代码applyOutlierDetection方法中找到。

只有在maxEjectionPercent大于0的时候才会采用这个值,否则不会采用该值,也就是说如果我们配了0下去,这个数值不会转配到Envoy上,这也就解释了为什么Envoy中的configure_dump中并没有找到maxEjectionPercent所配置的0,并且还解释了为什么我们认为配置了0,还是会有上游主机熔断这个情况发生,因为使用了Envoy默认的10%。

 

Interval

Interval限定的是检测周期,即多久会检测一次上游主机返回的Http code来断定是否需要对齐采取熔断策略。其实检测的这种行为都是由Detector来执行的,interval就是赋予detector的一个定时基准。

首先在armIntervalTimer方法中,启用定时器,定时器时间会读取配置的interval,如果没有这个配置则会启用默认的10s,如下图:

当detector initialize的时候会直接启动这个定时器,也就是每过预设的一段时间detector会检查所有的主机的状态。

若这个主机没有处在eject状态则不会做任何行为,如果这个主机处于被隔离的状态,则会检测他移除时间和现在时间相比,是否满足召回条件。上图中的checkHostForUneject就是专门检查主机状态和判断是否要召回的方法。

介绍这个方法就要提到熔断的最后一个参数baseEjectionTime这个参数意味最小隔离时间,实际隔离时间为最小隔离时间与隔离次数的乘积。在checkHostForUneject这个方法中,如果主机的健康检查为健康则会直接return不作任何行为,如果主机的健康检查并不健康,则会读取baseEjectionTime而后通过计算与隔离次数的乘积得出应当被隔离的时间。当前时刻的时间会以参数的形式传递进来,now和主机最后一次移除相减得出实际隔离的时间。如果应当被隔离的时间小于等于实际被隔离的时间则会将主机召回并且重置统计参数,反之则不会有任何行为。

异常点检查仍有许多istio未开放的参数,例如GatewayFailure、SuccessRate、最小健康实例数等。其实现上和负载均衡,健康检查等特性有较强的关联,许多细节仍需分析和实验。

相关服务请访问https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019

idou老师教你学Istio :5分钟简析Istio异常检测的更多相关文章

  1. idou老师教你学Istio11 : 如何用Istio实现流量熔断

    在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...

  2. idou老师教你学Istio 07: 如何用istio实现请求超时管理

    在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...

  3. idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理

    本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...

  4. idou老师教你学Istio 28:istio-proxy check 的缓存

    功能概述 istio-proxy主要的功能是连接istio的控制面组件和envoy之间的交互,其中check的功能是将envoy收集的attributes信息上报给mixer,在istio中有几十种a ...

  5. idou老师教你学Istio 04:Istio性能及扩展性介绍

    Istio的性能问题一直是国内外相关厂商关注的重点,Istio对于数据面应用请求时延的影响更是备受关注,而以现在Istio官方与相关厂商的性能测试结果来看,四位数的qps显然远远不能满足应用于生产的要 ...

  6. idou老师教你学istio1:如何为服务提供安全防护能力

    之前,已为大家介绍过 Istio 第一主打功能---连接服务. 凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. ...

  7. idou老师教你学Istio:如何用 Istio 实现速率限制

    使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...

  8. idou老师教你学Istio 24:如何在Istio使用Prometheus进行监控

    使用Prometheus进行监控是Istio提供的监控能力之一.Istio提供丰富的监控能力,为网格中的服务收集遥测数据.Mixer是负责提供策略控制和遥测收集的Istio组件. Istio通过Mix ...

  9. idou老师教你学Istio 23 : 如何用 Istio 实现速率限制

    使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...

随机推荐

  1. iOS技术面试07:第三方框架

    1ios框架分为:cocoa Touch:UIKit.Foundation.附属框架 Media:OpenGL ES.EAGL.Quartz.Core Animation.Core Audio.    ...

  2. Java中让fastJson识别Colloction和Map中的泛型类

    由于fastJson的高效性,最近采用fastJson来做序列化并存储数据,但出现了一个麻烦的问题,如果将Map<K,V>这样的类型序列化,反序列化就会不尽人意,有以下尝试: 使用JSON ...

  3. 解决Windows7下virtualbox安装ubuntu出现的0x00000000指令引用0x00000000内存,该内存不能为written问题

    公司电脑只能用Windows7,不能用10,也没WSL用,最近想跑个Linux环境,因为之前装docker toolbox装了virtualbox,没道理再装vmware,遂用vbox开始折腾,没想到 ...

  4. 迷惑性很强的crontab

      提到定时任务,我们通常会想起linux的crontab,可以说服务器端大部分定时任务都是由它完成的.这东西固然耗用,但是坑也不少.   这不,昨天我在部署一个备份任务的时候,就不幸踩坑了.差点酿成 ...

  5. 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构

    目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...

  6. FishingMaster(HDU-6709)【贪心】

    题目链接:https://vjudge.net/problem/HDU-6709 题意:一个人要抓n条鱼,每抓一条鱼用时K,每烹饪一条鱼用时a[i],抓鱼的过程不能被打断,烹饪鱼的时候可以抓鱼,也可以 ...

  7. IBM Security AppScan Standard使用方法

    一.常规配置Appscan (安全自动化测试工具) Appscan是web应用程序渗透测试舞台上使用最广泛的工具之一.它是一个桌面应用程序,它有助于专业安全人员进行Web应用程序自动化脆弱性评估.本文 ...

  8. 笔记-8:mysql触发器

    1.触发器介绍 触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件出现时,将会被激活. mysqk触发器只支持:INSERT.UPDATE.DELETE语句. 每个表每个事件每次只允许一 ...

  9. Django ORM 高性能查询优化

    一.QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Entry.objects.all( ...

  10. py kafka

    # https://github.com/confluentinc/confluent-kafka-python/blob/master/examples/consumer.py #生产者 impor ...