要點:算法
1可用性是系統可以返回合理結果的能力數據庫
2 可用性隨着流量的增長而不斷下降服務器
3 硬件的故障一樣時系統可用性炸彈網絡
5 冗餘機制是提高可用性的惟一辦法session
4 提高可用性的過程也是增長系統複雜度的過程多線程
上一篇文章咱們講到系統複雜產生的一個主要來源是可用性。那麼什麼是系統的可用性呢?這個來自於用戶在使用系統直觀感覺,好比系統常常彈出的莫名錯誤,常常莫名的死機退出,用戶就會說系統真難用,若是系統反應靈敏,返回結果正確,用戶則會說這個系統好用,來自與具體的技術統計 好比說異常率,出錯率,反應時間等。總的來講系統的可用性是指系統返回合理結果的能力,這裏的合理結果也包括合理的錯誤信息。爲何這麼說呢?這是由於咱們的系統永遠都不能保證100%運行正常,總會有bug隱藏在某個角落等待爆發,若是出現了異常,系統可以給出合理錯誤提示,讓用戶明白如今系統正在發生着什麼,這也不能說系統不可用,固然某些嚴重的錯誤除外,他們頗有可能直接使系統拒絕服務。架構
按常理理解一個可以運行的系統都是可用的,那爲何他會成爲系統的一大難題呢?緣由就在於系統運行時的流量。在系統運行的過程當中,隨着業務的發展,使用系統的人也愈來愈多系統就會頻繁的處理各類請求,侷限於系統部署的硬件環境和軟件環境系統中隱藏的問題就暴露出來了,好比反應時間長,返回鏈接超時,多線程死鎖等問題。這樣系統的可用性就大大下降了,用戶的體驗也就天然而然的很差了。性能
除此以外 ,系統硬件的問題更猶如一顆深水炸彈,不知道啥時候爆炸,一旦發生硬件故障影響也是那對可用性的影響是毀滅性的。好比網絡故障了,系統正在傳輸的數據瞬間中斷,那這部分數據沒法到達目的地也就沒法進行加工和存儲最終能夠形成業務出現混亂。再好比數據庫硬盤故障,那就是業務數據的物理性丟失,基本上沒法恢復,這對公司來講是毀滅性的,前一段時間因爲騰訊雲的硬盤集羣問題致使某論壇數據所有湮滅的事件更是讓人毛骨悚然。測試
前面說了這麼多,那有沒有什麼辦法能保證系統的可用性?答案是確定的,那就是冗餘。咱們知道系統有兩部分組成一部分是程序,另外一部分是數據,要保證其可用性首先就是要保證他們運行環境的可用,程序的運行環境是什麼 ?就是計算能力嘛,CPU,內存,數據的運行環境固然對應到了計算機存儲設備上。對於單機來講咱們能夠加內存,加存儲,加CPU,讓他的性能達到極限,這樣就可讓系統可以再單機運行中更加穩定,反應更加敏捷。可是單機的部署始終是有他的天花板的,CPU運算速度再快也有不能無限提高,硬盤再大也扛不住海量數據,更不用說單機在發生物理故障時的脆弱性了,因此爲了保證系統的可用性就得加機器,加機器不只能夠帶來計算能力的提高,並且能夠帶來存儲能力的提高,也就是雞蛋不要放在同一個籃子裏。線程
既然加機器就能解決問題,那爲了系統可以獲得高可用,咱們就無限加機器就行了唄。其實並不盡然,首先來講咱們的成本並非無限的,老闆們巴不得一塊錢當成8塊使怎麼能讓你在那裏撒歡揮霍呢?最重要的是咱們的再加機器的同時也帶來新的系統複雜度,加機器並非1+1=2的簡單運算,而是打開的潘多拉魔盒。爲啥這麼說呢我將示例具體說明
咱們首先看一個系統的單機架構以下圖:
在這個架構只有一個業務服務器,一個數據庫服務器,這種架構在咱們公司內部常用,主要場景是用於開發和測試,如他的單一節點所示的那樣若是應用到高流量的環境下基本上是不堪一擊的。爲了增長其可用性咱們須要跟他增長冗餘,首先咱們加一個業務服務器以下圖
咱們的確增長了一個業務服務器,可是咱們同時也增長了一個新的設備叫任務分配器,故名思意他乾的是的給業務服務器分配任務的活。爲啥須要這臺設備呢?由於咱們的系統對外最好提供一個統一的入口這樣才能方便用戶訪問,我記住一個地址總比記住兩個地址容易多了,其次有了這臺設備咱們能夠保障每臺服務器都不會超過他的最大承受能力來。那麼這兩臺設備產生的複雜的問題也隨着增長這臺任務服務器來了,既然是分配任務那麼怎麼保證每次都能命中壓力最小的呢?具體任務如何分配呢?若是一臺服務器壞掉了任務分配器如何得知呢?如何保證session的一致性呢咱們每次登錄時都要登錄兩遍嗎 ?那若是有多個服務器時難道還要登錄N遍?若是真是如此那真是逆天的操做。對於這些問題在技術層面上已經不是問題好比應對如何分配任務的問題,分配服務器就有輪詢,IP Hash兩種算法,這兩種算法一個時挨着服務器的發放請求,一個則是將相同IP地址的請求分配到同一臺機器上 可是咱們必須得作出正確的選擇,以保證系統可以更好的運行他的功能。
咱們才加了一個業務服務器就引來這麼多的複雜性問題,若是再加個數據庫的化,須要解決的問題會更多,問題處理起來就更加棘手,那咱們如何才能找到適合系統可用性的架構呢?方法說簡單也簡單,說複雜又複雜,具體要看咱們業務的具體要求,好比業務要求用戶不能屢次登錄,咱們能夠將服務器上的session實現同步,每一個server的session都有一個副本這樣用戶就不用那麼費勁的每一個服務器都去登錄了。咱們還能夠將系統的功能按照重要性安排一個優先級,先選擇優先級的功能實現高可用的方案。具體的方法我會在後面文章中闡述。