1. 程式人生 > >Eureka報錯“EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ”

Eureka報錯“EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ”

背景1:Eureka自我保護機制

  預設情況下,如果Eureka Server在一定時間內(預設90秒)沒有接收到某個微服務例項的心跳,Eureka Server將會移除該例項。但是當網路分割槽故障發生時,微服務與Eureka Server之間無法正常通訊,而微服務本身是正常執行的,此時不應該移除這個微服務,所以引入了自我保護機制。
  自我保護機制的工作機制是如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,Eureka Server自動進入自我保護機制,此時會出現以下幾種情況:

1、Eureka Server不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務。
2、Eureka Server仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。
3、當網路穩定時,當前Eureka Server新的註冊資訊會被同步到其它節點中。

背景2:關於自我保護的兩個引數renews和threshold

eureka預設心跳週期30s,即一分鐘兩次。
Renews threshold:心跳次數閾值
Renews (last min):過去一分鐘eureka server收到的心跳數目
RenewalPercentThreshold:保護機制觸發閾值,預設0.85
示例:假如你起了一個eureka server和一個client,eureka最小threashold是1(寫死在eureka程式碼中),另client一分鐘發兩次心跳,那麼threshold=1+2*1
如果Renews < threashold * RenewalPercentThreshold

則觸發保護機制,並報出如題的錯誤。2 < 0.85*3,因此報錯。

解決方法:

1、deploy two Eureka server and enable registerWithEureka.
原因分析如下:

s:count of server
c:count of client

2(s+c) < [1 + 2(s+c)] * 0.85

set 2(s+c) as A

A < (1 + A) * 0.85
A < 5.666

因此,只有server與client的數量和大於2.83,才不會觸發保護機制,兩個server加一個client,3>2.83,不會觸發保護機制。

2、If you just want to deploy in demo/dev environment, you can set eureka.server.renewalPercentThreshold to 0.49, so when you start up a Eureka server alone, threshold will be 0.