- 數(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
- 維護(hù)應(yīng)用至少要負(fù)責(zé)以下這些東西:
- 簡單和進(jìn)化
- 一句話:完美的抽象。
- 主要關(guān)心三個(gè)方面:
DDIA(一)
最后編輯于 :
?著作權(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ù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。