1. 程式人生 > >如何設計一個高可用系統?要考慮哪些地方?

如何設計一個高可用系統?要考慮哪些地方?

本文已經收錄自筆者開源的 JavaGuide: https://github.com/Snailclimb (69k+Star【Java學習+面試指南】 一份涵蓋大部分Java程式設計師所需要掌握的核心知識)如果覺得不錯的還,不妨去點個Star,鼓勵一下!

一篇短小的文章,面試經常遇到的這個問題。本文主要包括下面這些內容:

  1. 高可用的定義
  2. 哪些情況可能會導致系統不可用?
  3. 有些提高系統可用性的方法?只是簡單的提一嘴,更具體內容在後續的文章中介紹,就拿限流來說,你需要搞懂:何為限流?如何限流?為什麼要限流?如何做呢?說一下原理?。

什麼是高可用?可用性的判斷標準是啥?

高可用描述的是一個系統在大部分時間都是可用的,可以為我們提供服務的。高可用代表系統即使在發生硬體故障或者系統升級的時候,服務仍然是可用的。

一般情況下,我們使用多少個 9 來評判一個系統的可用性,比如 99.9999% 就是代表該系統在所有的執行時間中只有 0.0001% 的時間都是可用的,這樣的系統就是非常非常高可用的了!當然,也會有系統如果可用性不太好的話,可能連 9 都上不了。

哪些情況會導致系統不可用?

  1. 黑客攻擊;
  2. 硬體故障,比如伺服器壞掉。
  3. 併發量/使用者請求量激增導致整個服務宕掉或者部分服務不可用。
  4. 程式碼中的壞味道導致記憶體洩漏或者其他問題導致程式掛掉。
  5. 網站架構某個重要的角色比如 Nginx 或者資料庫突然不可用。
  6. 自然災害或者人為破壞。
  7. ......

有哪些提高系統可用性的方法?

1. 注重程式碼質量,測試嚴格把關

我覺得這個是最最最重要的,程式碼質量有問題比如比較常見的記憶體洩漏、迴圈依賴都是對系統可用性極大的損害。大家都喜歡談限流、降級、熔斷,但是我覺得從程式碼質量這個源頭把關是首先要做好的一件很重要的事情。如何提高程式碼質量?比較實際可用的就是 CodeReview,不要在乎每天多花的那 1 個小時左右的時間,作用可大著呢!

另外,安利這個對提高程式碼質量有實際效果的寶貝:

  1. sonarqube :保證你寫出更安全更乾淨的程式碼!(ps: 目前所在的專案基本都會用到這個外掛)。
  2. Alibaba 開源的 Java 診斷工具 Arthas 也是很不錯的選擇。
  3. IDEA 自帶的程式碼分析等工具進行程式碼掃描也是非常非常棒的。

2.使用叢集,減少單點故障

先拿常用的 Redis 舉個例子!我們如何保證我們的 Redis 快取高可用呢?答案就是使用叢集,避免單點故障。當我們使用一個 Redis 例項作為快取的時候,這個 Redis 例項掛了之後,整個快取服務可能就掛了。使用了叢集之後,即使一臺 Redis 例項,不到一秒就會有另外一臺 Redis 例項頂上。

3.限流

流量控制(flow control),其原理是監控應用流量的 QPS 或併發執行緒數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。——來自 alibaba-Sentinel 的 wiki。

4.超時和重試機制設定

一旦使用者請求超過某個時間的得不到響應,就丟擲異常。這個是非常重要的,很多線上系統故障都是因為沒有進行超時設定或者超時設定的方式不對導致的。我們在讀取第三方服務的時候,尤其適合設定超時和重試機制。一般我們使用一些 RPC 框架的時候,這些框架都自帶的超時重試的配置。如果不進行超時設定可能會導致請求響應速度慢,甚至導致請求堆積進而讓系統無法在處理請求。重試的次數一般設為 3 次,再多次的重試沒有好處,反而會加重伺服器壓力(部分場景使用失敗重試機制會不太適合)。

5.熔斷機制

超時和重試機制設定之外,熔斷機制也是很重要的。 熔斷機制說的是系統自動收集所依賴服務的資源使用情況和效能指標,當所依賴的服務惡化或者呼叫失敗次數達到某個閾值的時候就迅速失敗,讓當前系統立即切換依賴其他備用服務。 比較常用的是流量控制和熔斷降級框架是 Netflix 的 Hystrix 和 alibaba 的 Sentinel。

6.非同步呼叫

非同步呼叫的話我們不需要關心最後的結果,這樣我們就可以使用者請求完成之後就立即返回結果,具體處理我們可以後續再做,秒殺場景用這個還是蠻多的。但是,使用非同步之後我們可能需要 適當修改業務流程進行配合,比如使用者在提交訂單之後,不能立即返回使用者訂單提交成功,需要在訊息佇列的訂單消費者程序真正處理完該訂單之後,甚至出庫後,再通過電子郵件或簡訊通知使用者訂單成功。除了可以在程式中實現非同步之外,我們常常還使用訊息佇列,訊息佇列可以通過非同步處理提高系統性能(削峰、減少響應所需時間)並且可以降低系統耦合性。

7.使用快取

如果我們的系統屬於併發量比較高的話,如果我們單純使用資料庫的話,當大量請求直接落到資料庫可能資料庫就會直接掛掉。使用快取快取熱點資料,因為快取儲存在記憶體中,所以速度相當地快!

8.其他

  1. 核心應用和服務優先使用更好的硬體
  2. 監控系統資源使用情況增加報警設定。
  3. 注意備份,必要時候回滾。
  4. 灰度釋出: 將伺服器叢集分成若干部分,每天只發布一部分機器,觀察執行穩定沒有故障,第二天繼續釋出一部分機器,持續幾天才把整個叢集全部發布完畢,期間如果發現問題,只需要回滾已釋出的一部分伺服器即可
  5. 定期檢查/更換硬體: 如果不是購買的雲服務的話,定期還是需要對硬體進行一波檢查的,對於一些需要更換或者升級的硬體,要及時更換或者升級。
  6. .....(想起來再補充!也歡迎各位歡迎補充!)

總結

相關推薦

如何設計一個可用系統考慮哪些地方

本文已經收錄自筆者開源的 JavaGuide: https://github.com/Snailclimb (69k+Star【Java學習+面試指南】 一份涵蓋大部分Java程式設計師所需要掌握的核心知識)如果覺得不錯的還,不妨去點個Star,鼓勵一下! 一篇短小的文章,面試經常遇到的這個問題。本文主要

如何設計一個併發系統

  系統拆分,將一個系統拆分為多個子系統,用dubbo來搞。然後每個系統連一個數據庫,這樣本來就一個庫,現在多個數據庫,不也可以抗高併發麼。     快取,必須得用快取。大部分的高併發場景,都是讀多寫少,那你完全可以在資料庫和快取裡都寫一份,然後讀的時候大量走快取不就得了。畢竟人家redis

【本人禿頂程式設計師】面試題:如何設計一個併發系統

←←←←←←←←←←←← 我都禿頂了,還不點關注! 面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 裡都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在網際

41、如何設計一個併發系統

1、面試題 如何設計一個高併發系統? 2、面試官心裡分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的jd裡都是說啥,有高併發就經驗者優先。 所以如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿offer基本如探囊

如何設計一個併發系統

面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 裡都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官也絕對不

搭建一個redis可用系統

/var/ 文件 orien class star lov 信息 查詢 火墻 一、單個實例 當系統中只有一臺redis運行時,一旦該redis掛了,會導致整個系統無法運行。 單個實例 二、備份 由於單臺redis出現單點故障,就會導致整個系統不可用,所以想到的辦

UI設計教程分享:設計一個質量的logo從哪方面入手呢?

有的人覺得logo只是一個簡單的圖形,對品牌影響無關緊要;但有的人卻覺得logo對品牌有較大的影響。其實logo承載著一個公司的品牌形象、公司背景、公司理念等。就像Landor往往給一個企業做logo要收取上百萬的費用,就是因為品牌形象針對的時品牌本身,從形式、寓意、色彩甚至

關於構建一個可用系統的一些措施

緩存 問題 減少 中間件 解決問題 sql 集群 沒有 失敗 1、何為高可用性系統 高可用性系統是指一個系統經過專門的設計,從而達到最長使用時間,最少停機時間,保持其高度可用性。一般的標準有幾個九來表示。當九越多,系統的高可用性系統越高。 2、如何去

簡單設計一個併發的系統

問題 如何設計一個高併發系統? 分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 裡都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問

如何構建一個可用的IM系統

一、概念 讀擴散 顧名思義就是把讀放大了,增加了讀的複雜度,相對的就減少了寫的複雜度;每次會話中產生的訊息,只需要寫一次庫就可以,接收端從這個庫里拉取訊息。對於群訊息的場景,能夠大大降低訊息寫入的次數,一條群訊息只需要寫一次即可;接收端需要對每個會話都拉取一次才能獲取全部訊

描述一個高效能可靠的伺服器架構---------如何設計一個秒殺系統

一、秒殺的應用場景 電商網站的搶購活動、12306網站的搶票、搶紅包。 二、秒殺的特點 1、秒殺時大量使用者會在同一時間同時進行搶購,網站瞬時訪問流量激增。 2、資料庫的併發讀寫衝突以及資源的鎖請求衝突非常嚴重。 3、秒殺一般是訪問請求數量遠遠大於

如何設計一個秒殺系統——秒殺系統架構設計哪些關鍵點?(持續更新)

最近在閱讀許令波的極客專欄“如何設計一個秒殺系統”,我希望通過做筆記的方式督促自己認真閱讀學到東西,在此同時也能分享一些我從中得到的一些東西。 話說雙11,秒殺系統的知識也能應用到裡面,在平時架構設計中也可運用這篇專欄的知識,這裡有些知識點也是面試的高頻詞,也可以完善對於整

並發解決方案】5、如何設計一個秒殺系統

電商 進程 atom 統架構 多用戶 能力 如果能 後臺 寫鎖 https://www.cnblogs.com/wangzhongqiu/p/6557596.html 什麽是秒殺 秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中

系統架構可用系統設計原則01

發送 .com 需要 防止 傳輸 工程 地方 失敗 img 一、也談談高可用“高可用性”(High Availability)簡稱HA,通常來描述一個系統經過專門的設計,從而減少停工時間,而保持其服務的高度可用性。通俗來講就是通過專業的設計保障系統相關服務能夠不間斷的穩定運

用簡單的方法構建一個可用服務端

高可用 架構 redis 服務器 一. 什麽是高可用性 服務端,顧名思義就是為用戶提供服務的。停工時間,就是不能向用戶提供服務的時間。高可用,就是系統具有高度可用性,盡量減少停工時間。 停工的原因一般有: 服務器故障。例如服務器宕機,服務器網絡出現問題,機房或者機架出現問題等。訪問量急劇上升,

如何打造一個可用多租戶的企業級Maven私有倉庫服務

href 雲效 repl group abi 方式 簽名 ava watermark 摘要: 為什麽要打造多租戶的企業級Maven私有倉庫服務? 在Java的世界中,我們通常使用Maven的依賴體系來管理構件(artifact,又稱為二方庫或三方庫)的依賴。Maven倉庫用

如何使用Heartbeat,組建一個可用性的mysql集群

kconfig ase nlog ports 完全 數據安全 tis base live 轉了好多次帖子,其實就是為了使用heartbeat來搭建mysql集群,網上很多都是用make來生成RPM來安裝,我也找了很多資料,mysql 自帶的cluster用戶不滿

2、如何設計一個秒殺系統

https://www.cnblogs.com/wangzhongqiu/p/6557596.html 什麼是秒殺 秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中一些稀缺或者特價商品,電商網站一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性

【手寫系列】純手寫實現一個可用的RPC

前言 在實際後臺服務開發中,比如訂單服務(開發者A負責)需要呼叫商品服務(開發者B負責),那麼開發者B會和A約定呼叫API,以介面的形式提供給A。通常都是B把API上傳到Maven私服,然後B開始寫API的實現,A只需要引入API依賴進行開發即可。 訂單

銷售寶:會計軟體該如何選擇,考慮哪些方面

1.品牌方面 購買財稅軟體,特別是財務軟體時,儘可能選擇大品牌服務商,相對而言,大品牌服務商的技術相對成熟和穩定,售後服務也會比較完善,雖然大品牌相對價格較高,但也更安全更有保障; 2.價格方面 財務軟體不建議使用免費的或者破解版的(稅務軟體例外,因為大部分是免費的),現在是知識