在微服务架构中,当服务提供者的应用实例出现异常,而服务消费者无法感知时会影响服务的正常调用,并影响消费者的服务性能甚至可用性。离群实例摘除功能会检测应用实例的可用性并进行动态调整,以保证服务成功调用,从而提升业务的稳定性和服务质量。本文介绍如何创建离群实例摘除策略。
背景信息
在下图的示例场景中,某个系统包含4个应用,A、B、C和D,其中应用A会分别调用应用B、C和D。当应用B、C或D的某些实例异常时(如图中红色圆圈所示,应用B有一个异常实例,C和D有2个异常实例),如果应用A无法感知,会导致部分调用失败;如果B、C、D的异常实例较多,有可能影响应用A的性能甚至服务可用性。
Spring Cloud离群摘除功能是基于Ribbon负载均衡刷新机制实现,依赖Ribbon负载均衡刷新动作。Ribbon负载均衡刷新默认间隔是30秒,如果配置的恢复检测单位时间小于30秒,会出现恢复不及时的问题。
为了保护应用A的服务性能和可用性,可以为应用A配置离群实例摘除。配置后,即可监控B、C、D应用的实例状态并进行动态调整(摘除或添加),以保证服务成功调用。
离群实例摘除流程如下:
当应用B、C或D的某个实例异常时,系统能够检测到,并根据配置的摘除实例比例上限判断是否将对应的实例从应用中摘除。
摘除实例后,A的调用请求不再被分发到B、C、D的异常实例上。
按配置的恢复检测单位时间开始检测异常实例是否恢复。
检测间隔随检测次数按恢复检测单位时间(默认为0.5分钟)线性增加,当达到设置的未恢复累计次数上限后,会按最长时间间隔持续检测异常实例是否恢复。
当检测到实例恢复后,将实例重新添加到应用的实例列表中,处理调用请求。同时,将检测间隔重置为恢复检测单位时间,例如0.5分钟。
当提供者应用的异常实例数量过多(超过摘除实例比例上限)时,仅按照设置的比例摘除。
当提供者应用中仅剩最后一个可用实例时,即使错误率超过配置的阈值,也不会摘除该实例。
创建离群实例摘除策略
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 ,然后单击目标应用的资源量卡片。
在目标应用详情页面的左侧导航栏,单击流量治理,然后选择离群实例摘除页签。
在离群实例摘除页面,单击创建离群实例摘除策略,然后配置相关配置项,最后单击确定。
配置项
说明
策略名称
自定义策略名称。
被调用服务所用框架
根据需要选择Spring Cloud或者Dubbo框架。
选择生效应用
选择生效应用移至已选应用。
说明选择生效应用后,该应用调用的所有应用的异常实例会被摘除。摘除期间,生效应用的调用请求将不再被分发到异常实例。
错误率下限
被调用的应用中某个应用实例的错误率高于设置的域值后,将摘除该实例。默认值为50%。例如,该实例在统计时间窗口内被调用10次,有6次调用失败,错误率为60%,超过了配置的错误率域值(50%),则从应用中移除该实例。
高级配置
异常类型
包含网络异常和网络异常 + 业务异常(HTTP 5xx),根据实际业务需求选择。
QPS下限
QPS按照统计时间窗口进行计算,Dubbo版本和Spring Cloud应用的统计时间窗口都为10秒。当在统计时间窗口内应用的QPS达到设置的下限后开始进行错误率统计分析。
摘除实例比例上限
摘除的异常实例比例上限,即达到阈值后,不再摘除异常实例。摘除异常实例数向下取整,例如应用实例总数为6,摘除实例比例设置为60%,摘除实例比例数为6 * 60% = 3.6,则按策略最多摘除的实例数为3。若计算结果小于1,则不会摘除实例。
恢复检测单位时间
在异常实例被摘除后,不断按单位时间线性累加的时间作为检测间隔,去检测异常实例是否恢复正常,单位为ms。默认为30000 ms,即0.5分钟。
未恢复累计次数上限
持续对异常实例进行检测,检测间隔随检测次数按恢复检测单位时间线性增加,当达到设置的检测次数上限后,会按最长时间间隔持续检测异常实例是否恢复。例如恢复检测单位时间设置30000 ms,未恢复累计次数上限设置为20,在第20次检测异常实例仍未恢复后,则会按10分钟(20 x 30000 ms)为间隔执行后续的检测。如果检测到实例已经恢复,则会将检测间隔重置为初始的时间间隔,即一次恢复检测单位时间。
说明未恢复累计次数上限不建议配置太大。配置太大会导致最长检测间隔时间较长,如果实例在检测间隔早期恢复,仍需等到检测间隔到时再进行检测,导致期间实例资源被浪费,未能及时处理业务调用请求。
默认状态
默认开启离群实例摘除策略。
说明如果使用的是Spring Cloud框架,负载均衡使用的是Ribbon,并且配置的恢复检测单位时间小于30秒,那么需要您检查一下您负载均衡刷新时间间隔的配置ribbon.ServerListRefreshInterval(默认30秒),如果未修改该配置,建议您将其值调整至小于恢复检测单位时间的值,否则会出现恢复不及时的问题。如果ribbon.ServerListRefreshInterval配置过大,也会影响摘除的灵敏度。
结果验证
返回离群实例摘除页面,查看已创建的策略是否已显示在策略列表中。
后续步骤
在策略列表的操作列单击编辑或删除,可以编辑或删除离群实例摘除策略。
- 本页导读 (1)