從零開始學架構(gòu)讀書筆記

??軟件架構(gòu)的出現(xiàn)是為了解決系統(tǒng)規(guī)模增加后出現(xiàn)了系統(tǒng)耦合嚴重,開發(fā)效率低,邏輯復(fù)雜,擴展困難等問題。所以架構(gòu)設(shè)計是為了解決軟件復(fù)雜度而存在的,所以架構(gòu)設(shè)計的目地是識別出需求的復(fù)雜點然后針對性的解決。系統(tǒng)設(shè)計時需要考慮:性能,系統(tǒng)的可擴展性,安全性,高可用,成本。
??架構(gòu)師的工作并不神秘,成熟的架構(gòu)師需要對已經(jīng)存在的技術(shù)非常熟悉,對已經(jīng)經(jīng)過驗證的架構(gòu)模式爛熟于心,然后根據(jù)自己對業(yè)務(wù)的理解,挑選合適的架構(gòu)模式進行組合,再對組合后的方案進行修改和調(diào)整。

系統(tǒng)復(fù)雜性來源

  • 高性能:為了提高系統(tǒng)每秒處理業(yè)務(wù)的能力,我們會采用集群與將業(yè)務(wù)進行分解為子系統(tǒng),系統(tǒng)間通過網(wǎng)絡(luò)進行調(diào)用。這都增加了系統(tǒng)的復(fù)雜度。
  • 高可用:解決系統(tǒng)的高可用采用的都是冗余設(shè)備來進行處理。而冗余的設(shè)備需要考慮數(shù)據(jù)的一致性,狀態(tài)的決策(什么情況下將機器下線)。
  • 可擴展性:業(yè)務(wù)需求本身具有不可預(yù)測性,為了實現(xiàn)業(yè)務(wù)上的靈活性往往需要抽像出更多的層來應(yīng)用業(yè)務(wù)需求的變化。
  • 低成本:與增加機器實現(xiàn)系統(tǒng)的高性能與高可用沖突。
  • 系統(tǒng)安全性。

架構(gòu)設(shè)計的原則

??真正優(yōu)秀的架構(gòu)都是在企業(yè)當前人力、條件、業(yè)務(wù)等各種約束下設(shè)計出來的,能夠合理地將資源整合在一起并發(fā)揮出最大功效,并且能夠快速落地。有下面幾個原則:

  • 合適原則:合適優(yōu)于業(yè)界領(lǐng)先。
  • 簡單原則:“簡單優(yōu)于復(fù)雜。
  • 演化原則宣言:“演化優(yōu)于一步到位”。

架構(gòu)設(shè)計的步驟

  • 識別系統(tǒng)的復(fù)雜性:將主要的復(fù)雜度問題列出來,然后根據(jù)業(yè)務(wù)、技術(shù)、團隊等綜合情況進行排序,優(yōu)先解決當前面臨的最主要的復(fù)雜度問題??梢圆捎门挪榉▉碜R別系統(tǒng)的復(fù)雜性。其中1:高性能需要有TPS/QPS的數(shù)據(jù)支撐,分別考慮讀寫性能。2:高可用需要根據(jù)業(yè)務(wù)的影響程度進行判斷,假設(shè)系統(tǒng)宕機后的影響有多大,包括(讀,寫,存儲)3:可擴展性需要結(jié)合業(yè)務(wù)的特點進行分析。4:安全性同樣是需要根據(jù)業(yè)務(wù)特點進行判斷。
  • 設(shè)計備選方案:備選方案只關(guān)注技術(shù)選型,而不是技術(shù)細節(jié),技術(shù)選型的差異化要比較明顯。
  • 評估和選擇備選方案:通過對方案質(zhì)量屬性點進行360度環(huán)評,質(zhì)量屬性點包括:性能,可用性,硬件成本,項目投入,復(fù)雜度,安全性,可擴展性。
  • 詳細方案設(shè)計:詳細方案設(shè)計就是將方案涉及的關(guān)鍵技術(shù)細節(jié)給確定下來。

架構(gòu)模式

??在具體的實踐過程中,為了更快、更好地設(shè)計出優(yōu)秀的架構(gòu)需要掌握業(yè)界已經(jīng)成熟的各種架構(gòu)模式。大部分情況下,我們做架構(gòu)設(shè)計主要都是基于已有的成熟模式,結(jié)合業(yè)務(wù)和團隊的具體情況,進行一定的優(yōu)化或者調(diào)整;即使少部分情況我們需要進行較大的創(chuàng)新,前提也是需要對已有的各種架構(gòu)模式和技術(shù)非常熟悉。

高性能架構(gòu)模式

  • 數(shù)據(jù)庫讀寫分離
    讀寫分離的基本原理是將數(shù)據(jù)庫讀寫操作分散到不同的節(jié)點上,下面是其基本架構(gòu)圖


    讀寫分離架構(gòu)圖

    數(shù)據(jù)采用讀寫分離后需要考慮復(fù)制延遲的情況。解決辦法有:

  1. 寫操作后的讀操作指定發(fā)給數(shù)據(jù)庫主服務(wù)器。
  2. 讀從機失敗后再讀一次主機。
  3. 關(guān)鍵業(yè)務(wù)讀寫操作全部指向主機,非關(guān)鍵業(yè)務(wù)采用讀寫分離。

讀寫分離后還需要考慮分配機制 將讀寫操作區(qū)分開來,然后訪問不同的數(shù)據(jù)庫服務(wù)器,一般有兩種方式:

  1. 程序代碼封裝
  2. 中間件封裝。
  • 數(shù)據(jù)庫分庫分表
    ??當數(shù)據(jù)量達到千萬甚至上億條的時候,單臺數(shù)據(jù)庫服務(wù)器的存儲能力會成為系統(tǒng)的瓶頸,分庫分表用于分散存儲壓力同時也解決了訪問壓力。分庫可以分為:
    1:業(yè)務(wù)分庫,將不同的業(yè)務(wù)數(shù)據(jù)存儲到不同的數(shù)據(jù)庫服務(wù)器中。
    2:將相同的表數(shù)據(jù)分散存儲在不同的數(shù)據(jù)庫服務(wù)器中,用于處理數(shù)據(jù)量特別大的表。
    分表拆分同樣有兩種方式,分別為:
    1:垂直拆分,將一張表分成兩張表或者多張表,不同的表包含不同的列。
    2:水平拆分,將一張表的記錄分成多張表,不同的表包含不同的記錄數(shù)。
    分庫分表需要考慮:
    1:數(shù)據(jù)路由規(guī)則,是采用范圍路由還是hash路由的方式。
    2:數(shù)據(jù)庫的事務(wù),由于分庫后數(shù)據(jù)不在同一個庫里,原來數(shù)據(jù)庫提供的事務(wù)不起作用了。
    3:在單庫里表的join,count,order by 等操作都會變的比單庫單表復(fù)雜的多。
    在實現(xiàn)方式上,分庫分表與讀寫分享一樣。都有兩種方式,程序封裝或者采用中間件封裝。
  • 高性能的NoSQL
    1:K-V 存儲:解決關(guān)系數(shù)據(jù)庫無法存儲數(shù)據(jù)結(jié)構(gòu)的問題,以 Redis 為代表。
    2:文檔數(shù)據(jù)庫:解決關(guān)系數(shù)據(jù)庫強 schema 約束的問題,以 MongoDB 為代表。
    3:列式數(shù)據(jù)庫:解決關(guān)系數(shù)據(jù)庫大數(shù)據(jù)場景下的 I/O 問題,以 HBase 為代表。
    4:全文搜索引擎:解決關(guān)系數(shù)據(jù)庫的全文搜索性能問題,以 Elasticsearch 為代表。
  • 緩存
    能夠應(yīng)用緩存的場景為:1:需要經(jīng)過復(fù)雜運算后得出的數(shù)據(jù)。2:讀多寫少的數(shù)據(jù),比如微博。的架構(gòu)設(shè)計階段,緩存需要考慮如下問題:
    1:緩存數(shù)據(jù)不存在,造成緩存穿透,最終拖跨存儲服務(wù)器(可以對不存在的數(shù)據(jù)存一個默認值)。
    2:緩存數(shù)據(jù)生成需要耗費太多的資源,有可能拖跨整個系統(tǒng)。
    3:緩存失效,同時有大量請求失效的緩存數(shù)據(jù)造成緩存雪崩。解決辦法可有采用更新鎖或者后臺更新的方式。
    4:熱點數(shù)據(jù)的緩存,需要對熱點數(shù)據(jù)保存多個緩存副本,這樣可以將請求分散在不同的緩存服務(wù)器上。對于多個副本的緩存,內(nèi)容一樣,可以設(shè)置成不同的過期時間,這樣可以避免引起緩存雪崩。
  • 高性能負載均衡(任務(wù)分配器)

    ??負載均衡可以分為DNS負載均衡,硬件負載均衡器與軟件負載均衡。其中DNS用于處理地理位置上的負載均衡。硬件負載均衡(F5,A10)具有功能強大,性能強悍但是傷錢但擴展性差,而軟件負載均衡(Nginx, LVS)具有簡單,便宜且擴展性容易但是性能一般。在實際的系統(tǒng)中可以綜合使用三種負載均衡器,以便發(fā)揮他們各自的優(yōu)點,如下圖所示:
    可以采用的負載均衡器組合

    負載均衡算法有以下幾類:

    1:輪詢:將任務(wù)平均分配到服務(wù)器上,具有實現(xiàn)簡單的特點。
    2:加權(quán)輪詢:可以根據(jù)硬件機器的特性給不同的服務(wù)器配置不同的權(quán)重。
    3:負載最低優(yōu)先:需要感知服務(wù)器的性能指標,可以充分利用用服務(wù)器的性能便增加了分配算法的復(fù)雜度。
    4:性能最優(yōu)優(yōu)先:優(yōu)先將任務(wù)分配給處理速度最快的服務(wù)器,通過這種方式達到最快響應(yīng)。需要收集服務(wù)器返回任務(wù)的時間。
    5:Hash算法,根據(jù)請求的某些關(guān)鍵信息進行Hash運算,將相同的hash值分配到同一臺服務(wù)器,可以滿足特定的業(yè)務(wù)需求。

高可用架構(gòu)模式

??高可用的本質(zhì)是通過冗余的機器來做到服務(wù)的高可用。

  • 存儲高可用架構(gòu)
    存儲高可用需要考慮復(fù)制延遲和中斷導(dǎo)致的數(shù)據(jù)不一致問題。常見的高可用存儲架構(gòu)有主備、主從、主主。

    1:主備復(fù)制:這種方式的優(yōu)點是簡單,備機只做為數(shù)據(jù)備份,不提供服務(wù),主機出現(xiàn)問題后需要人工參與的方式進行恢復(fù)。架構(gòu)圖如下:
    主備復(fù)制

    2:主從復(fù)制:這種方式從機會提供相應(yīng)的讀能力,可以避免硬件的浪費。缺點是客戶端需要感知到主從關(guān)系統(tǒng),將寫操作分配給主機,將讀操作分配給備機,增加了復(fù)雜性。同時會有數(shù)據(jù)延時,某些業(yè)務(wù)場景可能有問題。架構(gòu)圖如下:
    主從復(fù)制

    3:主主復(fù)制:這種模式兩臺機器都做為主機,客戶端的請求可以發(fā)送到任意一臺機器。這種方式的架構(gòu)只有對特定業(yè)務(wù)情況下才會使用,因為兩臺主機之間需要雙向復(fù)制,比如日志數(shù)據(jù)可以采用這種方式處理而庫存數(shù)據(jù)就不能采用這種方式進行架構(gòu)設(shè)計。架構(gòu)圖如下:
    主主復(fù)制

    ??無論是主從模式還是主備模式都需要人工參與的方式進行數(shù)據(jù)恢復(fù)。而人工參與的不確定性就增加了,比如主機在凌晨掛了。雙機自動切換能夠在無需人工參與的情況下或只需人工半?yún)⑴c的情況下快速的進行雙機切換。自動切換需要考慮以下三個點:
    1:如何判斷主機是不可用狀態(tài)。
    2:切換時機與切換策略是什么,主機恢復(fù)后是繼續(xù)做主機還是做從機。
    3:如何解決數(shù)據(jù)沖突。
    根據(jù)狀態(tài)傳遞渠道的不同,常見的主備(主從)切換架構(gòu)有三種形式:互連式、中介式和模擬式。
    1)互連式:主備機直接建立狀態(tài)傳遞的渠道,缺點是當傳遞狀態(tài)的渠道本身就有問題,可能出現(xiàn)雙主的情況。架構(gòu)圖請注意與主備復(fù)制架構(gòu)對比
    互連式主備雙機切換

    2)中介式:主備兩者之外引入第三方中介,主備機之間不直接連接,而都去連接中介,并且通過中介來傳遞狀態(tài)信息,其架構(gòu)圖如下:
    中介式主備雙機切換

    3)模擬式:主備機之間并不傳遞任何狀態(tài)數(shù)據(jù),而是備機模擬成一個客戶端,向主機發(fā)起模擬的讀寫操作,根據(jù)讀寫操作的響應(yīng)情況來判斷主機的狀態(tài)。其基本架構(gòu)如下:
    模擬式主備雙機切換

    4:數(shù)據(jù)分散集群
    ??數(shù)據(jù)分散集群用于解決單機存儲不下所有數(shù)據(jù)的業(yè)務(wù),通過多臺機器形成集群進行分散存儲。其中分散集群需要考慮數(shù)據(jù)存儲的均衡性:不能有一部分機器存儲了大部分的數(shù)據(jù);同時還需要考慮數(shù)據(jù)的容錯性,一旦有一臺機器損壞了,如何保證數(shù)據(jù)不丟失;再有就是集群的伸縮能力了,當集群的機器不夠,如何保證數(shù)據(jù)數(shù)據(jù)的遷移與新機器的平衡性。
  • 計算高可用架構(gòu)

    ??計算高可用相比存儲高可用來說就簡單的多了,作為任務(wù)分配器(負載均衡器)需要知道有那些機器可有用來做計算與相應(yīng)的任務(wù)分配策略。計算高可能同樣可以分為主備,主從,集群。其中集群模式用的相對來說是比較多的,主備對硬件有一定的浪費。集群模式架構(gòu)如下圖所示:
    計算集群模式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容