2019-12-26

eureka注册中心意外开启自我保护模式

最近线上出现部分接口调用超时,经排查是一个已经下线的web应用节点未被eureka注册中心踢除,原因是注册中心意外开启自我保护模式,导致注册中心不再剔除任何应用实例。

自我保护模式的目的此处不再赘述,简单说下模式开启的条件:

条件:在 1 分钟后,Renews (last min) < Renews threshold。

这两个参数的意思:

Renews threshold:Eureka Server 期望每分钟收到客户端实例续约的总数

Renews (last min):Eureka Server 最后 1 分钟收到客户端实例续约的总数

threshold的计算方式:实例数每分钟心跳数自我保护系数,每分钟心跳数和自我保护系数可以通过以下配置调整

instance的心跳间隔秒数:eureka.instance.lease-renewal-interval-in-seconds=30

自我保护系数:eureka.server.renewal-percent-threshold=0.85

举例说明,假设有8个应用实例,2个注册中心集群,在模式值的情况下期望心跳数为:

(8+2)20.85 =17,直白的理解,就是保证至少有85%的节点(包含注册中心本身)是正常工作的。

那在线上应用都正常的情况下,为什么注册中心会开启自我保护模式呢?网上找了好久,最终在https://github.com/Netflix/eureka/issues/1127找到了答案:


2019-12-26_第1张图片
更新心跳期望值

注册中心会定时更新Renews Threshold,其中count为所有UP状态的实例,当处在Down,Out_of_Service等状态的节点都不会统计在内,expectedNumberOfClientsSendingRenews的值则始终为前一次更新计算时的总节点数,因此当实例出现非UP状态时,Renews Threshold就有概率不会更新,因为不满足“(count) > (serverConfig.getRenewalPercentThreshold() * expectedNumberOfClientsSendingRenews”,而后当有新的实例注册上来时,expectedNumberOfClientsSendingRenews会累加,导致Renews Threshold相应增加,从而最终超过实际心跳数,开启自我保护模式,并且Renews Threshold无法更新恢复。

总结:

直接原因:Renews Threshold错误累加,无法自动恢复。

解决方式:配置eureka.shouldFilterOnlyUpInstances=false

你可能感兴趣的:(2019-12-26)