1、什麼算是「數據密集型應用」
對於一個應用系統,若是「數據」是其成敗決定性因素,包括數據的規模、數據的複雜度或者數據產生與變化的速率等,咱們就能夠稱爲「數據密集型應用系統」;與之對應的是計算密集型,CPU主頻每每是後者最大的制約瓶頸。
例如:使用瞭如下組件的應用系統:關係型數據庫、NoSql、消息隊列、緩存、搜索引擎、批處理與流處理框架
2、可靠、可擴展與可維護的應用系統
一、可靠性
意味着即便發生故障,系統也能夠正常工做。故障包括:
1)
硬件故障。如硬盤崩潰、內存故障、電網停電。硬盤的平均無端障時間約爲10-50年。所以,在一個包括10000個磁盤的存儲集羣中,咱們應該預期平均天天有一個磁盤發生故障。硬件故障一般是隨機的,不相干的。減小硬盤故障率的策略有:
磁盤配置RAID,服務器配備雙電源,熱插拔CPU,數據中心添加備用電源、發單機等
經過軟件容錯的方式來容忍多機失效,例如當須要重啓計算機爲操做系統打安全補丁,能夠每次給一個節點打補丁而後重啓,而不須要同時下線整個系統。
2)
軟件錯誤。軟件問題一般是系統的,更難以處理
3)
人爲失誤。老是很難避免,時不時會出錯。如下多種方法能夠幫助減小人爲錯誤:
- 以最小出錯的方式來設計系統。例如,精心設計的抽象層、API以及管理界面,使「作正確的事情」很輕鬆,但搞壞很複雜。
- 想辦法分離最容易錯誤的地方、容易引起故障的接口。特別是,提供一個功能齊全但非生產用的沙箱環境。
- 充分的測試:單元測試、全系統集成測試、手動測試、自動化測試。
- 當出現人爲失誤時,提供快速的恢復機制以儘可能減小故障影響。
- 設置詳細而清晰的監控子系統,包括性能指標和錯誤率。
- 推行管理流程並加以培訓。
二、可擴展性
是指負載增長時,有效保持系統性能的相關技術策略。
負載:Web服務器的每秒請求處理次數,數據庫中寫入的比例,聊天室的同時活動用戶數量,緩存命中率等。有時平均值很重要,有時系統瓶頸來自於少數峯值。
性能:批處理系統中,一般關心吞吐量,即每秒可處理的記錄條數,或者在指定數據集上運行做業所需的總時間;而在線系統一般更看重服務的響應時間,即客戶端從發送請求到接收響應之間的間隔。
響應時間:平均值並非合適的指標,由於它掩蓋了一些信息,沒法告訴有多少用戶實際經歷了多少延遲。最好使用百分位數。中位數表示列表中間的響應時間,縮寫爲p50,若是中位數響應時間爲200ms,意味着一半的請求響應不到200ms。想要弄清楚異常的響應數據有多糟糕,須要關注p9五、p9九、p999
三、可維護性
本質上是爲了讓工程和運營團隊更爲輕鬆。包括:
- 可運維性:運維更輕鬆。
- 簡單性:簡化複雜度。
- 可演化性:易於改變。
良好的抽象能夠幫助下降複雜性,並使系統更易於修改和適配新場景。良好的操縱性意味着系統健康情況有良好的可預測性和有效的管理方法。