一. 基礎(chǔ)架構(gòu)
架構(gòu)設(shè)計的目的是為了解決軟件系統(tǒng)復(fù)雜度所帶來的問題
復(fù)雜度的來源一——高性能
- 單臺計算機(jī)內(nèi)部為了高性能帶來的復(fù)雜度
操作系統(tǒng)、多進(jìn)程和多線程 - 多臺計算機(jī)集群為了高性能帶來的復(fù)雜度
a. 任務(wù)分配:每臺機(jī)器都可以處理完整的業(yè)務(wù)任務(wù),不同的任務(wù)分配到不同的機(jī)器上執(zhí)行
b. 任務(wù)分解:把原來大一統(tǒng)但復(fù)雜的業(yè)務(wù)系統(tǒng),拆分成小而簡單但需要多個系統(tǒng)配合的業(yè)務(wù)系統(tǒng)
復(fù)雜度的來源二——高可用
高性能增加機(jī)器目的在于“擴(kuò)展”處理性能;高可用增加機(jī)器目的在于“冗余”處理單元
- 計算高可用
主備(冷備、溫備、熱備)、主主 - 存儲高可用
數(shù)據(jù) + 存儲 = 業(yè)務(wù),存儲高可用的難點(diǎn)不在于如何備份數(shù)據(jù),而在于如何減少或者規(guī)避數(shù)據(jù)不一致對業(yè)務(wù)造成的影響。 - 高可用狀態(tài)決策
狀態(tài)決策:系統(tǒng)需要能夠判斷當(dāng)前的狀態(tài)是正常還是異常,如果出現(xiàn)了異常就要采取行動來保證高可用
d. 獨(dú)裁式:存在一個獨(dú)立的決策主體,負(fù)責(zé)手機(jī)信息然后決策。
e. 協(xié)商式:是兩個獨(dú)立的個體通過交流信息,然后根據(jù)規(guī)則進(jìn)行決策,最常用的協(xié)商式?jīng)Q策為主備用決策。
f. 民主式:多個獨(dú)立的個體通過投票的方式來進(jìn)行狀態(tài)決策
復(fù)雜度的來源三——可擴(kuò)展性
設(shè)計具備良好可擴(kuò)展性的系統(tǒng),有兩個基本條件:正確預(yù)測變化、完美封裝變化。
預(yù)測變化的復(fù)雜性來源于:
- 不能每個設(shè)計點(diǎn)都考慮可擴(kuò)展性
- 不能完全不考慮可擴(kuò)展性
- 所有的預(yù)測都存在出錯的可能性
應(yīng)對變化:
- 方案一:將變化的部分封裝到變化層,將不變的部分封裝到穩(wěn)定層。
- 方案二:提煉出抽象層和實(shí)現(xiàn)層
復(fù)雜度的來源四——低成本、安全和規(guī)模
低成本
設(shè)計三高架構(gòu)的時候,往往需要增加更多的服務(wù)器,而低成本的不是架構(gòu)設(shè)計的首要目標(biāo),而是約束,也就是說我們首先定一個成本目標(biāo),當(dāng)我們按照三高的要求設(shè)計架構(gòu)時,需要評估是否滿足成本目標(biāo),不滿足就需要重新設(shè)計。低成本給架構(gòu)設(shè)計帶來的復(fù)雜度主要體現(xiàn)在,只有創(chuàng)新才能達(dá)到低成本目標(biāo),創(chuàng)新既包括開創(chuàng)一個全新的技術(shù)領(lǐng)域,也包括引入新技術(shù)。
安全
功能安全、架構(gòu)安全
規(guī)模
規(guī)模帶來復(fù)雜度的主要原因就是“量變引起質(zhì)變”,常見的規(guī)模帶來的復(fù)雜度有:
- 功能越來越多,導(dǎo)致系統(tǒng)復(fù)雜度指數(shù)級上升
- 數(shù)據(jù)越來越多,系統(tǒng)復(fù)雜度發(fā)生質(zhì)變
架構(gòu)設(shè)計的三原則
合適原則
簡單原則
演化原則
架構(gòu)設(shè)計流程:識別復(fù)雜度
將主要的復(fù)雜度問題列出來,然后根據(jù)業(yè)務(wù)、技術(shù)、團(tuán)隊(duì)等綜合情況進(jìn)行排序,優(yōu)先解決當(dāng)前面臨的最主要的復(fù)雜度問題
架構(gòu)設(shè)計流程:設(shè)計備選方案
● 備選方案的數(shù)量以3 ~ 5個為最佳。少于3個方案可能是因?yàn)樗季S狹隘,考慮不周全;多于5個則需要耗費(fèi)大量的精力和時間,并且方案之間的差別可能不明顯。
● 備選方案的差異要比較明顯。例如,主備方案和集群方案差異就很明顯,或者同樣是主備方案,用ZooKeeper做主備決策和用Keepalived做主備決策的差異也很明顯。但是都用ZooKeeper做主備決策,一個檢測周期是1分鐘,一個檢測周期是5分鐘,這就不是架構(gòu)上的差異,而是細(xì)節(jié)上的差異了,不適合做成兩個方案。
● 備選方案的技術(shù)不要只局限于已經(jīng)熟悉的技術(shù)。設(shè)計架構(gòu)時,架構(gòu)師需要將視野放寬,考慮更多可能性。很多架構(gòu)師或者設(shè)計師積累了一些成功的經(jīng)驗(yàn),出于快速完成任務(wù)和降低風(fēng)險的目的,可能自覺或者不自覺地傾向于使用自己已經(jīng)熟悉的技術(shù),對于新的技術(shù)有一種不放心的感覺。就像那句俗語說的:“如果你手里有一把錘子,所有的問題在你看來都是釘子”。
架構(gòu)設(shè)計流程:評估和選擇備選方案
列出我們需要關(guān)注的質(zhì)量屬性點(diǎn),然后分別從這些質(zhì)量屬性的維度去評估每個方案,再綜合挑選適合當(dāng)時情況的最優(yōu)方案。常見的方案質(zhì)量屬性點(diǎn)有:性能、可用性、硬件成本、項(xiàng)目投入、復(fù)雜度、安全性、可擴(kuò)展性等
架構(gòu)設(shè)計流程:詳細(xì)方案設(shè)計
二. 高性能架構(gòu)模式
高性能數(shù)據(jù)庫集群:讀寫分離
讀寫分離:將數(shù)據(jù)庫的讀寫操作分散到不同的節(jié)點(diǎn)上。實(shí)現(xiàn)邏輯并不復(fù)雜,但是會引入兩個復(fù)雜度,復(fù)制延遲和分配機(jī)制。
復(fù)制延遲:
- 讀寫?zhàn)みB,寫操作后的讀操作指定發(fā)給數(shù)據(jù)庫主服務(wù)器。
- 讀從機(jī)失敗后, 再讀一次主機(jī)。
- 關(guān)鍵業(yè)務(wù)讀寫操作全部指向主機(jī),非關(guān)鍵業(yè)務(wù)采用讀寫分離
分配機(jī)制:
- 程序代碼封裝
- 中間件實(shí)現(xiàn)
高性能數(shù)據(jù)庫集群:分庫分表
業(yè)務(wù)分庫
業(yè)務(wù)分庫:按照業(yè)務(wù)模塊將數(shù)據(jù)分散到不同的數(shù)據(jù)庫服務(wù)器。
分庫分表雖然分散了存儲和訪問壓力,但是會帶來一下問題:
- JOIN操作問題
- 事務(wù)問題
- 成本問題
分表
單表數(shù)據(jù)拆分有兩種方式:垂直分表和水平分表
垂直分表:
垂直分表適合將表中某些不常用且占了大量空間的列拆分出去。垂直分表引入的復(fù)雜性主要體現(xiàn)在表操作的數(shù)量要增加。例如,原來只要一次查詢就可以獲取所有的信息,現(xiàn)在需要兩次查詢,
水平分表:
- 水平分表相比垂直分表,會引入更多的復(fù)雜性,主要表現(xiàn)在下面幾個方面:
路由:水平分表后,某條數(shù)據(jù)具體屬于哪個切分后的子表,需要增加路由算法進(jìn)行計算 - JOIN操作:水平分表后,數(shù)據(jù)分散在多個表中,如果需要與其他表進(jìn)行join查詢,需要在業(yè)務(wù)代碼或者數(shù)據(jù)庫中間件中進(jìn)行多次join查詢,然后將結(jié)果合并。
- COUNT操作:
高性能NoSQL
關(guān)系型數(shù)據(jù)庫存在以下缺點(diǎn):
- 關(guān)系數(shù)據(jù)庫存儲的是行記錄,無法存儲數(shù)據(jù)結(jié)構(gòu)
- 關(guān)系數(shù)據(jù)庫的schema擴(kuò)展很不方便
- 關(guān)系數(shù)據(jù)庫在大數(shù)據(jù)場景下I/O較高
- 關(guān)系數(shù)據(jù)庫的全文搜索功能比較弱
常見的NoSql分為以下四種,分別可以解決關(guān)系數(shù)據(jù)庫的四個缺點(diǎn)
- KV存儲
- 文檔數(shù)據(jù)庫
- 列式數(shù)據(jù)庫
- 全文檢索數(shù)據(jù)庫
高性能緩存架構(gòu)
緩存穿透、緩存雪崩、緩存擊穿
單服務(wù)器高性能模式:PPC與TPC
1.PPC: Process Per Connection的縮寫,其含義是指每次有新的連接就新建一個進(jìn)程去專門處理這個連接的請求
2.perfork: prefork就是提前創(chuàng)建進(jìn)程(pre-fork)。系統(tǒng)在啟動的時候就預(yù)先創(chuàng)建好進(jìn)程,然后才開始接受用戶的請求,當(dāng)有新的連接進(jìn)來的時候,就可以省去fork進(jìn)程的操作,讓用戶訪問更快、體驗(yàn)更好,但是會有 "驚群"現(xiàn)象,因?yàn)閷?shí)際只有一個子進(jìn)程能處理,但是所有阻塞的子進(jìn)程都會被喚醒。
3.TPC: Thread Per Connection的縮寫,其含義是指每次有新的連接就新建一個線程去專門處理這個連接的請求
4.PRETHREAD: prethread模式會預(yù)先創(chuàng)建線程,然后才開始接受用戶的請求,當(dāng)有新的連接進(jìn)來的時候,就可以省去創(chuàng)建線程的操作。
單服務(wù)器高性能模式:Reactor與Proactor
高性能負(fù)載均衡:分類及架構(gòu)
負(fù)載均衡包含三種:DNS負(fù)載均衡、軟件負(fù)載均衡、硬件負(fù)載均衡
DNS負(fù)載均衡
優(yōu)點(diǎn)
- 簡單、成本低:負(fù)載均衡工作交給DNS服務(wù)器處理,無須自己開發(fā)或者維護(hù)負(fù)載均衡設(shè)備。
- 就近訪問,提升訪問速度:DNS解析時可以根據(jù)請求來源IP,解析成距離用戶最近的服務(wù)器地址,可以加快訪問速度,改善性能。
缺點(diǎn)
- 更新不及時:DNS緩存的時間比較長,修改DNS配置后,由于緩存的原因,還是有很多用戶會繼續(xù)訪問修改前的IP
- DNS負(fù)載均衡的控制權(quán)在域名商那里,無法根據(jù)業(yè)務(wù)特點(diǎn)針對其做更多的定制化功能和擴(kuò)展特性
- 分配策略比較簡單:DNS負(fù)載均衡支持的算法少;不能區(qū)分服務(wù)器的差異(不能根據(jù)系統(tǒng)與服務(wù)的狀態(tài)來判斷負(fù)載);也無法感知后端服務(wù)器的狀態(tài)。
硬件負(fù)載均衡
硬件負(fù)載均衡是通過單獨(dú)的硬件設(shè)備來實(shí)現(xiàn)負(fù)載均衡功能,例如F5和A10
優(yōu)點(diǎn)
- 功能強(qiáng)大:全面支持各層級的負(fù)載均衡,支持全面的負(fù)載均衡算法,支持全局負(fù)載均衡。
- 性能強(qiáng)大:對比一下,軟件負(fù)載均衡支持到10萬級并發(fā)已經(jīng)很厲害了,硬件負(fù)載均衡可以支持100萬以上的并發(fā)。
- 穩(wěn)定性高:商用硬件負(fù)載均衡,經(jīng)過了良好的嚴(yán)格測試,經(jīng)過大規(guī)模使用,穩(wěn)定性高。
- 支持安全防護(hù):硬件均衡設(shè)備除具備負(fù)載均衡功能外,還具備防火墻、防DDoS攻擊等安全功能
缺點(diǎn)
- 價格行規(guī)
- 擴(kuò)展能力差:硬件設(shè)備,可以根據(jù)業(yè)務(wù)進(jìn)行配置,但無法進(jìn)行擴(kuò)展和定制
軟件負(fù)載均衡
優(yōu)點(diǎn)
- 簡單
- 便宜
- 靈活
缺點(diǎn)
- 性能一般
- 功能沒有硬件負(fù)載均衡一樣強(qiáng)大
- 一般不具備防火墻、防DDos攻擊等安全功能。
高性能負(fù)載均衡:算法
輪訓(xùn)、加權(quán)輪訓(xùn)、負(fù)載最低、性能最優(yōu)、Hash類