二. 单机故障和服务降级
2.1 SOFARPC故障剔除 vs 注册中心故障剔除
2.2 服务权重降级 vs 服务降级
三. 单机故障原理解析
3.1 整体结构和入口
3.2 信息收集器(数据结构、窗口计算)
3.3 度量策略 3.4 计算策略 3.5 降级策略 3.6 恢复策略
一. 前言
问题:大量资金操作,网络、硬件导致系统不稳定,影响用户体验,资损。
可用性常见方案 集群(冗余),避免单点问题,避免不了某些场景单机故障引起服务调用失败
解决:SOFARPC 提供自动单机故障剔除能力,自动监控 RPC 调用情况,对故障节点进行权重降级,节点恢复健康时进行权重恢复,提高系统可用性。
二. 单机故障和服务降级
硬件负载(每次请求都需要经过):集群规模增加、流量增多,无法支撑。
软负载:提供注册中心,将负载能力转移到服务调用方( Consumer ),注册中心只有在 Consumer 首次订阅或服务发生变化时才会发生交互,避免了并发访问下单点问题:
软负载以下场景导致服务不可用:
(1) 挂:Provider (单点故障或宕机),与 Consumer 长连接断开,注册中心尚未摘除或未及时通知Consumer
(2)不好:长连存在,注册中心未下发摘除,服务器端由于某些原因超时、异常率高,如长时间 Full GC、硬件故障、压力瓶颈。(此现象服务节点为亚健康服务节点)。
1不调用,2少调用;通过权重控制。流量到正常服务机器上。
2.1 SOFARPC故障剔除 vs 注册中心故障剔除
SOFARPC 的故障剔除与注册中心故障服务剔除区别:
故障剔除的时机、细粒度
(1)故障剔除的时机
1)注册中心服务管理关注 Provider 与注册中心的心跳或长连接。如 Provider心跳异常或长连接不在,将服务从注册中心剔除,告知 Consumer 移除本地缓存的故障 Provider 信息。Comsumer 负载均衡选择时不考虑被剔除 Provider:
2)SOFARPC 单机故障剔除:针对注册中心未剔除服务,与 Consumer 仍然保持长连接,但亚健康状态,不能提供正常服务:
(2)故障剔除的细粒度
注册中心剔除:单机上某个服务进程(进程级别)。和注册中心断开连接或无心跳,则从注册中心剔除。
SOFARPC 故障剔除:细致到进程对外暴露服务(IP + 服务),部署在某个机器上的交易系统对外提供的交易查询服务 TransQueryService(服务接口)
2.2 服务权重降级 vs 服务降级
降级级别:整个系统服务,不是接口级别。
SOFARPC 服务降级:亚健康节点,导致接口响应异常
维度: IP + 服务维度,如TransQueryService 服务。
三. 原理解析
采用自动化监控和降级。支持单机故障剔除能力,SOFARPC 提供几个方面设计:
(1)入口设计: RPC调用时,增加信息统计传递入口。不破坏开闭原则
(2)信息收集器 : 维护、管理从入口传来的统计信息
(3)计算策略 : 根据度量结果,判断是否需要降级或恢复服务。触发降级、恢复行为。
(4)度量策略 : 按一定维度对调用信息做度量,判断服务正常或异常。
(5)降级策略 : 指定处理逻辑,如按打印日志或降低权重。
(6)恢复策略 :如何恢复该服务,如提高权重。
3.1 整体结构和入口
单机故障剔除能力(和链路追踪一样)基于内核设计和总线设计,可插拔、零侵入。
(1)模块 FaultToleranceModule, 通过 SOFARPC 的 SPI 机制完成模块的自动化加载,完成插入。包含:
subscriber 事件订阅器: 通过订阅事件总线 EventBus 的事件,零侵入完成 RPC 调用统计和信息收集。
regulator 调节器(核心):根据收集的 RPC 调用信息,完成服务调用或服务权重调节,服务降级、恢复。内置信息收集器、计算、度量、恢复策略。
(2)FaultToleranceModule 两种调用事件:
同步结果事件: ClientSyncReceiveEvent, 收集和统计 RPC 同步 调用和异常的次数。
异步结果事件: ClientAsyncReceiveEvent,收集和统计 RPC 异步 调用和异常的次数。
FaultToleranceModule单机故障剔除功能默认关闭,需开启 regulationEffective 全局开关。
RPC 调用后会向事件总线 EventBus 发送对应事件。
FaultToleranceModule 订阅者收到对应事件,调用统计存储到信息收集器中(第一次存触发 Measure 定时任务)。
Measure 获取信息交给度量计算(调用计算策略),调用降级策略执行降级、恢复操作,如打印日志或降低故障服务权重。
负载均衡器(默认是 random + weight 负载均衡):权重低流入少。
3.2 信息收集器
数据结构
CopyOnWriteArrayList 数据结构保证线程安全。
MeasureModel 按 app + service 维度存储,如交易系统中的交易查询服务 TransQueryService. 部署多个机器上,MeasureModel维护这些所有服务, InvocationStat维护这些机器上服务调用关系。
假设两个服务 ApiGateWay 和 TransCenter分别部署在两台机器上。 TransCenter 向ApiGateWay提供交易查询(TransQueryService)服务
InvokeStat是基于 consumer + provider + service 维度,InvokeStat1 表示 ApiGateway1 调用了 TransCenter-1 的 TransQueryService 服务。 TransCenter 的MeasureModel 数据模型结构如下:
窗口计算
InvokeStat用原子类保证并发安全。订阅器收到结果,从工厂中获取InvokeStat(InvokeStat存在直接返回,没有创建保持到缓存)。调用 invoke 和 catchException 方法统计调用次数和异常次数。
窗口到期时,从 MeasueModel 各个 InvokeStat 创建镜像数据,表示当前串口内调用情况。原 InvokeStat 进入下个窗口进行统计,为扣除上一个窗口统计信息因此该窗口数据包含上个窗口的统计数据。当度量策略将本窗口的镜像数据统计完成以后,会将 InvokeStat 的数据扣除掉当前窗口的镜像数据,使 InvokeStat 中数据为下个窗口调用数据。
3.3 度量策略
度量策略会计算模型 MeasureModel 里的数据度量,选正常、异常节点。 默认采用服务水平 IP 资源度量策略,某个 IP 异常率大于平均判定异常。
度量策略将计算模型设置为三种状态:HEALTH(正常)、ABNORMAL(异常)、IGNORE(忽略) 相互转化。
度量策略大致逻辑如下:
(1)统计该服务下所有 IP 平均异常率 averageExceptionRate= 异常总数 / 总调用次数 =(1 + 4) / (5 + 10 + 10) = 0.2
(2)IGNOGRE:调用次数小于该服务最小窗口调用次数( leastWindCount ) 。否则降级和恢复度量。 如leastWindCount =6 , invokeStat 1 忽略
(3)异常率和服务平均异常比例 windowExceptionRate 大于 配置的 leastWindowExceptionRateMultiplte (最小时间窗口内异常率和服务平均异常率的降级比值), 为 ABNORMAL, 否则为 HEALTH
(4)windowExceptionRate 是异常率和平均异常比例,invokeStat 1 : 4/5 = 0.8, windowExceptionRate : 0.8 / 0.2 = 4。 假设 leastWindowExceptionRateMultiplte =4, invokeStat 1 是一次服务,则需要进行降级操作。
3.4 计算策略
根据度量结果,判断降级、恢复服务。
3.5 降级策略
降级策略执行器,获取到当前正在度量接口和结果,对其权重进行逐步降级,初始权重 100 为例
设置降级速率是 2,第一个窗口被降级 100/2=50 。第二次50/2=25,达到最小权重,不再降。每次 Consumer 进行调用操作时能够被负载均衡击中几率小很多,甚至无法击中。
3.6 恢复策略
正常权重为100,异常机器权重为1,恢复速率为2,在下个时间窗口中,触发恢复策略,1*2=2,2*2=4,直到达到默认权重100。
两种情况:(1)Consumer 客户端重启后,收集器数据因保存内存都会消失,所有权重的计算都会重新开始。
(2)异常服务端(Provider)重启后,服务端正常服务,客户端在时间窗口内调用正常,权重恢复。
四. 总结
(1)SOFARPC 5.3.0 支持故障剔除功能,亚健康长连接降级,客户端请求指向健康节点。恢复后,逐渐将流量分发到该节点。所有逻辑在客户端执行。
(2)SOFARPC 的内核设计和事件总线设计,不破坏开闭性。FaultToleranceModule 包含了两部分:
事件订阅:订阅同步和异步结果事件,统计手机 RPC 调用信息入口。
调节器:根据收集信息、内置策略,来降级和恢复。包含信息收集器、计算策略、度量策略、降级策略和恢复策略。