博客 / 詳情

返回

讀書筆記之數據密集型應用的可靠性

宇宙之一粟讀書筆記之《數據密集型應用系統設計》,本筆記的內容來自《數據密集型應用系統設計》,該書豆瓣評分高達 9.7。

什麼是數據密集型應用

數據密集型應用,英文名 Data-Intensive Application。

數據密集型應用(data-intensive applications) 正在通過使用這些技術進步來推動可能性的邊界。一個應用被稱為 數據密集型 的,如果 數據是其主要挑戰(數據量,數據複雜度或數據變化速度)—— 與之相對的是 計算密集型,即處理器速度是其瓶頸。數據密集型計算是一類並行計算應用程序,使用數據並行方法處理大量數據。

在大多數軟件系統中很重要的三個問題是:

可靠性:即使面對意外情況如硬件、軟件故障、人為失誤等,系統也應正確工作,雖然系統的性能可能有所降低,但還是能執行正確的功能。

可擴展性:隨着系統規模的增長(數據,流量量或複雜性),應有合理的方法來匹配該增長。

可維護性:隨着時間的推移,許多新的人員參與到系統的開發與運維,人們應該能夠依然有效維護該系統。

數據密集型應用特性

為了實現數據密集型計算的高性能,有必要最大程度地減少數據的移動。這可以通過 reduce 算法在數據居住的節點上執行算法來減少系統開銷並提高性能。

數據密集型計算系統採用獨立於機器的方法,其中運行時系統控制程序的調度、執行、負載平衡、通信和移動。

數據密集型計算非常關注數據的可靠性和可用性。傳統的大規模系統可能容易受到硬件故障、通信錯誤和軟件錯誤的影響,而數據密集型計算旨在克服這些挑戰。

數據密集型計算是為可擴展性而設計的,因此它可以容納任何數量的數據,因此可以滿足時間關鍵要求。硬件和軟件架構的可擴展性是數據密集型計算的最大優勢之一。

Figure 79

可靠性

軟件的典型的可靠性包括:

  • 應用程序執行用户所期望的功能
  • 可以容忍用户出現錯誤或不正確的軟件使用方法
  • 性能能夠應對典型場景、合理負載壓力和數據量
  • 系統可防止任何未經授權的訪問和濫用

故障通常被定義為組件偏離其正常規格, 而失效意味系統作為一個整體停止, 無法向用户提供所需的服務。 況且不太可能將故障概率降低到零, 因此通常設計容錯機制來避免從故障引發系統失效。

硬件錯誤

硬件錯誤總是很容易想到:硬盤崩潰、內存故障、停電甚至是人為拔掉網線。

一般來説,處理硬件故障的標準方法是為硬件組件添加冗餘,以便如果硬件發生故障,則隨時可以更換。例如:

  • 對磁盤的 RAID 配置
  • 服務器配備雙電源
  • 熱插拔 CPU
  • 數據中心添加備用電源、發電機等

隨着數據量和應用程序的計算需求的增加,人們偏向於使用軟件故障容錯技術來容忍硬件錯誤。這些軟件容忍系統的一個優點是:對於單個服務器系統,如果需要重新啓動機器(例如,應用操作系統安全補丁),則需要計劃停機時間。但是,對於可以忍受機器故障的系統,可以一次修補一個節點然後重啓(無需停機整個系統 - 滾動升級)。

這種方式使得系統更具有操作便利性。

軟件錯誤

與硬件錯誤相比,軟件錯誤之間更加具有關聯性。這意味着,一個節點中的故障導致系統出現更多的故障。牽一髮而動全身,例如:

  • 由於軟件錯誤,導致當輸入特定值時應用服務器總是崩潰
  • 一個應用進程使用了某個共享資源如 CPU、內存、磁盤或網絡帶寬,但卻不幸失控跑飛了
  • 系統依賴於某些服務,但該服務突然變慢。甚至無響應或者開始返回異常的響應
  • 級聯故障,其中某個組件的小故障觸發另一個組件故障,進而引發更多的系統問題

解決方法(軟件故障有時沒有快速的解決方法,只能多考慮軟件設計的細節):

  • 認真檢查依賴的假設條件與系統之間交互
  • 進行全面的測試,測試覆蓋率爭取達到 100%
  • 進程隔離,允許進程崩潰並自動重啓
  • 監控並分析生產環節的種種數據

人為錯誤

設計和構建軟件系統總是由人完成的,但人類是不可靠的。儘管人類不可靠,我們如何使系統可靠?通過多種方法的組合,例如:

  • 巧妙的軟件設計:通過精心設計的抽象,API 和管理界面來最大程度地限制錯誤機會的方式設計系統。
  • 開發、測試、生產環境分離:分離最容易出錯的地方、容易引發故障的接口。提供一個功能齊全但非生產用的沙箱環境(測試系統),使人們可以放心的嘗試 、 體驗, 包括導入真實的數據, 萬一出現問題, 不會影響真實用户。
  • 充分的測試:從單元測試到全系統集成測試、手動測試到自動測試。
  • 快速的恢復機制:當出現人為失誤,可以快速回復,以最大程度減少故障的影響。例如:快速回滾配置改動,滾動發佈新代碼,提供校驗數據的工作
  • 設置詳細而清晰的監控子系統:包括性能指標和錯誤率

總結

可靠性不單單是針對核電站和空中交管軟件之類的系統很重要,日常的很多應用也需要可靠的工作。商業軟件的錯誤可能會導致效率下降,甚至帶來法律風險,電子商務網站故障比如出現超賣,既影響網站營收,帶來巨大損失。

總之,開發和軟件設計人員應該秉持對用户負責的態度,設計一個可靠的應用非常關鍵。

但有時也會出現其它的情況,犧牲一些可靠性來降低開發成本或運營開銷,對此,需要權衡。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.