分布式系統核心原理

CAP定理與權衡實踐

CAP定理
  • 一致性(Consistency)

    • 強一致性:所有讀寫操作均基于最新數據(如銀行轉賬)。
    • 最終一致性:數據副本經過一段時間后達到一致(如社交媒體的點贊數)。
    • 技術實現:兩階段提交(2PC)、Paxos/Raft共識算法。
  • 可用性(Availability)

    • 響應要求:系統必須在有限時間內返回結果(即使數據可能過時)。
    • 設計原則:無單點故障、快速失敗(Fail Fast)、優雅降級。
  • 分區容錯性(Partition Tolerance)

    • 必然性:分布式系統必須容忍網絡分區(因網絡不可靠是客觀存在)。
    • 設計策略:冗余部署、多副本同步、自動故障轉移。
CAP的權衡實踐
  • CP系統(一致性+分區容錯)

    • 特點:在分區發生時,優先保證一致性,犧牲可用性(拒絕部分請求)。
    • 典型系統:ZooKeeper選舉Leader期間服務不可寫,保證數據一致性;Etcd基于Raft協議,分區時少數派節點不可用。
    • 適用場景:金融交易系統(如支付結算),分布式鎖服務(如避免重復扣款)。
  • AP系統(可用性+分區容錯)

    • 特點:分區發生時,允許返回舊數據,優先保證服務可用性。
    • 典型系統:Eureka服務注冊中心在分區時允許節點獨立運行。
    • 適用場景:社交媒體(如點贊、評論功能);實時性要求不高的數據展示(如商品詳情頁緩存)。
  • CA系統(理論存在,實際不成立)

    • 矛盾點:分布式系統必須面對網絡分區,無法完全放棄P。
    • 誤解案例:單機數據庫(如MySQL主從架構)看似CA,但本質非分布式系統。
CAP的實際工程權衡
  • 強一致性優先(CP) :如訂單支付、庫存扣減,使用分布式事務(如Seata的AT模式)或同步復制。

  • 高可用優先(AP) :如用戶會話管理、新聞Feed流,使用最終一致性(如Redis跨機房異步復制)。

  • 混合策略——分而治之:不同子系統采用不同CAP策略。

    • 訂單服務(CP) :強一致性保證支付原子性。
    • 商品服務(AP) :允許緩存短暫不一致,優先展示頁面。
  • BASE(Basically Available, Soft state, Eventually consistent)

    • 基本可用:允許降級響應(如返回默認庫存值)。
    • 軟狀態:中間狀態允許不同步(如訂單“處理中”狀態)。
    • 最終一致:通過異步補償達成一致(如Saga模式)。
網絡分區的應對策略
  • 檢測與響應

    • 心跳檢測:通過ZooKeeper或Consul監控節點健康狀態。
    • 多數派仲裁:只有多數節點存活時允許寫入(如Paxos要求多數派同意)。
    • Fencing機制:舊Leader被隔離后禁止寫操作(如ZooKeeper的ZXID校驗)。
  • 恢復后的數據調和

    • Last Write Wins(LWW) :以最新時間戳為準(簡單但可能丟數據)。
    • 向量時鐘(Vector Clock) :通過邏輯時間戳合并沖突(如DynamoDB)。
    • 人工干預:記錄沖突日志供運維介入(如金融對賬系統)。

共識算法

Paxos算法
  • 角色

    • Proposer(提議者) :發起提案(如提議某個值)。
    • Acceptor(接受者) :接受或拒絕提案。
    • Learner(學習者) :學習最終達成一致的值。
  • 流程

    • Prepare階段:Proposer發送提案編號(n)給Acceptors。
    • Promise階段:Acceptor承諾不再接受編號小于n的提案,并返回已接受的最高編號提案。
    • Accept階段:Proposer選擇多數派Acceptors接受的最高值,發送Accept請求。
    • Learn階段:一旦提案被多數派接受,Learner廣播最終值。
Raft算法
  • 設計目標:簡化Paxos的理解與實現,明確角色劃分。
  • 角色

    • Leader(領導者) :唯一處理客戶端請求的節點,負責日志復制。
    • Follower(跟隨者) :被動接收Leader的日志條目。
    • Candidate(候選者) :在Leader失效時發起選舉。
  • Leader選舉

    • Follower在超時(Election Timeout)后成為Candidate,發起選舉。
    • 獲得多數派投票的Candidate成為新Leader。
  • 日志復制

    • Leader接收客戶端請求,將日志條目廣播給Followers。
    • 多數派確認后提交日志,應用到狀態機。
  • 安全性保證

    • 選舉限制:只有擁有最新日志的Candidate才能成為Leader。
    • 日志匹配:強制Followers的日志與Leader一致。
ZAB協議(ZooKeeper Atomic Broadcast)
  • 設計目標:為ZooKeeper設計的高吞吐量原子廣播協議。
  • Leader選舉(Fast Leader Election):節點通過交換epoch(時代編號)快速選出最新數據的Leader。
  • 原子廣播:Leader為每個事務生成全局有序的ZXID(事務ID);Followers按順序提交事務,確保所有節點狀態一致。

分布式事務解決方案

兩階段提交(2PC,Two-Phase Commit)
  • 準備階段(Prepare Phase)

    • 協調者(Coordinator) 向所有參與者(Participant) 發送事務請求,詢問是否可以提交。
    • 參與者執行事務操作(但不提交),鎖定資源,并返回“同意”(Yes)或“拒絕”(No)。
  • 提交階段(Commit Phase)

    • 若所有參與者返回“Yes”,協調者發送提交命令,參與者提交事務并釋放鎖。
    • 若有任一參與者返回“No”,協調者發送回滾命令,參與者撤銷操作。
三階段提交(3PC,Three-Phase Commit)
  • CanCommit階段:協調者詢問參與者是否“可能提交”(不鎖定資源)。
  • PreCommit階段:若所有參與者同意,協調者發送預提交請求,參與者鎖定資源并準備提交。
  • DoCommit階段:協調者發送最終提交或回滾命令。
補償事務(Saga模式)
  • 編排式(Choreography) :各服務通過事件(如消息隊列)自主協調,無中心協調者。
  • 編排式缺點:邏輯分散,難維護;需處理事件丟失和重復消費。
  • 編排式工具:Kafka、RabbitMQ。
  • 編排式(Orchestration) :協調者服務集中管理事務流程,調用各服務接口(Cadence、AWS Step Functions)定義Saga步驟。
TCC(Try-Confirm-Cancel)
  • Try階段:預留資源(如凍結庫存、預扣款)。
  • Confirm階段:確認操作,提交資源(如實際扣款、減少庫存)。
  • Cancel階段:回滾Try階段的預留(如解凍庫存、釋放預扣款)。
  • 冪等性:每個階段需支持重試(如通過唯一事務ID)。
  • 空回滾:Try未執行時收到Cancel,需忽略操作。
  • 懸掛控制:Confirm/Cancel可能先于Try到達,需記錄狀態。
基于消息隊列的最終一致性
  • 本地事務 + 消息表:業務操作與消息寫入本地數據庫(原子性保證);后臺任務輪詢消息表,將消息投遞到MQ。
  • 消息消費:下游服務消費消息并執行業務,成功后確認消息;失敗時重試或進入死信隊列人工處理。
  • 事務消息:發送半消息到MQ → 執行本地事務 → 提交/回滾消息;MQ定期檢查未確認消息,回調生產者確認狀態。

分布式ID生成方案

UUID
  • 原理:基于時間、MAC地址或隨機數生成128位字符串(如550e8400-e29b-41d4-a716-446655440000
  • 無序性:作為數據庫主鍵會導致B+樹頻繁分裂,降低寫入性能。
  • 存儲浪費:128位過長(占用36字符),可讀性差。
  • 適用場景:日志追蹤、臨時標識等無需有序性的場景。
數據庫自增ID
  • 原理:通過數據庫自增字段(如MySQL AUTO_INCREMENT)生成唯一ID。
  • 分庫分表:通過步長區分不同分片(如實例1生成1,3,5…,實例2生成2,4,6…)。
  • 批量預取:每次從數據庫獲取一批ID(如1000個)緩存在本地,減少數據庫訪問。
  • 適用場景:中小規模系統,非高并發場景。
Snowflake算法
  • 原理:64位ID = 時間戳(41位) + 機器ID(10位) + 序列號(12位)
  • 生成流程:同一毫秒內,通過序列號遞增生成多個ID(最多4096個/ms);時間戳回撥時,通過等待或拋出異常處理。
  • 機器ID分配:需通過ZK/DB/配置中心保證機器ID唯一。
Redis生成ID
  • 原理:利用Redis的原子操作INCRINCRBY生成遞增ID。
  • 集群分片:不同業務使用不同Key(如order:iduser:id)。
  • 批量預取:每次獲取一段ID范圍(如1~1000),減少Redis交互。
  • 適用場景:需要遞增ID且已部署Redis集群的系統。
分布式ID方案對比
方案唯一性有序性性能依賴適用場景
UUID極高極高日志追蹤、臨時標識
數據庫自增嚴格遞增強(數據庫)中小規模系統
Snowflake時間有序極高弱(時鐘同步)高并發、需有序的大規模系統
Redis生成遞增強(Redis)已有Redis集群的系統
號段模式嚴格遞增弱(數據庫)需連續ID的中大規模系統

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79666.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Step文件無法編輯怎么辦?

Step文件無法編輯怎么辦? 這里介紹兩種方法, 1、 直接導入 準備step文件,solidworks導入后是這樣,不能在上面直接編輯 圖 1 點擊右鍵,選擇解除特征(不同版本的可能不太一樣,這里是solidworks2…

TIM_ITConfig() 和 TIM_Cmd()

在STM32的定時器中斷配置中,TIM_ITConfig() 和 TIM_Cmd() 是兩個關鍵函數,它們分別控制中斷使能和定時器計數器的啟停,作用層級不同。以下是詳細解釋: 1. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) 作用 啟用定時器的特定中斷…

TensorFlow 實現 Mixture Density Network (MDN) 的完整說明

本文檔詳細解釋了一段使用 TensorFlow 構建和訓練混合密度網絡(Mixture Density Network, MDN)的代碼,涵蓋數據生成、模型構建、自定義損失函數與預測可視化等各個環節。 1. 導入庫與設置超參數 import numpy as np import tensorflow as t…

數據結構實驗7.2:二叉樹的基本運算

文章目錄 一,實驗目的二,問題描述三,基本要求四,實驗操作五,示例代碼六,運行效果 一,實驗目的 深入理解樹與二叉樹的基本概念,包括節點、度、層次、深度等,清晰區分二叉…

直線軸承常規分類知多少?

直線軸承的分類方式多樣,以下是從材質、結構形狀和常規系列三個維度進行的具體分類: 按主要材質分類 外殼材質:常見的有不銹鋼,具有良好的耐腐蝕性,適用于一些對環境要求較高、易受腐蝕的工作場景;軸承…

websocket和SSE學習記錄

websocket學習記錄 websocket使用場景 即時聊天在線文檔協同編輯實施地圖位置 從開發角度來學習websocket開發 即使通信項目 通過node建立簡單的后端接口,利用fs, path, express app.get(*, (req, res) > {const assetsType req.url.split(/)[…

CUDA編程中影響性能的小細節總結

一、內存訪問優化 合并內存訪問:確保相鄰線程訪問連續內存地址(全局內存對齊訪問)。優先使用共享內存(Shared Memory)減少全局內存訪問。避免共享內存的Bank Conflict(例如,使用padding或調整訪…

【雙指針】對撞指針 快慢指針 移動零

文章目錄 雙指針介紹對撞指針快慢指針283. 移動零解題思路算法思路算法流程雙指針介紹 ? 算法中的雙指針,并不一定是指我們平常在 c/c++ 使用的指針類型,更多時候其實是數組的下標等,因為它們也是有標識某個元素的功能,通常我們也就順其自然地稱其為 “指針” ! ? 常見…

數據結構0基礎學習堆

文章目錄 簡介公式建立堆函數解釋 堆排序O(n logn)topk問題 簡介 堆是一種重要的數據結構,是一種完全二叉樹,(二叉樹的內容后面會出), 堆分為大小堆,大堆,左右結點都小于根節點,&am…

4.17--4.19刷題記錄(貪心)

第一部分:準備工作 代碼隨想錄中解釋為:貪心的本質是選擇每一階段的局部最優,從而達到全局最優。 而我的理解為:貪心實質上是具有最優子結構的一種算法。所有的解都能由當前最優的解組成。 第二部分:開始刷題 &…

學習筆記十七——Rust 支持面向對象編程嗎?

🧠 Rust 支持面向對象編程嗎? Rust 是一門多范式語言,主要以 安全、并發、函數式、系統級編程為核心目標,但它同時也支持面向對象的一些關鍵特性,比如: 特性傳統 OOP(如 Java/C)Ru…

【Linux】43.網絡基礎(2.5)

文章目錄 2.4 TCP/UDP對比2.4.1 用UDP實現可靠傳輸(經典面試題) 2.5 TCP 相關實驗2.5.1 理解 listen 的第二個參數 2.4 TCP/UDP對比 我們說了TCP是可靠連接, 那么是不是TCP一定就優于UDP呢? TCP和UDP之間的優點和缺點, 不能簡單, 絕對的進行比較TCP用于可靠傳輸的情況, 應用于…

three.js與webgl在buffer上的對應關系

一、three.js的類名 最近開始接觸three.js 看到three.js中的一些類名和webgl的很相似 不自覺的就想對比一下 二、three.js中繪制4個點 // 創建點的幾何體 const vertices new Float32Array([0.0, 0.0, 0.0, // 點11.0, 0.0, 0.0, // 點20.0, 1.0, 0.0, // 點30.…

DataWhale AI春訓營 問題匯總

1.沒用下載訓練集導致出錯,爆錯如下。 這個時候需要去比賽官網下載對應的初賽訓練集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初賽訓練集.zip 在命令行執行這個命令解壓 2.沒定義測試集 te…

CANFD技術在新能源汽車通信網絡中的應用與可靠性分析

一、引言 新能源汽車產業正處于快速發展階段,其電子系統復雜度不斷攀升,涵蓋眾多傳感器、控制器與執行器。高效通信網絡成為確保新能源汽車安全運行與智能功能實現的核心要素。傳統CAN總線因帶寬限制,難以滿足高級駕駛輔助系統(A…

Python字典深度解析:高效鍵值對數據管理指南

一、字典核心概念解析 1. 字典定義與特征 字典(Dictionary)是Python中??基于哈希表實現??的無序可變容器,通過鍵值對存儲數據,具有以下核心特性: ??鍵值對結構??:{key: value}形式存儲數據??快…

C++中unique_lock和lock_guard區別

目錄 1.自動鎖定與解鎖機制 2.靈活性 3.所有權轉移 4.可與條件變量配合使用 5.性能開銷 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都屬于標準庫 <mutex> 中的互斥鎖管理工具&#xff0c;用于簡化互斥鎖的使用并確保線程安全。但它們存在一些顯著區別…

Nvidia顯卡架構演進

1 簡介 顯示卡&#xff08;英語&#xff1a;Display Card&#xff09;簡稱顯卡&#xff0c;也稱圖形卡&#xff08;Graphics Card&#xff09;&#xff0c;是個人電腦上以圖形處理器&#xff08;GPU&#xff09;為核心的擴展卡&#xff0c;用途是提供中央處理器以外的微處理器幫…

下載electron 22.3.27 源碼錯誤集錦

下載步驟同 electron源碼下載及編譯_electron源碼編譯-CSDN博客 問題1 從github 下載 dugite超時&#xff0c;原因沒有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…

洛谷P1120 小木棍

#算法/進階搜索 思路: 首先,最初始想法,將我們需要枚舉的長木棍個數計算出來,在dfs中,我們先判斷,此時枚舉這根長木棍需要的長度是否為0,如果為0,我們就枚舉下一個根木棍,接著再判斷,此時仍需要枚舉的木棍個數是否為0,如果為0,代表我們這種方案可行,直接打印長木棍長度,接著我們…