【服务网格架构】Envoy架构概览(6):异常检测
弹射算法
取决于异常值检测的类型,弹出或者以行内(例如在连续5xx的情况下)或以指定的间隔(例如在定期成功率的情况下)运行。弹射算法的工作原理如下:
- 主机被确定为异常。
- 特使检查以确保弹出的主机数量低于允许的阈值(通过outlier_detection.max_ejection_percent设置指定)。如果弹出的主机数量超过阈值,主机不会被弹出。
- 主机被弹出几毫秒。弹出表示主机被标记为不健康,在负载平衡期间不会使用,除非负载平衡器处于紧急情况。毫秒数等于outlier_detection.base_ejection_time_ms值乘以主机被弹出的次数。这会导致主机如果继续失败,则会被弹出更长和更长的时间。
- 弹出的主机将在弹出时间满足后自动重新投入使用。一般而言,异常值检测与主动健康检查一起使用,用于全面的健康检查解决方案。
检测类型
Envoy支持以下异常检测类型:
连续5xx
如果上游主机返回一些连续的5xx,它将被弹出。请注意,在这种情况下,5xx意味着一个实际的5xx响应代码,或者一个会导致HTTP路由器代表上游返回的事件(复位,连接失败等)。弹出所需的连续5xx数量由outlier_detection.consecutive_5xx值控制。
连续的网关故障
如果上游主机返回一些连续的“网关错误”(502,503或504状态码),它将被弹出。请注意,这包括会导致HTTP路由器代表上游返回其中一个状态码的事件(重置,连接失败等)。弹出所需的连续网关故障的数量由outlier_detection.consecutive_gateway_failure值控制。
成功率
基于成功率的异常值弹出汇总来自群集中每个主机的成功率数据。然后以给定的时间间隔基于统计异常值检测来弹出主机。如果主机在聚合时间间隔内的请求量小于outlier_detection.success_rate_request_volume值,则无法为主机计算成功率异常值弹出。此外,如果一个时间间隔内请求量最小的主机数量小于outlier_detection.success_rate_minimum_hosts值,则不会对群集执行检测。
弹射事件记录
Envoy可以选择生成异常值弹出事件日志。这在日常操作中非常有用,因为全局统计数据不能提供有关哪些主机被弹出的信息以及原因。日志使用每行一个对象的JSON格式:
{
"time": "...",
"secs_since_last_action": "...",
"cluster": "...",
"upstream_url": "...",
"action": "...",
"type": "...",
"num_ejections": "...",
"enforced": "...",
"host_success_rate": "...",
"cluster_success_rate_average": "...",
"cluster_success_rate_ejection_threshold": "..."}
time
事件发生的时间。
secs_since_last_action
自从上一次操作(弹出或未注射)发生以秒为单位的时间。由于在第一次喷射之前没有动作,所以该值将为-1。
cluster
拥有弹出主机的群集。
upstream_url
弹出的主机的URL。例如,tcp://1.2.3.4:80。
action
发生的行动。如果主机被弹出,则弹出;如果弹出主机,则弹出。
type
如果操作弹出,指定发生的弹出类型。当前类型可以是5xx,GatewayFailure或SuccessRate之一。
num_ejections
如果操作被弹出,则指定主机已被弹出的次数(对于该特使而言是本地的,并且如果主机由于任何原因从上游集群移除并且然后被重新添加)则被重置。
enforced
如果操作被弹出,则指定弹出是否被强制执行。真正意味着主机被弹出。假意味着事件被记录了,但是主机并没有被弹出。
host_success_rate
如果操作弹出,并且类型为SuccessRate,则指定喷射事件发生时在0-100范围内的主机成功率。
cluster_success_rate_average
如果操作弹出,并且类型为SuccessRate,则指定弹出事件时集群中主机在0-100范围内的平均成功率。
cluster_success_rate_ejection_threshold
如果操作弹出,类型为SuccessRate,则指定弹出事件时的成功率弹出阈值。
配置参考
- 集群管理器全局配置
- 每个群集配置
- 运行时设置
- 统计参考
微信公众号 |
关注微信公众号【首席架构师智库】 |
|
---|---|---|
微信小号 |
希望加入的群:架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化,产品转型。 |
|
知识星球 |
向大咖提问,近距离接触,或者获得私密分享。 |
点击加入知识星球【首席架构师圈】 |
微信圈子 |
志趣相投的同好交流。 |
点击加入微信圈子【首席架构师圈】 |
喜马拉雅 |
路上或者车上了解最新黑科技资讯,架构心得。 |
点击,收听【智能时刻,架构君和你聊黑科技】 |
知识星球 |
认识更多朋友,职场和技术闲聊。 |
点击加入知识星球【知识和技术】 |
- Twemproxy——针对MemCached与Redis的代理
- 谁适合学Python?学了Python可以做什么工作?
- webservice今日遇到的二个问题:DataTable + Namespace
- php安全配置记录和常见错误梳理
- Flex:地图缩放平移效果(简易版)
- Mongodb副本集+分片集群环境部署记录
- 线上mongodb 数据库用户到期时间修改的操作记录
- 微信小程序“授权失败”场景的处理
- 动软.net代码生成器 win2008 r2下无法连接oracle,以及vs2008模板丢失的解决
- ASP.NET Web API 支持 CORS
- oracle odp.net 32位/64位版本的问题
- Redis+TwemProxy(nutcracker)集群方案部署记录
- 金融科技新常态,未来开启拼“硬实力”阶段
- Mono 3 的默认Gc是Sgen
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 操作系统与 CPU 是怎么执行线程的?
- LeetCode 5 题解
- 详细齐全!Docker常用基本命令
- angular浏览器兼容性问题解决方案
- Python 基础(二十二):正则表达式
- Python 进阶(一):多线程
- Python 进阶(二):多进程
- MySQL information_schema详解 EVENTS
- Python 进阶(三):邮件的发送与收取
- MySQL information_schema详解 FILES
- MySQL information_schema详解 GLOBAL_STATUS和SESSION_STATUS
- Python 进阶(四):数据库操作之 MySQL
- Python 进阶(五):数据库操作之 SQLite
- Python 进阶(六): Excel 基本操作
- 基于Rust-vmm实现Kubernetes运行时