如何建設高可用系統

轉自:linux

https://mp.weixin.qq.com/s?__biz=MzAxOTQxOTc5NQ==&mid=2650497186&idx=1&sn=fee7574df35c256a0b1c079f43314513&chksm=83c8875eb4bf0e4842dba22b0d32c8c001f236b05682c38792b579675d66e88b3cc6f7fc749a&scene=0&key=83fc8dbbc3d4af1318dc9331938c8f49eecfab57bfe5e6b5e0e99a2a61df5a8a336fc4c164ad338e7f3218d47ea8a1655fb6f1583bc81ee8733dfdc24475709ea1ae6ee0ca7578ce00eaf13e3337a8a9&ascene=0&uin=MjcxMDgzNDQwMQ%3D%3D&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.12.4+build%2816E195%29&version=12020110&nettype=WIFI&fontScale=100&pass_ticket=nV53VmXJ%2FqxeW1J4Iejnm2UD%2FAkwHlKqB6nb%2FeSGi0hd44pbUgRYkFrHa%2BEX7NVr面試

 

面試的時候常常會問一個問題,如何建設高可用系統?你們能夠一塊兒探討下。shell

「高可用性」(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,從而作出相對準確的限流。

參考資料

  • 分佈式系統穩定性模式

相關文章
相關標籤/搜索