數(shù)據(jù)密集型系統(tǒng)的概念(相對(duì)于計(jì)算密集型系統(tǒng)),性能瓶頸通常不在于CPU的性能,而是在于數(shù)據(jù)量,復(fù)雜度,多變性。
認(rèn)識(shí)數(shù)據(jù)系統(tǒng)
數(shù)據(jù)庫、隊(duì)列、緩存都可以視為數(shù)據(jù)系統(tǒng),且三者之間的界限越發(fā)模糊,現(xiàn)有的緩存如redis,消息隊(duì)列如kafka都提供了數(shù)據(jù)持久化功能,因此使得三者之間越來越接近;除此之外,多種組件可以組合使用,提供同一的對(duì)外接口,例如可以用redis作為MySql數(shù)據(jù)庫的緩存。
設(shè)計(jì)數(shù)據(jù)系統(tǒng)時(shí),應(yīng)當(dāng)著重關(guān)注的三個(gè)問題:
- 可靠性
- 可擴(kuò)展性
- 可維護(hù)性
可靠性
可靠性為系統(tǒng)容忍故障的能力,也可以稱為彈性。通常來說可靠性強(qiáng)調(diào)“容忍”大于“預(yù)防”,不過對(duì)于防止敏感數(shù)據(jù)被竊取等場(chǎng)景除外。
影響系統(tǒng)可靠性常見的原因包括:硬件故障、軟件故障、人為失誤。
硬件故障
硬件故障包括:硬盤故障、內(nèi)存故障、停電等,對(duì)應(yīng)的解決措施通常為冗余,包括RAID、ECC校驗(yàn)、備用電源等具體措施。
但是由于分布式計(jì)算、云計(jì)算等場(chǎng)景要求,軟件容錯(cuò)具有相對(duì)于硬件更好的優(yōu)勢(shì)。
軟件故障
典型的軟件故障有:程序bug、程序占據(jù)資源但跑飛等,軟件故障通常會(huì)長(zhǎng)時(shí)間潛伏,只在特定場(chǎng)景觸發(fā)。
人為失誤
據(jù)統(tǒng)計(jì),運(yùn)維人員工作失誤是系統(tǒng)下線的主要原因,硬件問題占比較小,減少運(yùn)維人員失誤的方式包括:設(shè)計(jì)具有更好抽象接口的管理系統(tǒng)、建立模擬用沙箱、充分測(cè)試程序、建立恢復(fù)與監(jiān)控系統(tǒng)、加強(qiáng)培訓(xùn)等。
可靠性的重要性
可靠性不僅僅是對(duì)于核電站、空管系統(tǒng)等敏感部門有意義,對(duì)于私人數(shù)據(jù),例如老照片等也具有極大的意義。
可擴(kuò)展性
可擴(kuò)展性為系統(tǒng)應(yīng)付負(fù)載增加的能力
描述負(fù)載
負(fù)載通常通過負(fù)載參數(shù)描述,可以具有不同的形式,例如Web服務(wù)器的qps,聊天室的在線用戶數(shù)、緩存的命中率等指標(biāo);并且負(fù)載參數(shù)有時(shí)側(cè)重平均值,有時(shí)側(cè)重峰值或極端值。
Twitter的推文的推拉模式。
描述性能
面向兩種不同場(chǎng)景,采用不同的性能描述方式:
- 批處理系統(tǒng):吞吐量(throughput)
- 在線服務(wù):響應(yīng)時(shí)間(response time)
ps:響應(yīng)時(shí)間大于延遲,延遲僅為程序處理請(qǐng)求的時(shí)間,響應(yīng)時(shí)間包括延遲、網(wǎng)絡(luò)延遲、排隊(duì)延遲等
響應(yīng)時(shí)間也具有不同的表示形式:
- 平均響應(yīng)時(shí)間
- 百分位數(shù)(percentiles):包括P50(平均值)、P99、P999等
響應(yīng)時(shí)間通常具有長(zhǎng)尾效應(yīng),因此需要P99等指標(biāo)監(jiān)測(cè),對(duì)于重要客戶大筆交易產(chǎn)生的較長(zhǎng)響應(yīng)時(shí)間能夠有更好的表示,從而方便優(yōu)化。
排隊(duì)延遲在響應(yīng)時(shí)間中具有很大比例,因此在客戶端監(jiān)測(cè)包括延遲在內(nèi)的響應(yīng)時(shí)間很必要。
應(yīng)對(duì)負(fù)載增加的方法
通常為特定級(jí)別設(shè)計(jì)的系統(tǒng)無法承載超出預(yù)期十倍的實(shí)際負(fù)載,因此需要進(jìn)行擴(kuò)展,主要包括:
- 垂直擴(kuò)展:提升單機(jī)性能
- 水平擴(kuò)展:增加機(jī)器數(shù)量
通常提升單機(jī)性能的成本隨著性能提升指數(shù)增長(zhǎng),可擴(kuò)展空間有限,最終水平擴(kuò)展無法避免,水平擴(kuò)展可以應(yīng)用彈性擴(kuò)展,自動(dòng)檢測(cè)負(fù)載增加,進(jìn)行資源調(diào)配,例如k8s等。
不同類型的系統(tǒng)也需要設(shè)計(jì)不同的擴(kuò)展策略,例如每秒鐘100000次1KB請(qǐng)求的系統(tǒng)和每秒鐘3次2GB系統(tǒng)的設(shè)計(jì)思路顯然應(yīng)該不同。
可維護(hù)性
軟件的主要成本不在于最初開發(fā),而在于后期的維護(hù)與修復(fù),對(duì)于可維護(hù)性主要考慮以下方面:
- 可運(yùn)維性:易于使用
- 簡(jiǎn)單性:易于學(xué)習(xí)
- 可演化性:易于改進(jìn)
可運(yùn)維性:運(yùn)維更輕松
通常運(yùn)維人員工作包括:檢測(cè)系統(tǒng)狀況、尋找問題、更新系統(tǒng)、服務(wù)遷移等,數(shù)據(jù)系統(tǒng)建立時(shí)也應(yīng)當(dāng)考慮:提升可觀測(cè)性、支持自動(dòng)化、提升跨平臺(tái)能力等。
簡(jiǎn)單性:簡(jiǎn)化復(fù)雜度
項(xiàng)目體積的增大會(huì)使得項(xiàng)目成為“屎山”,導(dǎo)致依賴更為復(fù)雜,模塊之間耦合度增加等。通常解決復(fù)雜性問題的良好方式為抽象,例如高級(jí)語言作為匯編的抽象,操作系統(tǒng)作為IO、進(jìn)程的抽象等,但是設(shè)計(jì)良好的抽象具有較大的難度。
可演化性:易于改變
系統(tǒng)需求經(jīng)常變化,可演化性的目標(biāo)就是使得數(shù)據(jù)系統(tǒng)易于修改,從而使其能夠適應(yīng)不斷變化的需求。