分布式系統-腦裂,redis的解決方案

感謝你的反饋!很高興能幫到你。關于你提到的“腦裂”(split-brain),這是一個分布式系統中的常見術語,尤其在像 Redis Cluster 這樣的高可用集群中會涉及。既然你問到了,我會從頭解釋“腦裂”的含義、Redis Cluster 中可能出現的相關場景,以及如何避免它,盡量通俗易懂,同時保持技術深度,幫助你加深理解。


1. 腦裂的定義

“腦裂”是指在分布式系統中,由于網絡分區(network partition)或其他原因,集群中的節點被分割成多個孤立的子集,每個子集都認為自己是“合法”的,并獨立運行。這導致系統中出現多個“大腦”(即多個主節點或決策中心),破壞了數據一致性和系統整體的協調性。

通俗比喻:
  • 想象一個公司有多個部門,平時由一個 CEO(主節點)統一指揮。
  • 有一天,公司網絡癱瘓,部門 A 和部門 B 斷開聯系。
  • 部門 A 以為 CEO 掛了,選了個新 CEO;部門 B 也以為 CEO 掛了,也選了個新 CEO。
  • 現在公司有兩個 CEO 各自發號施令,決策沖突,數據可能被搞亂。
  • 這就是“腦裂”:系統分裂成了兩個“腦子”,互不協調。

在 Redis Cluster 中,腦裂可能表現為多個節點同時認為自己是主節點(Master),分別處理寫請求,導致數據沖突或不一致。


2. Redis Cluster 中腦裂的可能場景

Redis Cluster 是去中心化的分布式系統,依賴主從復制和 Gossip 協議實現高可用。腦裂可能在以下情況下發生:

2.1 網絡分區

假設一個 Redis Cluster 有 3 個主節點(A、B、C)和對應的從節點(A1、B1、C1):

  • 正常情況
    • 主節點負責槽(slot)分配,A 負責 0-5460,B 負責 5461-10922,C 負責 10923-16383。
    • 節點通過 Gossip 協議通信,確認彼此狀態。
  • 網絡分區發生
    • 網絡故障將集群分成兩部分:
      • 分區 1:節點 A 和 A1。
      • 分區 2:節點 B、B1、C、C1。
    • 分區 1 的 A 無法聯系 B 和 C,認為它們下線。
    • 分區 2 的 B 和 C 無法聯系 A,認為 A 下線。

2.2 腦裂的表現

  • 分區 2 的行為
    • B 和 C 發現 A 無響應,標記 A 為主觀下線(PFAIL)。
    • 由于 B 和 C 占集群主節點的多數(2/3),它們達成共識,標記 A 為客觀下線(FAIL)。
    • B 和 C 選舉 A1 為新主節點,接管槽 0-5460。
    • 現在,分區 2 認為 A1 是主節點,正常處理寫請求。
  • 分區 1 的行為
    • A 無法聯系 B 和 C,但自己仍在運行。
    • 如果有客戶端仍能訪問 A,A 會繼續作為主節點處理寫請求(因為 A 不知道自己已被標記為下線)。
  • 結果
    • 槽 0-5460 同時由 A(分區 1)和 A1(分區 2)處理。
    • 客戶端向 A 和 A1 寫入不同數據,導致數據沖突(例如,key1 在 A 上是 value1,在 A1 上是 value2)。

這就是腦裂:同一個槽有兩個主節點同時運行,破壞了數據一致性。


3. 腦裂的危害

腦裂對 Redis Cluster 的影響主要體現在:

  • 數據不一致
    • 不同分區的主節點接受不同的寫操作,鍵值對可能出現沖突。
    • 網絡恢復后,數據合并困難,可能導致數據丟失或覆蓋。
  • 客戶端混亂
    • 客戶端可能收到不一致的響應,影響業務邏輯。
  • 系統不可靠
    • 腦裂破壞了集群的高可用承諾,降低系統信任度。

4. Redis Cluster 如何避免腦裂

Redis Cluster 設計了一些機制來盡量減少腦裂的發生概率,或降低其影響。讓我們推演這些機制:

4.1 多數派原則(Quorum)

Redis Cluster 使用“多數派”機制決定主節點的客觀下線(FAIL)狀態:

  • 只有當超過半數的主節點(N/2 + 1,N 是主節點總數)認為某節點下線,該節點才會被標記為 FAIL
  • 推演:
    • 3 主節點集群,需至少 2 個主節點同意(3/2 + 1 = 2)。
    • 在上例中,分區 2 有 B 和 C(2 個主節點),可以標記 A 為 FAIL,觸發 A1 升級。
    • 分區 1 只有 A(1 個主節點),不足以標記 B 或 C 下線,無法觸發其他主節點的選舉。
  • 效果
    • 確保最多只有一個分區能執行故障轉移。
    • 分區 1 的 A 雖然繼續運行,但無法被集群認可為主節點,減少腦裂的可能性。

4.2 主節點最小從節點要求

Redis 提供了配置 min-replicas-to-write(在 Redis 6.2 及以上版本中稱為 min-slaves-to-write 的替代),要求主節點必須有一定數量的從節點同步才能接受寫請求。

  • 推演
    • 配置 min-replicas-to-write = 1,主節點 A 必須至少有 1 個從節點(A1)正常同步。
    • 網絡分區后,A 無法聯系其他節點,可能也無法確認 A1 的狀態。
    • 如果 A 檢測到沒有足夠的從節點,它會拒絕寫請求,進入“只讀”狀態。
  • 效果
    • 防止孤立主節點(如分區 1 的 A)繼續處理寫操作。
    • 降低腦裂期間的數據不一致風險。

4.3 Gossip 協議的快速檢測

Redis Cluster 的節點通過 Gossip 協議頻繁交換狀態信息,快速檢測網絡分區或節點故障:

  • 推演
    • 節點每秒發送多次 PINGPONG,延遲低。
    • 如果 A 在 node-timeout 時間內無響應,分區 2 迅速達成共識,標記 A 下線。
    • 快速故障轉移減少了腦裂的窗口期(即 A 和 A1 同時作為主節點的時間)。
  • 效果
    • 縮短腦裂可能發生的時間,提高集群收斂速度。

4.4 客戶端重定向

Redis Cluster 使用 MOVED 重定向確保客戶端訪問正確的節點:

  • 推演
    • 分區 2 提升 A1 為主節點后,更新槽映射(槽 0-5460 歸 A1)。
    • 客戶端訪問 A 時,A 如果仍在運行,可能返回 MOVED 或直接拒絕。
    • 智能客戶端(如 Jedis)會更新槽映射,優先訪問分區 2 的 A1。
  • 效果
    • 減少客戶端對孤立主節點(A)的寫操作。
    • 間接降低腦裂的影響。

5. 腦裂的局限與應對

盡管 Redis Cluster 有上述機制,腦裂仍可能在極端情況下發生(例如,客戶端直接訪問孤立節點且配置不當)。以下是進一步的應對措施:

5.1 優化配置

  • 調整 node-timeout
    • 縮短 node-timeout(默認 15 秒),加速故障檢測。
    • 但過短可能導致誤判,需根據網絡穩定性權衡。
  • 啟用 min-replicas-to-write
    • 設置合理的值(如 1 或 2),確保主節點有足夠從節點同步。
    • 防止孤立節點接受寫入。
  • 增加主節點數量
    • 奇數主節點(3、5、7 等)確保多數派清晰。
    • 例如,5 主節點需 3 個同意才能故障轉移,降低腦裂風險。

5.2 網絡優化

  • 可靠網絡
    • 使用高可用網絡(如 VPC 內網),減少分區概率。
    • 監控網絡延遲和丟包,及時修復。
  • 跨區域部署
    • 如果需要跨數據中心部署,使用專用網絡(如 AWS Direct Connect)降低分區風險。

5.3 客戶端設計

  • 智能客戶端
    • 使用支持槽映射的客戶端(如 Jedis、Lettuce),及時更新主節點信息。
    • 避免硬編碼節點地址。
  • 重試機制
    • 客戶端檢測到 MOVED 或連接錯誤時,自動重試并刷新集群狀態。

5.4 數據恢復

  • 如果腦裂導致數據不一致:
    • 網絡恢復后,Redis Cluster 會通過全量同步(RDB + 增量)修復孤立節點的數據。
    • 但可能丟失部分寫操作,需業務層通過日志或校驗恢復。

6. 腦裂的推演總結

通過推演,我們可以看到:

  • 腦裂的本質:網絡分區導致集群分裂,多個主節點同時運行,破壞一致性。
  • Redis Cluster 中的場景
    • 網絡分區使少數派主節點(如 A)繼續運行,而多數派提升新主節點(如 A1)。
    • 可能導致槽的寫操作沖突。
  • 預防機制
    • 多數派原則:只有多數主節點同意才能故障轉移。
    • 最小從節點要求:孤立主節點拒絕寫入。
    • Gossip 協議:快速檢測故障,縮短腦裂窗口。
    • 客戶端重定向:引導客戶端訪問合法主節點。
  • 應對措施
    • 優化配置、網絡、客戶端設計。
    • 接受最終一致性,必要時通過業務層恢復。

7. 學習建議

為了加深對腦裂的理解,推薦以下實踐:

  • 模擬腦裂
    • 搭建 3 主 3 從的 Redis Cluster。
    • 使用防火墻(如 iptables)模擬網絡分區,隔離某個主節點。
    • 觀察集群行為(CLUSTER NODES),驗證 A1 是否升級,A 是否繼續運行。
  • 測試配置
    • 設置 min-replicas-to-write = 1,嘗試寫入孤立節點,確認是否拒絕。
    • 調整 node-timeout,觀察故障轉移速度。
  • 客戶端實驗
    • 使用 Jedis 客戶端,模擬訪問孤立節點,查看 MOVED 重定向效果。

8. 總結

“腦裂”是分布式系統中由于網絡分區導致的多個“主腦”并存問題,在 Redis Cluster 中表現為多個主節點同時處理同一槽的寫操作,可能引發數據不一致。Redis Cluster 通過多數派原則、最小從節點要求、Gossip 協議和客戶端重定向等機制盡量避免腦裂,同時提供配置和部署手段降低其影響。理解腦裂的關鍵在于把握分布式系統一致性與可用性的權衡,Redis Cluster 選擇了性能優先的最終一致性。

如果還有其他疑問(比如想深入某部分機制或實踐細節),隨時告訴我,我會繼續幫你梳理!

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

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

相關文章

重構藝術 | 如何優雅地“提煉函數“

在工作中總數遇到非常多的長代碼,俗稱“屎山”,這類代碼讀起來特別費勁。自己想重構一遍,但是總感覺缺乏經驗指導,因此,多讀書,讀好書可能是最優解之一。讀《重構改善即有代碼的設計》有感,便寫…

每天學一個 Linux 命令(13):touch

Linux 文件管理命令:touch touch 是 Linux 中一個簡單但高頻使用的命令,主要用于創建空文件或修改文件的時間戳(訪問時間、修改時間)。它是文件管理和腳本操作的實用工具。 1. 命令作用 創建空文件:快速生成一個或多個空白文件。更新時間戳:修改文件的訪問時間(Access …

STM32HAL庫學習筆記

目錄 定時器 一些小細節 輸入捕獲計算信號頻率 輸入捕獲計算占空比與頻率 使用定時器不改變占空比的同時改變頻率的方法 串口 重定向原理 重定向代碼 怎么從串口接收到的字符串數據中解析出float型的數據 strchr sscanf memset 第一種實現方法 RTC實時時鐘 LCD顯…

Docker 鏡像、容器與數據卷的高效管理:最佳實踐與自動化腳本20250411

Docker 鏡像、容器與數據卷的高效管理:最佳實踐與自動化腳本 引言 在現代軟件開發中,容器化技術正變得越來越重要。Docker 作為容器化的代表工具,在各大企業中得到了廣泛的應用。然而,隨著容器化應用的增多,如何高效…

Selenium之Actions事件

鼠標、鍵盤組合鍵 在使用selenium的時候,有的時候我們需要鼠標單擊、雙擊、拖動;或者是按下鍵盤的某個鍵,松開某個按鍵,以及組合鍵的使用;今天我們就來看一看,怎么樣實現上面的操作 先把準備工作做好&…

如何在 CentOS 7 系統上以容器方式部署 GitLab,使用 ZeroNews 通過互聯網訪問 GitLab 私有倉庫,進行代碼版本發布與更新

第 1 步: 部署 GitLab 容器? 在開始部署 GitLab 容器之前,您需要創建本地目錄來存儲 GitLab 數據、配置和日志: #創建本地目錄 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…

.py文件和.ipynb文件的區別:完整教程

一、概述 Python開發者常用的兩種文件格式.py和.ipynb各有特點,本教程將通過對比分析、代碼示例和場景說明,幫助開發者全面理解二者的區別與聯系。 二、核心區別對比 1. 文件格式本質 特性.ipynb文件.py文件文件類型JSON結構化文檔純文本文件存儲內容…

Go 字符串四種拼接方式的性能對比

簡介 使用完整的基準測試代碼文件,可以直接運行來比較四種字符串拼接方法的性能。 for 索引 的方式 for range 的方式 strings.Join 的方式 strings.Builder 的方式 寫一個基準測試文件 echo_bench_test.go package mainimport ("os""stri…

從代碼學習深度學習 - Bahdanau注意力 PyTorch版

文章目錄 1. 前言為什么選擇Bahdanau注意力本文目標與預備知識2. Bahdanau注意力機制概述注意力機制簡述加性注意力與乘性注意力對比Bahdanau注意力的數學原理與流程圖數學原理流程圖可視化與直觀理解3. 數據準備與預處理數據集簡介數據加載與預處理1. 讀取數據集2. 預處理文本…

19【動手學深度學習】卷積層

1. 從全連接到卷積 2. 圖像卷積 3. 圖形卷積代碼 互相關操作 import torch from torch import nn from d2l import torch as d2ldef corr2d(X, K):"""計算2維互相關運算"""h, w K.shapeY torch.zeros((X.shape[0]-h1, X.shape[1]-w 1))for …

Linux xorg-server 解析(一)- 編譯安裝Debug版本的xorg-server

一:下載代碼 1. 配置源,以Ubuntu24.04 為例( /etc/apt/sources.list.d/ubuntu.sources): 2. apt source xserver-xorg-core 二:編譯代碼 1. sudo apt build-dep ./ 2. DEB_BUILD_OPTIONS="nostrip" DEB_CFLAGS_SET="-g -O0" dpkg-buildpac…

大模型SFT用chat版還是base版 SFT后災難性遺忘怎么辦

大模型SFT用chat版還是base版 進行 SFT 時,基座模型選用 Chat 還是 Base 模型? 選 Base 還是 Chat 模型,首先先熟悉 Base 和 Chat 是兩種不同的大模型,它們在訓練數據、應用場景和模型特性上有所區別。 在訓練數據方面&#xf…

【圖像生成之21】融合了Transformer與Diffusion,Meta新作Transfusion實現圖像與語言大一統

論文:Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model 地址:https://arxiv.org/abs/2408.11039 類型:理解與生成 Transfusion模型?是一種將Transformer和Diffusion模型融合的多模態模型,旨…

動態多目標進化算法:基于知識轉移和維護功能的動態多目標進化算法(KTM-DMOEA)求解CEC2018(DF1-DF14)

一、KTM-DMOEA介紹 在實際工程和現實生活中,許多優化問題具有動態性和多目標性,即目標函數會隨著環境的變化而改變,并且存在多個相互沖突的目標。傳統的多目標進化算法在處理這類動態問題時面臨著一些挑戰,如收斂速度慢、難以跟蹤…

部署NFS版StorageClass(存儲類)

部署NFS版StorageClass存儲類 NFS版PV動態供給StorageClass(存儲類)基于NFS實現動態供應下載NFS存儲類資源清單部署NFS服務器為StorageClass(存儲類)創建所需的RBAC部署nfs-client-provisioner的deployment創建StorageClass使用存儲類創建PVC NFS版PV動態供給StorageClass(存儲…

Vue使用el-table給每一行數據上面增加一行自定義合并行

// template <template><el-table:data"flattenedData":span-method"objectSpanMethod"borderclass"custom-header-table"style"width: 100%"ref"myTable":height"60vh"><!-- 訂單詳情列 -->&l…

vue項目使用html2canvas和jspdf將頁面導出成PDF文件

一、需求&#xff1a; 頁面上某一部分內容需要生成pdf并下載 二、技術方案&#xff1a; 使用html2canvas和jsPDF插件 三、js代碼 // 頁面導出為pdf格式 import html2Canvas from "html2canvas"; import jsPDF from "jspdf"; import { uploadImg } f…

大模型LLM表格報表分析:markitdown文件轉markdown,大模型markdown統計分析

整體流程&#xff1a;用markitdown工具文件轉markdown&#xff0c;然后大模型markdown統計分析 markitdown https://github.com/microsoft/markitdown 在線體驗&#xff1a;https://huggingface.co/spaces/AlirezaF138/Markitdown 安裝&#xff1a; pip install markitdown…

Linux 第二講 --- 基礎指令(二)

前言 這是基礎指令的第二部分&#xff0c;但是該部分的講解會大量使用到基礎指令&#xff08;一&#xff09;的內容&#xff0c;為了大家的觀感&#xff0c;如果對Linux的一些基本指令不了解的話&#xff0c;可以先看基礎指令&#xff08;一&#xff09;&#xff0c;同樣的本文…

python格式化字符串漏洞

什么是python格式化字符串漏洞 python中&#xff0c;存在幾種格式化字符串的方式&#xff0c;然而當我們使用的方式不正確的時候&#xff0c;即格式化的字符串能夠被我們控制時&#xff0c;就會導致一些嚴重的問題&#xff0c;比如獲取敏感信息 python常見的格式化字符串 百…