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

  • 2019 年 10 月 6 日
  • 筆記

第四章 存儲高性能

關係資料庫

  • 讀寫分離(減輕訪問壓力) 基本原理:將資料庫讀寫操作分散到不同節點上,減小單個資料庫的訪問壓力,提高訪問效率。 基本實現:
    • 資料庫伺服器搭建主從集群,一主一從或者一主多從。
    • 資料庫主機負責讀寫操作,從機負責讀操作。
    • 資料庫主機通過複製將數據同步到從機。
    • 業務伺服器將讀寫發送到主機,將讀發送到從機。

    事務問題:一致性。 【問題】 如何保證主機和從機的數據一致???主從複製的延遲性問題。

    • 二次讀取,讀完從機再讀一次主機
    • 關鍵業務指向主機,非關鍵業務指向從機
  • 分庫分表(減輕存儲壓力) 分庫 將業務模組分到不同資料庫伺服器里。比如電商項目中用戶,商品,訂單就可以防在三台不同的伺服器上。 【問題】
    • 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%)

異地多活設計步驟

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

介面級故障應對方案

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

介面級故障:

  • 內部:程式問題,電腦性能到達極限,導致資料庫慢查詢
  • 外部:黑客攻擊,促銷搶購導致用戶訪問量突增,第三方響應緩慢等

降級

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

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

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

熔斷:

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

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

限流

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

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

Tags: