通過MSE注冊配置中心提供的高可用能力,可以有效提升應用應對風險的能力。根據高可用的作用域,可以將具體實踐分為注冊配置中心實例高可用、服務發現高可用以及配置管理高可用。本文以MSE注冊配置中心專業版為例進行闡述。
版本推薦
spring-cloud-alibaba
:推薦使用2.2.6.RELEASE及以上版本。dubbo
:推薦使用2.7.12及以上版本。spring-boot
:推薦使用2.3.x及以下版本,2.4.x版本存在兼容問題,不推薦使用。
注冊配置中心實例高可用
高可用架構
沒有任何服務百分百可用,如果您的業務有更高的高可靠性和數據安全需求,建議選擇不少于3個節點進行實例部署。當其中某個實例故障時,節點間秒級完成切換,故障節點自動離群。
專業版注冊配置中心基于Nacos 2.0新架構基礎之上,在高可用方面降低了對底層基礎設施的依賴,進一步提升了容災能力。相關內容,請參見實例及版本選型。
多可用區
MSE每個地域都包含多個可用區。處于同一個地域中不同可用區的應用相互之間網絡延遲很小(3 ms以內),同時提供了故障隔離。多可用區實例將物理服務器部署在不同的可用區,當可用區A出現故障時,流量會在短時間內切換到另一個可用區B。整個過程您無需感知,應用代碼無需變更。您只需配置多個節點部署,MSE自動部署到多個可用區。
服務發現高可用實踐
服務發現包含服務消費者(Consumer)和服務提供者(Provider)。其中服務消費者(Consumer)提供推空保護能力,服務提供者(Provider)提供容災保護能力。
服務消費者(Consumer)
服務消費者(Consumer)會從注冊中心上訂閱服務提供者(Provider)的實例列表。沒有任何服務百分百可用,注冊中心在進行變更(變配、升降級)或遇到突發情況(例如,可用區斷網斷電)時,都有可能導致訂閱異常,影響服務消費者(Consumer)的可用性。
為了應對不可預知的情況下訂閱列表異常,可以在Consumer側配置推空保護。
無推空保護時:Consumer訂閱到空列表,業務中斷報錯。
開啟推空保護:Consumer訂閱到空列表,推空保護生效,丟棄變更,保障業務服務可用。
配置方式
目前僅支持nacos-java-client
1.4.1及以上版本,關于Spring Cloud和Dubbo應用的版本,請參見版本推薦。
Spring Cloud應用
在配置中增加如下配置:
spring.cloud.nacos.discovery.namingPushEmptyProtection=true
Dubbo應用
在registry.url里添加以下參數:
namingPushEmptyProtection=true
持久化緩存
客戶端的推空保護生效后,如果您使用容器進行部署,當容器重啟后,可能會丟失緩存目錄。因此需要將推送緩存的目錄進行持久化(掛載Volume)。
緩存目錄為:${user.home}/nacos/naming/${namespaceId}
。
服務提供者(Provider)
服務提供者(Provider)容災保護主要用于避免集群在異常流量下出現雪崩。
nacos-java-client
2.x版本注冊的Provider暫時不支持Provider側的容災。
無容災保護
當來自Consumer端的請求量突然增加時,如果Provider容量水位較高,會導致個別Provider發生故障:
注冊中心會將故障節點摘除,全量流量會給剩余節點。
剩余Provider節點負載變高,大概率也會發生故障。
最終所有Provider節點故障,100%無法提供服務。
有容災保護
當來自Consumer端的請求量突然增加時,如果Provider容量水位較高,導致個別Provider發生故障:
注冊中心會將故障節點摘除,全量流量會給剩余節點。
故障節點數達到保護閾值,流量平攤給所有實例。
最終保障50%節點能夠提供服務。
開啟容災保護
支持的實例范圍
持久化實例:完全支持。
非持久化實例:
nacos-java-client
1.x版本:默認30秒會刪除不健康的實例,被刪除的實例將不會參與閾值的計算,導致容災策略失效。nacos-java-client
2.x版本:無效。長連接斷開后會立即下線實例,容災策略無法生效。
通過命令行配置
調整指定服務的閾值
curl -X PUT "${nacos.address}/nacos/v1/ns/service?namespaceId=public&serviceName=my-provider&protectThreshold=0.6"
${nacos.address}
:注冊中心地址。namespaceId
:命名空間(默認值:public)。serviceName
:Spring Cloud應用服務名或Dubbo應用接口名。
查詢閾值配置
curl -X GET "${nacos.address}/nacos/v1/ns/service?namespaceId=public&serviceName=my-provider"
返回結果
{"namespaceId":"public","groupName":"DEFAULT_GROUP","name":"my-provider","protectThreshold":0.7,"metadata":{},"selector":{"type":"none"},"clusters":[]}
服務治理高可用配置
通過服務治理功能,開啟服務無損上下線、離群實例摘除、配置服務降級等功能,也能夠提高應用可用性。
配置管理高可用實踐
配置管理的高可用能力主要有以下兩個方面,一方面是配置管理客戶端的緩存目錄及容災目錄,另外一方面是配置中心多維度的限流能力。
以下配置管理高可用能力在注冊配置中心專業版中默認開啟,您無需操作。
客戶端
緩存目錄:每次客戶端和配置中心進行數據交互后,會保存最新的配置內容至本地緩存目錄中,當服務端不可用狀態下,會使用本地緩存目錄中內容。
容災目錄:當服務端不可用時,可以在本地的容災目錄中手動更新配置內容,客戶端會優先加載容災目錄下的內容,模擬服務端變更推送的效果。
配置中心
配置中心的高可用能力,除了基礎運維層面的高可用外,服務應用層部署了多維度的限流能力,包括針對連接的單機最大連接限流,單客戶端IP的連接限流能力。發布配置的秒級、分鐘級數量限流,精確到配置維度的秒級、分鐘級流量限流等,以降低非正常流量下的服務端宕機風險。