天天看點

如何建設高可用系統

面試的時候經常會問一個問題,如何建設高可用系統?大家可以一起探讨下。

“高可用性”(High Availability)通常來描述一個系統經過專門的設計,進而減少停工時間,而保持其服務的高度可用性。以下是高可用系統的設計建議:

設計建議

減少單點 – 去單點首先要識别整個系統所有主鍊路的單點,如機房(同城異地雙機房),應用伺服器,DNS伺服器,SFTP伺服器,LBS,緩存伺服器,資料庫,消息伺服器,代理伺服器和專線等,如系統通過專線調用對方服務,需要考慮同時拉聯通和電信的專線,聯通或電信的專線還是有一定機率會出現問題的,但是同時出問題的機率會小非常多。優先使用軟負載,使用硬負載兜底。

減少依賴 – 減少DNS依賴,減少遠端服務依賴,DNS依賴可以嘗試設定本地host,用工具給所有伺服器推送最新的域名映射關系,通過本地緩存或近端服務減少RPC調用。

限制循環 – 避免無限死循環,導緻CPU使用率百分百,可以設定for循環的最大循環次數,如最大循環1000次。

控制流量 – 避免異常流量對應用伺服器産生影響,可以對指定服務設定流量限制,如QPS,TPS,QPH(每小時總請求量)和QPD(每天總請求量)。

精準監控 – 對CPU使用率,load,記憶體,帶寬,系統調用量,應用錯誤量,PV,UV和業務量進行監控,避免記憶體洩露和異常代碼對系統産生影響,配置監控一定要精準,如平時記憶體使用率是50%,監控可以配置成60%進行報警,這樣可以提前感覺記憶體洩露問題,避免應用無響應。

無狀态 – 伺服器不能儲存使用者狀态資料,如在叢集環境下不能用static變量儲存使用者資料,不能長時間把使用者檔案存放在伺服器本地。伺服器有狀态會難以擴容,且出現單點問題。

容量規劃 – 定期對容量進行評估。如大促前進行壓測和容量預估,根據需要進行擴容。

功能開關 – 打開和關閉某些功能,比如消息量過大,系統處理不了,把開關打開後直接丢棄消息不處理。上線新功能增加開關,如果有問題關閉新功能。

設定逾時 – 設定連接配接逾時和讀逾時設定,不應該太大,如果是内部調用連接配接逾時可以設定成1秒,讀逾時3秒,外部系統調用連接配接逾時可以設定成3秒,讀逾時設定成20秒。

重試政策 – 當調用外部服務異常時可以設定重試政策,每次重試時間遞增,但是需要設定最大重試次數和重試開關,避免對下遊系統産生影響。

隔離 – 應用隔離,子產品隔離,機房隔離和線程池隔離。可以按照優先級,不變和變幾個次元來隔離應用和子產品,如抽象和不變的代碼放在一個子產品,這個子產品的代碼幾乎不會修改,可用性高,經常變的業務邏輯放在一個子產品裡,這樣就算有問題,也隻會影響到某一個業務。不同的業務使用不同的線程池,避免低優先級任務阻塞高優先級,或高優先級任務過多時影響低優先級任務永遠不會執行。

異步調用 – 同步調用改成異步調用,解決遠端調用故障或調用逾時對系統的影響。

熱點緩存 – 對熱點資料進行緩存,降低RPC調用。如B系統提供名單服務,B系統可以提供一個client SDK提供近端緩存服務,定期去伺服器端取資料,減少RPC調用。

緩存容災 – 當資料庫不可用時可以使用緩存的資料。并設定分級緩存,如優先讀本地緩存,其次讀分布式緩存。

分級緩存 – 優先讀本地緩存,其次讀分布式緩存。通過推模式更新本地緩存。

系統分級 – 對系統進行分級,如ABC三個等級,進階别系統不依賴于低級别系統,并且進階别系統比底級别系統高可用率要高。

服務降級 – 如果系統出現響應緩慢等狀況,可以關閉部分功能,進而釋放系統資源,保證核心服務的正常運作。需要識别哪些服務可以降級,比如突然有大量消息流入,導緻服務不可用,我們會把消息直接丢棄掉。或通過設定流控,拒絕為低級别系統提供服務。

流量蓄洪 – 當流量陡增時,可以将請求進行蓄洪,如把請求儲存在資料庫中,再按照指定的QPS進行洩洪,有效的保護下遊系統,也保證了服務的可用性。當調用對方系統,對方系統響應緩慢或無響應時,可采取自動蓄洪。

服務權重 – 在叢集環境中,可自動識别高性能服務,拒絕調用性能低的服務。如在叢集環境中,對調用逾時的伺服器進行權重降低,優先調用權重高的伺服器。

依賴簡化– 減少系統之間的依賴,比如使用消息驅動,A和B系統通過消息伺服器傳遞資料,A和B系統使用資料庫進行讀寫分離,A系統負責往資料庫中寫資料,B系統負責讀資料,因為資料存放在資料庫中,當A不可用時,短時間内不影響B系統提供服務。

彈性擴容 – 根據資源的使用率自動或手動進行擴容。如帶寬不夠用時,快速增加帶寬。

灰階和復原 – 釋出新功能隻讓部分伺服器生效,且觀察幾天逐漸切流,如果出現問題隻影響部分客戶。出現問題快速復原,或者直接下線灰階的機器。

減少遠端調用 – 優先調用本地JVM内服務,其次是同機房服務,然後是同城服務,最後是跨城服務。如A調用B,B調用網際網路的C系統擷取資料,B系統可以把資料緩存起來,并設定資料的保鮮度,減少B對C的依賴。配置中心把注冊服務的位址推送到調用服務的系統本地。參數中心把參數配置資訊推送到系統的本地記憶體,而不是讓系統去遠端伺服器擷取參數資訊。

熔斷機制 – 增加熔斷機制,當監控出線上資料出現大幅跌漲時,及時中斷,避免對業務産生更大影響。如我們做名額計算時,名額可以計算慢,但是不能算錯,如果發現某個使用者的名額環比或同比增長一倍或跌零,會考慮儲存所有消息,并中止該使用者的名額計算。

運作時加載子產品 – 我們會把經常變的業務代碼變成一個個業務子產品,使用Java的ClassLoader在運作時動态加載和解除安裝子產品,當某個子產品有問題時候,可以快速修複。

代碼掃描 – 使用IDEA代碼分析等工具進行代碼掃描,識别出程式中的BUG,如空指針異常,循環依賴等。

自動備份 – 程式,系統配置和資料定期進行備份。可使用linux指令和shell腳本定時執行備份政策,自動進行本地或異地。出現問題時能快速重新部署。

線上壓測 – 系統的對外服務需要進行壓測,知道該服務能承受的QPS和TPS,進而做出相對準确的限流。

本文轉自秋楓部落格園部落格,原文連結:http://www.cnblogs.com/rwxwsblog/p/6652872.html,如需轉載請自行聯系原作者