第1章 可靠性,可擴展性,可維護性

第1章 可靠性,可擴展性,可維護性

數據密集型程序:問題一般來自數據量,數據複雜性,以及數據的變動速度。數據庫

數據庫:存儲數據,以便本身或其餘應用程序以後能再次找到。緩存

緩存:記住開銷昂貴的操做的結果,加快讀取速度。安全

搜索索引:容許用戶按關鍵字搜索數據,或以各類方式對數據進行過濾。服務器

流處理:向其餘進程發送消息,進行異步處理。網絡

1.關於數據系統的思考

1.1.可靠性

1.1.1.什麼是可靠性?

系統在發生硬件故障,軟件故障,或人爲錯誤時,任然能夠正常工做。

1.1.2.影響可靠性的因素

a.硬件故障

當集羣足夠大,硬件故障老是會發生,可能存在硬盤崩潰,內存出錯,機房斷點,有人拔錯網線…等等,都會形成硬件不可用的狀態。負載均衡

b.軟件錯誤

主要有:框架

  • 接收特定的錯誤輸入,致使全部的應用服務器實例崩潰的bug。
  • 失控進程會佔用一些共享資源,包括CPU,內存,磁盤空間或網絡帶寬等。
  • 級聯故障,一個組件中的小故障觸發另外一個組件中的故障,進而觸發更多的故障。

軟件中的系統故障沒有速藥,可是有不少小辦法:運維

  • 仔細考慮系統中的假設和交互。
  • 完全的測試。
  • 進程隔離
  • 容許進程蹦崩潰並重啓
  • 測量,監控並分析生產環境中的系統行爲

c.認爲錯誤

人類是不可靠的。異步

儘管人類是不可靠的,但怎麼作才能讓系統變得可靠?最好的系統會組合使用一下幾種方法:工具

  • 以最小化犯錯機會的方式設計系統。例如:精心設計的抽象,API和管理後臺使作對事情更容易,搞砸事情更困難。
  • 將人們最容易犯錯的地方與可能致使失效的地方解耦。特別是提供一個功能齊全的非生產環境沙箱,令人們能夠在不影響用戶的狀況下,使用真實數據安全地探索和實驗。
  • 各層次進行完全的測試,從單元測試,全系統集成測試到手動測試。
  • 容許從人爲錯誤中簡單快速地恢復,以最大限度地減小失效狀況帶來的影響。例如:快速回滾配置變動,分批發布新代碼,並提供該數據重算工具。

1.2.可擴展性

1.2.1.什麼是能夠擴展性?

有合理的辦法應對系統的增加(數據量,流量,複雜性),可擴展性是用來描述系統對應負載均衡增加能力的術語。

討論可擴展性意味着考慮諸如:若是系統以特定方式增加,有什麼選項能夠應對增加?或 如何增長計算資源來處理額外的負載 等問題。

1.2.2.描述負載

負載能夠用一些稱爲「負載參數」的數字來描述。

它多是 每秒向Web服務器發出的請求,數據庫中的讀寫比率,聊天室職中同時活躍的用戶數量,緩存命中率或其餘東西

1.2.3.描述性能

一旦系統的負載被描述好,就能夠研究當前負載增長會發生什麼。咱們能夠從兩個角度來看:

  • 增長負載參數並保持系統資源(CPU, 內存,網絡帶寬等)不變時,系統性能將受到什麼影響?
  • 增長負載參數並但願保存性能不變時,須要增長多少系統資源?

1.2.4.應對負載的方法

當負載參數增長時,如何保持良好的性能?

兩種擴展思路:縱向擴展(轉向更強大的機器),橫向擴展(將負載分佈到多臺小機器上)。

有些系統是彈性的,這意味着能夠在檢測到負載增長時自動增長計算子資源,而其餘系統則是手動擴展。

1.3.可維護性

什麼是可維護性?

工程師和運維在不一樣的生命週期,都能高效的在系統上工做。

軟件的大部分開銷並不在最初的開發階段,而是在持續的維護階段,包括修復漏洞,保持系統正常運行,調查失效,適配新的平臺,爲新的場景進行修改,償還技術債,添加新的功能等等。

軟件在設計之初,就儘可能考慮可能減小維護期間的痛苦,從而避免本身的軟件系統變成遺留系統,爲此,咱們將特別關注軟件系統的三個設計原則:

  • 可操做性

    便於運維團隊保持系統平穩運行。
  • 簡單性

    從系統中消除儘量多的複雜度,使新工程師也能輕鬆理解系統。
  • 可演化性

    使工程師在將來能輕鬆地對系統進行更改,當需求變化時爲新應用場景作適配,也稱爲可擴展性,可修改性,或可塑性。

1.3.1.可操做性:人生苦短,關愛運維

數據系統能夠經過各類方式使平常任務更輕鬆:

  • 經過良好的監控,提供對系統內部狀態和運行時行爲的可見性
  • 爲自動化提供良好的支持,將系統與標準化工具相集成。
  • 避免依賴單臺機器
  • 提供良好的文檔和易於理解的操做模型(若是作X,會發生Y)
  • 提供良好的默認行爲,但須要時也須要管理員自由覆蓋默認值。
  • 有條件時進行自我修復,但須要時也容許管理員手動控制系統狀態。
  • 行爲可預測,最大限度減小意外。

1.3.2.簡單性:管理複雜度

一個陷入複雜泥潭的軟件項目有時被描述爲爛泥譚

由於福再度致使維護困難時,預算和時間安排一般會超支。當開發人員難以理解系統時,隱藏的假設,無心的後果和意外的交互就更容易被忽略。相反,下降複雜度能極大的提升軟件的可維護性,所以簡單性應該是構建系統的一個關鍵目標。

簡化系統並不必定覺得着減小功能:它也能夠意味着消除額外的複雜度。

額外的複雜度指:在具體實現中出現,而非(從用戶視角看,系統所解決的)問題自己固有的複雜度。

用於消除額外複雜度的最好工具之一是抽象。一個好的抽象能夠將大量實現細節影藏在一個乾淨,簡單易懂的外觀下面。

1.3.3.可演化性:擁抱變化

系統的需求永遠不變,基本是不可能的,更真實的是一直處於常態的變化中。

在組織流程上,敏捷工做模式就是爲了適應變化提供的一個框架。

在數據系統層面的敏捷性使用可演化性來替代。

相關文章
相關標籤/搜索