DDIA(一)

  • 數(shù)據(jù)密集應(yīng)用
    • 存儲數(shù)據(jù)以便于再次使用——數(shù)據(jù)庫
    • 存儲開銷較大的計(jì)算結(jié)果以便于加大讀取速度——緩存
    • 通過關(guān)鍵字去索引和過濾——搜索引擎
    • 發(fā)消息給其他進(jìn)程,異步的處理——流式處理
    • 周期的處理大量的積累的數(shù)據(jù)——批處理
  • 數(shù)據(jù)密集主要的考慮點(diǎn):
    • 可靠性:reliable,在硬件或者軟件甚至是認(rèn)為錯(cuò)誤的情況下仍然可以正確的工作。
    • 可伸縮:scalable,處理增長,當(dāng)業(yè)務(wù)規(guī)模增大的時(shí)候能夠可靠的方式處理。
    • 可維護(hù):maintainable,既可以處理眼下的問題,又可以針對未來的應(yīng)用場景做轉(zhuǎn)換。
  • 關(guān)于可靠性:
    • 可靠性的基本要求:
      • 應(yīng)用的每個(gè)功能點(diǎn)能夠按預(yù)期執(zhí)行。
      • 能夠忍受人為錯(cuò)誤或者不正確的運(yùn)行方式。
      • 在預(yù)期的負(fù)載和數(shù)據(jù)量下,能夠保證足夠的性能。
      • 系統(tǒng)能夠避免未授權(quán)的訪問或者入侵
    • 三大類問題:
      • 硬件問題:當(dāng)系統(tǒng)規(guī)模較小的時(shí)候,硬件錯(cuò)誤的概率很低,且是隨機(jī)的不可預(yù)見的。但是當(dāng)規(guī)模較大的時(shí)候,比如一萬個(gè)節(jié)點(diǎn),硬件錯(cuò)誤可能每天都會出現(xiàn)。兩種思路:第一種,添加備用硬件,比如磁盤raid或者備用電源等,另一種就是使用集群的方式來避免這個(gè)問題。對于小規(guī)模的系統(tǒng)第一種已經(jīng)足夠了,但是對于大規(guī)模的對可用性要求很高的場景來說,應(yīng)該使用第二種方式。第二種方式我們需要解決的問題就是我們的應(yīng)用能夠允許部分失敗。
      • 軟件問題:軟件問題和硬件的問題不同,硬件問題獨(dú)立,隨機(jī)。但是軟件問題往往會有相關(guān)性。相對于硬件問題,軟件問題往往更加難以預(yù)防并且有更大的破壞了。常見的軟件問題:1)系統(tǒng)bug,會導(dǎo)致系統(tǒng)中每個(gè)實(shí)例都crash掉,如閏秒。2)某個(gè)進(jìn)程耗盡了共享資源,如CPU,內(nèi)存等。3)依賴的服務(wù)變慢,如數(shù)據(jù)庫負(fù)載高,會導(dǎo)致應(yīng)用響應(yīng)變慢。4)瀑布式錯(cuò)誤,一個(gè)問題引起另一個(gè)問題,再由這個(gè)問題引起更多的問題。對于軟件問題,并沒有藥到病除的方案,可以加強(qiáng)一些細(xì)節(jié)把控。如:1)仔細(xì)的思考一些假定的場景以及系統(tǒng)之間的關(guān)系和耦合。2)測試。3)監(jiān)控。4)系統(tǒng)內(nèi)部的周期一致性檢查,如dead Message郵件。
      • 人為錯(cuò)誤:人是不可靠的,想擺脫人為錯(cuò)誤主要在于以下方面:
        • 在設(shè)計(jì)系統(tǒng)時(shí)候,盡量減少犯錯(cuò)的機(jī)會,提供好的抽象,api,管理接口讓使用者能夠很容易做正確的事兒且避免錯(cuò)誤。一些必要的校驗(yàn)就是好例子。
        • 環(huán)境隔離。
        • 全方位的測試。
        • 當(dāng)發(fā)生認(rèn)為錯(cuò)誤的時(shí)候可以快速恢復(fù),如數(shù)據(jù)庫回滾。
        • 監(jiān)控
        • 管理和培訓(xùn)。
  • 關(guān)于可擴(kuò)展
    • 可擴(kuò)展/可伸縮考慮的問題是當(dāng)系統(tǒng)的負(fù)載變大的時(shí)候,我改怎么辦的問題。我如何通過增加計(jì)算資源來處理額外的負(fù)載。
    • 描述負(fù)載:負(fù)載可以用一些負(fù)載的參數(shù)來衡量,最優(yōu)的參數(shù)取決于你的系統(tǒng)架構(gòu)。比如對于web系統(tǒng),它可以是qps、對于數(shù)據(jù)庫可以是讀寫別理、對于聊天室可以是同時(shí)在線人數(shù)、對于緩存可以是緩存命中率等等。也許常規(guī)的場景是你需要考慮的,也許一些極端的的場景才是你的瓶頸。
    • 描述性能:一旦你知道如何描述系統(tǒng)負(fù)載,這時(shí)候就需要找到一個(gè)指標(biāo)來衡量系統(tǒng)的性能??梢詮膬蓚€(gè)方面去思考:1)人工的增加負(fù)載之后,系統(tǒng)的性能將會受到怎樣的影響。2)增加了負(fù)載之后,如果想維持性能不變,需要新增多少資源。描述性能指標(biāo)依據(jù)系統(tǒng)而定,比如做批處理的Hadoop,指標(biāo)可以是吞吐量。比如一個(gè)線上的系統(tǒng),那響應(yīng)時(shí)間可以作為性能指標(biāo)。在人工測試性能的時(shí)候,一定要并發(fā)的請求,而不是一個(gè)請求結(jié)束之后才發(fā)起另一次請求,否則系統(tǒng)的負(fù)載會比你預(yù)期的要小一些。
    • 處理負(fù)載的方式:無非是水平擴(kuò)展和垂直擴(kuò)展,垂直擴(kuò)展比如你可以把內(nèi)存從64G增加到128G,而水平擴(kuò)展就是你加一臺機(jī)器。對于share-nothing架構(gòu)的服務(wù)是很容易水平擴(kuò)展的。而對于數(shù)據(jù)庫這種,當(dāng)你水平擴(kuò)展的時(shí)候會遇到很多很復(fù)雜的問題,比如數(shù)據(jù)balance,比如分布式事務(wù)一致性問題。這種通常會優(yōu)先考慮垂直擴(kuò)展到極限再進(jìn)行水平擴(kuò)展。如今的NewSql就是在解決數(shù)據(jù)庫的水平擴(kuò)展的問題。
  • 關(guān)于維護(hù)性:
    • 主要關(guān)心三個(gè)方面:
      • 可維護(hù)
      • 簡單
      • 可進(jìn)化
    • 可維護(hù):
      • 維護(hù)應(yīng)用至少要負(fù)責(zé)以下這些東西:
        • 監(jiān)控并且當(dāng)系統(tǒng)出現(xiàn)問題時(shí)候在可控的時(shí)間內(nèi)迅速恢復(fù)。
        • 系統(tǒng)問題和性能問題深追到底。
        • 保持最新版本
        • 清楚理解系統(tǒng)間交互,避免修改的時(shí)候引發(fā)問題。
        • 在問題發(fā)生之前就能預(yù)見問題并解決。
        • 使用合適的工具用于版本發(fā)布和配置變更,并建立一個(gè)最佳實(shí)踐的流程。
        • 能夠搞定艱巨的維護(hù)任務(wù),比如平臺遷移。
        • 在配置發(fā)生變化的同時(shí)保證安全性。
        • 維護(hù)工作制定相關(guān)的流程來保證線上系統(tǒng)穩(wěn)定。
        • 能夠保證對系統(tǒng)的充分理解即便發(fā)生人員變動(dòng)。
      • 維護(hù)性好意味著對于常規(guī)的任務(wù)可以輕輕松松搞定,可以讓團(tuán)隊(duì)人員focus在關(guān)鍵的問題上。數(shù)據(jù)系統(tǒng)需要至少做到以下幾點(diǎn):
        • 提供監(jiān)控。
        • 提供良好的持續(xù)集成的工具。
        • 避免單點(diǎn)問題。
        • 良好的文檔,易用的操作模型。
        • 提供高性能的參數(shù)默認(rèn)值,并允許調(diào)整
        • 自我治愈能力,并允許管理員操作。
        • 表現(xiàn)出穩(wěn)定的預(yù)期表現(xiàn),不要Everyday big surprise
    • 簡單和進(jìn)化
      • 一句話:完美的抽象。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容