《從零開始學架構》筆記——第二部分:高性能和高可用架構模式


第四章 存儲高性能

關系數據庫

  • 讀寫分離(減輕訪問壓力)

    基本原理:將數據庫讀寫操作分散到不同節點上,減小單個數據庫的訪問壓力,提高訪問效率。

    基本實現:

    • 數據庫服務器搭建主從集群,一主一從或者一主多從。
    • 數據庫主機負責讀寫操作,從機負責讀操作。
    • 數據庫主機通過復制將數據同步到從機。
    • 業務服務器將讀寫發送到主機,將讀發送到從機。

    事務問題:一致性。


    【問題】

    如何保證主機和從機的數據一致???主從復制的延遲性問題。

    • 二次讀取,讀完從機再讀一次主機
    • 關鍵業務指向主機,非關鍵業務指向從機
  • 分庫分表(減輕存儲壓力)

    分庫

    將業務模塊分到不同數據庫服務器里。比如電商項目中用戶,商品,訂單就可以防在三台不同的服務器上。

    【問題】

    • join操作問題

      無法實現關聯查詢

    • 事務問題

      數據需要保持一致。比如訂單加1商品數量就會減1。(延遲性問題)

    • 成本

    分表

    單表數據拆分有水平拆分和垂直拆分兩種。

    拆分后可以放在同一數據庫中,也可以放在不同數據庫中。

    • 垂直分表

      將表中不常用的列拆分出去。會帶來表數量增加的復雜性。但能顯著提高查詢效率。

    • 水平分表

      水平分表適合表行數特別大的表。

      • 水平分表的問題

        • 路由:根據什么條件拆分表

          • 范圍路由:根據有序的數據列作為路由拆分條件,比如1-999999,1000000-1999999.

            建議段大小在100萬到2000萬之間

            優缺點:分段大小選取具有復雜性;但可以隨着數據增加平滑擴展新的表

          • Hash路由

          • 配置路由

        • join操作需要合並結果

        • order by 操作無法在數據庫中進行,只能通過業務代碼或者數據庫中間件分別查詢,然后匯總排序

NoSQL

NoSQL分類:

  • K-V存儲:Redis
  • 文檔數據庫:MongoDB
  • 列式數據庫:HBase
  • 全文搜索引擎:ElasticSearch

緩存

基本原理:將可能會重用的數據放在內存中,一次生成,多次使用。

【一個明星發一條微博,執行一個insert,然后n多個select】


  • 緩存穿透

    緩存沒有發揮作用,業務系統向緩存中讀取,但並沒有數據。

    問題:

    • 存儲數據不存在
    • 緩存需要時間較長
  • 緩存雪崩

    當緩存失效后系統性能急劇下降。很多請求訪問數據庫,同時生成緩存。

    解決方案:

    • 更新鎖,只能有一個線程生成緩存。(分布式鎖)
    • 后台更新。不用業務線程更新,而是用后台線程專門更新。
  • 緩存熱點

    復制多份緩存,創建緩存服務器集群,將請求分發到不同服務器上。

    【比如新浪微博上粉絲超過100w的明星發的微博,生成100份緩存(當然需要100台服務器)】

第五章 計算高性能

從物理層面上來說:

  • 盡量提升單服務器的性能,將資源發揮到極致
  • 單服務器達到性能瓶頸,設計服務器集群方案

單服務器高性能

集群高性能

負載均衡代替前面的任務分配。

負載均衡分類

  • DNS負載均衡(實現地理級別的負載均衡)
  • 硬件負載均衡(類似路由交換機)100w以上的並發,就是貴,好一點的就是一台寶馬了。
  • 軟件負載均衡(Nginx&&LVS)

負載均衡算法

  • 輪詢
  • 加權輪詢
  • 負載最低優先
  • Hash類(根據關鍵信息進行Hash運算,將相同Hash值的請求分發到同一台服務器山)

第六章 分布式系統設計理論CAP

對於分布式計算系統,只能滿足一致性,可用性,分區容錯性三個中的兩個。

三進二

  • 一致性

    所有節點在同一時刻都能看到相同的數據。(比如MySQL集群主從數據一致性)

  • 可用性

    非故障節點在合理時間返回合理響應。(不能是錯誤或者超時的響應)

  • 分區容錯性

    當出現網絡分區后(網絡故障,丟包網絡中斷),系統可以繼續運行。

CAP細節

CAP粒度是數據,而不是系統

比如用戶賬號數據選擇CP,而其他信息選擇AP

正常情況下,可以同時滿足CA

當發生了分區情況,也就是網絡故障,才會存在CA的選擇,在網絡正常的情況下,CA可以同時滿足。


ACID:

關於數據庫事務完整性的理論

  • 原子性:單個事務要么都完成,要么都失敗(比如銀行轉賬,一個減,一個加,必須同步)
  • 一致性:並發請求下數據保持一致
  • 隔離性:防止多個事務並發交叉執行導致的數據不一致問題。(悲觀鎖和樂觀鎖實現)
  • 持久性:事務結束后,對數據的修改就是永久的,即使系統故障也不會丟失。

BASE:

如果無法達到強一致性,那就最終一致性

  • Basically Availible 基本可用

    分布式系統故障時,保證核心功能可用(保持登錄可用,損失注冊)

  • Soft Status 軟狀態

    數據不一致

  • Eventually Consistency 最終一致性

BASE理論是AP方案的延申。

第七章 存儲高可用

主備復制

  • 主機存儲數據,將數據復制給備機
  • 備機不提供讀寫服務
  • 主機發生故障需要人工干預將備機升為主機

主從復制

  • 主機存儲數據,將數據復制給備機
  • 備機提供讀服務
  • 主機故障可以進行讀業務,發揮了備機的性能
  • 主從復制比主備復制復雜,主要體現在客戶端需要識別主從關系
  • 適用寫少讀多的系統(論壇,新聞網站)

主備倒換和主從倒換

主備復制和主從復制的共性問題是主機故障,無法進行寫操作。

主備倒換和主從倒換在原有基礎上增加角色倒換的功能。


  • 互連式:主備機間建立狀態傳遞的通道。

    通道可以是網絡連接,也可以是串口連接。

  • 中介式

    主備機不進行直接連接,而是通過中介傳遞信息。(需要中介高可用)

    Zookeeper仲裁節點設置節點級別。

  • 模擬式

    將備機模擬成客戶端,模擬讀寫操作。

主主復制

  • 兩台主機都有數據,通過復制通道同步
  • 一致性問題很大
  • 適合臨時性,可丟失,可覆蓋的場景

數據分散集群

數據分散集群指多個服務器組成一個集群,每台服務器都會存儲一部分數據,同時,每台服務器會備份一部分數據。(分庫分表)

分布式事務算法:保持一致性

2PC 二階段提交

  • 第一階段:協調者向所有參與者發送請求(投票階段)(任一參與者否定都可終止提交)
  • 第二階段:參與者全部通過請求,協調者提交請求。

問題:

  • 同步阻塞:協調者和參與者互相等待
  • 協調者單點故障

3PC 三階段提交

  • 第一階段:協調者向所有參與者發送請求(投票階段),參與者有否定則事務中止,在超時時間內收到所有yes則進入第二階段。
  • 第二階段:協調者發送預提交給參與者,參與者收到信息執行事務操作,返回ACK消息。
  • 第三階段:協調者收到所有的ACK消息后發送執行提交。參與者執行提交后返回已提交消息給協調者。

分布式一致性算法

  • Paxos(純理論)

    特別復雜

    • 多數一致性
    • 讀操作也會將算法完全執行一遍
  • Raft

    • Leader選舉
    • 日志復制
    • 安全保證
  • ZAB

    Zookeeper采用的分布式一致性算法

第八章 計算高可用

當部分硬件損壞時,計算任務可以正常運行。

基本思想:通過增加更多的服務器達到計算高可用。

主備

  • 主機執行所有的計算任務

  • 當主機損壞且無法恢復時,需要人工將備機升至主機,並且增加新的備機

  • 冷備:程序包和配置文件准備好,啟動服務器,但業務不啟動;溫備:業務已啟動,但不對外提供服務

  • 適用內部管理系統,后台管理系統的等使用人數不多的情況

主從

  • 主機執行部分任務,備機執行部分任務
  • 主機故障,任務分發不變,即使主機無法正常運作
  • 需要人工將備機升為主機,並添加新的備機

對稱集群(負載均衡集群)

  • 正常情況下,任務分配器將任務分配給不同的主機
  • 當某台服務器故障后,任務分配器將跳過該台服務器
  • 當故障服務器恢復后,重新分配任務

非對稱集群

Master-Slave

  • 集群通過某種方式區分服務器角色,選出Master服務器

  • 當Master服務器故障后,推選出新的Master服務器

  • Zookeeper通過ZAB協議選取Master

第九章 業務高可用

異地多活

機房斷電,機房火災,城市地震...(但是雞蛋也不是那么容易碎的)(不要把雞蛋放在一個籃子里)

  • 同城異區
  • 跨城異地
  • 跨國異地

異地多活設計技巧

  • 保證核心業務的異地多活
  • 核心數據最終一致(異地多活不可能很快)
  • 采用多種手段同步數據
    • 消息隊列
    • 二次讀取
    • 回源讀取等等
  • 保證大部分地區的異地多活(無法達到100%)

異地多活設計步驟

  • 業務分級(挑選核心業務)
  • 數據分類(數據量,唯一性,實時性,可恢復性)
  • 數據同步(存儲系統同步,消息隊列同步等等)
  • 異常處理(多通道同步,同步和訪問結合,日志記錄,用戶補償)

接口級故障應對方案

相對與概率小的機房火災,斷電等故障,接口故障發生的情況更多。

接口級故障:

  • 內部:程序問題,計算機性能到達極限,導致數據庫慢查詢
  • 外部:黑客攻擊,促銷搶購導致用戶訪問量突增,第三方響應緩慢等

降級

降級是着眼與整個系統的高可用,丟車保帥的一種行為。

比如論壇的系統接近負載,暫停發帖子功能,只能看帖子。

(如果系統持續負載,服務器崩潰,看帖子的功能也廢了)


熔斷:

是降級的一種情況。換句話說,熔斷會導致降級。

熔斷是指請求達到一個閾值,暫停該服務的調用,防止系統負載過大,導致崩潰。


限流

只讓一部分訪問通過。保證一部分響應優於全部不能響應。

  • 基於請求限流(控制閾值)
  • 基於資源限流(對關鍵資源限流,比如線程池最大並發量)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM