Eureka介面EMERGENCY提示背後的保護機制
背景:
SpringCloud Eureka 投入使用很久了,server介面一直有紅色提示:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.
RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE
這個雖然不影響使用,但背後體現的是Eureka保護機制,甚至可以延伸到分散式基礎CAP理論,我們來研究下吧~
一、Eureka 保護機制
Eureka Server 在執行期間會去統計心跳失敗比例在 15 分鐘
eureka.server.renewal-percent-threshold = 0.85
),如果低於 85%,就會觸發 Eureka 的保護機制,Eureka Server 會將這些例項保護起來,讓這些例項不會過期(即註冊中心服務列表不會剔除該例項),但是在保護期內如果服務剛好這個服務提供者非正常下線了,此時服務消費者就會拿到一個無效的服務例項,此時會呼叫失敗,對於這個問題需要服務消費者端要有一些容錯機制,如重試,斷路器等。
Web介面可以看到2個引數:
Renews threshold :Eureka Server 期望每分鐘收到客戶端例項續約的總數。
Renews (last min)
Renews threshold的計算公式:
protected void updateRenewsPerMinThreshold() {
this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews
* (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())
* serverConfig.getRenewalPercentThreshold());
}
自我保護閥值 = 服務總數(包括自注冊) * 每分鐘續約數 * 自我保護續約百分比閥值因子(eureka.server.renewal-percent-threshold:預設0.85
)。
其中 每分鐘續約數 =(60S/客戶端續約間隔 lease-renewal-interval-in-seconds:預設30s
)
自我保護模式啟用邏輯:
Eureka Server提供了一個EvictionTask定時(eviction-interval-timer-in-ms: 預設60s
)清理續約超時的服務。清理之前首先判斷是否需要清理(isLeaseExpirationEnabled()
)。
public boolean isLeaseExpirationEnabled() {
if (!isSelfPreservationModeEnabled()) {
// The self preservation mode is disabled, hence allowing the instances to expire.
return true;
}
return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
這個判斷方法首先會判斷是否開啟了自我保護開關(enable-self-preservation
),如果開啟了,則會繼續判斷上一分鐘的續約數是否小於自我保護閥值,如果上一分鐘的續約數(numOfRenewsInLastMin
)小於自我保護閥值(numberOfRenewsPerMinThreshold
),則開啟自我保護機制,不再進行服務的剔除。
二、解決方法
解決方式一般有三種:
1.關閉自我保護模式
在server端配置:
# 關閉保護機制,預設為true
eureka.server.enable-self-preservation: false
# 清理無效節點的時間間隔,預設60s(注:如果不新增這個配置,即使eureka.instance.lease-expiration-duration-in-seconds配置時間很短,也不會馬上剔除節點)
eureka.server.eviction-interval-timer-in-ms: 4000
在client端配置:
# 定義服務失效時間,Eureka服務端收到最後一次心跳之後等待的時間上限,超過該時間之後服務端會將該服務例項從服務清單中剔除,從而禁止服務呼叫請求被髮送到該例項上,單位:秒(預設90s)
lease-expiration-duration-in-seconds: 10
# 定義心跳間隔時間,Eureka客戶端向服務端傳送心跳的時間間隔,單位:秒(預設30s)
# 注意:這種調高頻率的操作只適用於例項較少的Eureka叢集,因為會增加叢集通訊壓力
lease-renewal-interval-in-seconds: 5
2.降低renewalPercentThreshold的比例
將eureka.server.renewal-percent-threshold
比例降低到預設值0.85以下,比如0.4
3.部署多個 Eureka Server 並開啟其客戶端註冊
將eureka.client.register-with-eureka
不要設為false,預設為true(待測試)
個人建議:測試環境可以關閉保護模式,生產環境最好開啟保護模式,部署多個 Eureka Server並開啟client註冊!
Eureka 的自我保護模式是有意義的,該模式被啟用後,它不會從註冊列表中剔除因長時間沒收到心跳導致租期過期的服務,而是等待修復,直到心跳恢復正常之後,它自動退出自我保護模式。這種模式旨在避免因網路分割槽故障導致服務不可用的問題。
例如,兩個客戶端例項 C1 和 C2 的連通性是良好的,但是由於網路故障,C2 未能及時向 Eureka 傳送心跳續約,這時候 Eureka 不能簡單的將 C2 從登錄檔中剔除。因為如果剔除了,C1 就無法從 Eureka 伺服器中獲取 C2 註冊的服務,但是這時候 C2 服務是可用的。
三、擴充套件:CAP理論
CAP理論,指的是在一個分散式系統中, Consistency
(一致性)、 Availability
(可用性)、Partition tolerance
(分割槽容錯性),三者不可得兼。
一致性(C):在分散式系統中的所有資料備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的資料副本)
可用性(A):在叢集中一部分節點故障後,叢集整體是否還能響應客戶端的讀寫請求。(對資料更新具備高可用性)
分割槽容忍性(P):大多數分散式系統都分佈在多個子網路。每個子網路就叫做一個區(partition)。分割槽容錯的意思是,區間通訊可能失敗。比如,一臺伺服器放在中國,另一臺伺服器放在美國,這就是兩個區,它們之間可能無法通訊;
一般來說,分割槽容錯無法避免,因此可以認為 CAP 的 P 總是成立。CAP 定理告訴我們,剩下的 C 和 A 無法同時做到
在分散式系統的設計中,沒有一種設計可以同時滿足一致性,可用性,分割槽容錯性 3個特性;
注意:不要將 弱一致性、最終一致性 放到CAP理論裡混為一談
那麼我們對這三者如何權衡?
犧牲分割槽容錯性 (CA)
作為分散式系統,分割槽必然總會發生(2年1次50分鐘還是1年3次共10分鐘?),因此認為CAP的討論是大部分建立在P確立前提下。假設我們犧牲了P這個時候因為網路故障發生了分割槽導致節點不可用,這個時候請求響應了error、timeout,與可用性的定義相沖突了。
但是,我們又假如分割槽大部分時間是不存在的,這時對單節點的讀\寫,那麼就無需作出C、A的取捨。但是上面說分割槽總會發生這不互相矛盾麼,還是取捨。假如1年時間內99.99%時間是正常的,不可用時間為0.01%(52.56分鐘)不可用,若這個時間屬於業務接受範圍,或者只在某個地區(華南、華北、華中?)有影響,那麼CA也是可以選擇的。
犧牲可用性 (PC)
最典型的案例是RDBMS叢集與Redis叢集,這兩種都是利用主從複製實現讀寫分離的方案。假如兩者都是建立一主多從的叢集,在主節點寫入資料,為了保證隨後的讀操作獲取最新資料(一致性),這個讀操作仍會請求主節點(讀寫分離的複雜點在從庫同步不及時導致業務的異常,為了保證業務的正常性寫後的讀會請求主庫),某個從節點掛了但是隻要主節點和其他從節點仍然正常運作,就滿足分割槽容錯性。但是哪天主節點因為網路故障導致寫操作的error或者timeout,那麼這個系統就不可用了(犧牲可用性)。
這個時候可以引入其他功能和機制完成,例如Redis哨兵模式、故障轉移功能。
犧牲一致性 (PA)
最典型的案例是Cassanda叢集和Riak叢集,這種型別的分散式資料庫,可以任意節點寫入,任意節點讀取,當作為叢集出現,無論寫入哪個節點,都將會把該節點的資料同步到其他節點上,因為這種同步方式,讀取資料時只要訪問一個節點就足夠了(喜歡任意訪問也不攔著你),但是因為其他節點資料同步原因,資料可能並不是最新的(犧牲一致性)。如果當前節點因為網路異常導致分割槽變得不可用(無論讀\寫),可以轉移訪問節點(可用性)。
另外這裡說的犧牲一致性,並不代表放棄一致性,而PA選擇的是最終一致性(系統中所有的資料副本,在經過一段時間的同步後,最終能夠達到一個一致的狀態)
Eureka在CAP理論當中是屬於PA , 根據前面研究的保護機制,當產生網路分割槽時,Eureka保證系統的可用性,但不保證系統裡面資料的一致性, 舉個例子。當發生網路分割槽的時候,Eureka-Server和client端的通訊被終止,server端收不到大部分的client的續約,這個時候,如果直接將沒有收到心跳的client端自動剔除,那麼會將可用的client端剔除,這不符合AP理論,所以Eureka寧可保留也許已經宕機了的client端 , 也不願意將可以用的client端一起剔除。 從這一點上,也就保證了Eureka程式的健壯性,符合AP理論
相關推薦
Eureka介面EMERGENCY提示背後的保護機制
背景: SpringCloud Eureka 投入使用很久了,server介面一直有紅色提示: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. R
SpringCloud學習筆記三---Eureka資訊顯示問題, 自我保護機制及叢集搭建
一 Eureka整合到專案中出現的一些細節顯示問題 問題1. 註冊的服務中包含主機名稱 解決方法: 修改microservicecloud-provider-dept-8001 yml檔案中的配置, instance: instance-id
spring cloud中微服務之間的調用以及eureka的自我保護機制
技術 頁面 dba mapping arch 之間 tga build ng- 上篇講了spring cloud註冊中心及客戶端的註冊,所以這篇主要講一下服務和服務之間是怎樣調用的 不會搭建的小夥伴請參考我上一篇博客:idea快速搭建spring cloud-註冊中心與註冊
SpringCloud-Eureka服務註冊與發現之自我保護機制(四)
當我們進行SpringCloud微服務開發的時候,有可能會出現如下的一些紅色提示資訊。這個是Eureka的自我保護機制。 自我保護機制 :預設情況下,如果Eureka Server在一定時間內沒有接收到某個微服務例項的心跳,Eureka S
Eureka控制檯相關介紹及自我保護機制解說
一、Eureka控制檯簡介 對於Eureka大家都有所瞭解,不懂請參考:https://blog.csdn.net/forezp/article/details/81040925 1.進入Eureka控制檯首頁,首先看HOME頁的頭部 【System Stat
Spring Cloud Eureka原理分析(二):續租、下線、自我保護機制和自動清理(服務端)
續租、下線等操作比較直觀,實際上也不復雜。讓我們自己想想它們大概會在服務端有什麼操作。 renew: 更新Lease的lastUpdateTimestamp, 更新一下InstanceInfo的最新狀態。然後呼叫其他同伴節點的renew介面。 cancel:把lease從registry中移除,設
spring cloud中微服務之間的呼叫以及eureka的自我保護機制
這篇主要講一下服務和服務之間是怎樣呼叫的 如果想學習Java工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加我的Java高階交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。 我自己搭建了一個客戶
Netflix Eureka原始碼分析(18)——eureka server網路故障時的的自我保護機制原始碼剖析
假如說,20個服務例項,結果在1分鐘之內,只有8個服務例項保持了心跳 --> eureka server是應該將剩餘的12個沒有心跳的服務例項都摘除嗎? 這個時候很可能說的是,eureka server自己網路故障了,那些服務沒問題的。只不過eureka server
Eureka自我保護機制
預設情況下,當eureka server在一定時間內沒有收到例項的心跳,便會把該例項從登錄檔中刪除(預設是90秒),但是,如果短時間內丟失大量的例項心跳,便會觸發eureka server的自我保護機制,比如在開發測試時,需要頻繁地重啟微服務例項,但是我們很少會把eureka
Ubuntu異常關機後無法啟動圖形介面,提示 Welcome to emergency mode...的解決方法
輸入密碼登入root賬戶; 執行命令 journalctl -xb 檢視日誌輸出,搜尋關鍵字”fsck failed”(輸入/,然後輸入關鍵字後回車,通過N/n檢視上一個/下一個匹配項),在錯誤提示資
SpringCloud-Eaureka主機對映名稱修改、Eureka的自我保護機制
Eaureka主機對映名稱修改 Eaureka主機對映名稱修改 # eureka 客戶端配置 eureka: client: service-url: defa
SpringCloud之eureka詳解(自我保護機制)
1、長時間沒有訪問、檢測不到心跳,或者修改例項名稱,eureka啟動自我保護機制(好死不如賴活著-哈哈) 即:某一個時刻,某一個微服務不可用了,eureka不會立即清理,依舊會對該微服務的資訊進行儲存!!! 自我保護機制詳解: 2、eureka叢集搭建(3個eu
深入理解Eureka自我保護機制(五)
為什麼要有自我保護機制 眾所周知,Eureka在CAP理論當中是屬於AP , 也就說當產生網路分割槽時,Eureka保證系統的可用性,但不保證系統裡面資料的一致性, 舉個例子。當發生網路分割槽的時候,Eureka-Server和client端的通訊被終止,server端收不
Spring Cloud Eureka 服務關閉但是未從註冊中心刪除 自我保護機制,以及如何關閉自我保護機制的辦法
自我保護背景 首先對Eureka註冊中心需要了解的是Eureka各個節點都是平等的,沒有ZK中角色的概念, 即使N-1個節點掛掉也不會影響其他節點的正常執行。 預設情況下,如果Eureka Server在一定時間內(預設90秒)沒有接收到某個微服務例項的心跳,Eure
Spring Cloud Eureka 服務關閉但是未從註冊中心刪除 自我保護機制
背景:由於Eureka擁有自我保護機制,當其登錄檔裡服務因為網路或其他原因出現故障而關停時,Eureka不會剔除服務註冊,而是等待其修復。這是AP的一種實現。 為了讓其有精準的 CP健康檢查,可以採取讓其剔除不健康節點。 server端: eureka.server.
Spring Cloud Eureka emergency提示資訊
問題描述 在Eureka的維護網頁上,出現如下提示資訊。 EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN TH
Spring Cloud Eureka 自我保護機制
Eureka Server 在執行期間會去統計心跳失敗比例在 15 分鐘之內是否低於 85%,如果低於 85%,Eureka Server 會將這些例項保護起來,讓這些例項不會過期,但是在保護期內如果服務剛好這個服務提供者非正常下線了,此時服務消費者就會拿到一個無效的服務例項,此時會呼叫失敗,對於這個問題需要
【一起學原始碼-微服務】Nexflix Eureka 原始碼十一:EurekaServer自我保護機制竟然有這麼多Bug?
前言 前情回顧 上一講主要講了服務下線,已經註冊中心自動感知宕機的服務。 其實上一講已經包含了很多EurekaServer自我保護的程式碼,其中還發現了1.7.x(1.9.x)包含的一些bug,但這些問題在master分支都已修復了。 服務下線會將服務例項從登錄檔中刪除,然後放入到recentQueue中,下
F版本SpringCloud 5—Eureka叢集和自我保護機制
![](https://img2020.cnblogs.com/other/1003051/202003/1003051-20200331151512149-1728990050.png) > 原始碼地址:https://gitee.com/bingqilinpeishenme/Java-Tutori
Spring Cloud系列教程第九篇-Eureka自我保護機制
Spring Cloud系列教程第九篇-Eureka自我保護機制 本文主要內容: 1:自我保護介紹 2:導致原因分析 3:怎麼禁止自我保護 本文是由凱哥(凱哥Java:kagejava)釋出的《spring cloud系列》教程的總第九篇: 本文是幾個維度中的第一個維度:註冊與發現維度配置中