Mysql分片:一致性哈希算法

一、一致性哈希的核心原理

????????哈希取模最大的痛點是:當分片數量(例如數據庫節點數)發生變化時,幾乎所有數據的哈希結果都會改變,導致大規模的數據遷移。一致性哈希就是為了解決這個“伸縮性差”的問題而誕生的。

核心思想:數據和節點共舞的“虛擬圓環”

????????一致性哈希不再簡單粗暴地用數據哈希值對節點數量取模。它的核心在于引入了一個 “哈希環”(Hash Ring 或 Hash Circle)的概念。你可以把這個哈希環想象成一個巨大的虛擬圓盤,它的周長覆蓋了所有可能的哈希值范圍(比如從0到 ^{2^{32}}-1,或者 ^{2^{64}}?1,取決于哈希算法的輸出范圍)。

在這個哈希環上,有兩類重要的參與者:

  1. 存儲節點(服務器/數據庫):

    • 我們不再直接用服務器數量做模數。而是將每一個真實的存儲節點(比如你的 db_0db_1db_2 這些數據庫服務器),通過一個哈希函數計算出一個哈希值。

    • 這些哈希值就相當于服務器在圓環上的“座標點”。每個節點都會根據自己的哈希值,被放置到哈希環上的一個特定位置。

  2. 數據記錄:

    • 同樣地,每一條待存儲的數據記錄(比如一個用戶的信息、一個訂單的詳情),我們會選擇它的某個字段作為分片鍵(比如 user_idorder_id)。

    • 然后,我們用同樣的哈希函數計算這個分片鍵的哈希值,把數據也映射到哈希環上的一個位置。這個哈希值就像是數據的“身份證號碼”,它也對應著圓環上的一個“座標點”。

????????哈希環示意圖:?

? ? ? ? ? ? ? ? ? ? ? ?

智能羅盤:數據如何找到它的“歸宿”?

????????當一條數據(或一個查詢請求)要尋找它的存儲位置時,一致性哈希的“智能羅盤”就會啟動:

  • 數據路由法則:從數據在哈希環上的存儲數據位置開始,沿著圓環順時針方向查找,遇到的第一個存儲節點,就是這條數據存儲的節點位置!

比如,在該哈希環上:?

  • data1 存儲在 nodeA

    • data1 位于 0nodeA 之間。從 data1 順時針查找,遇到的第一個存儲節點是 nodeA

  • data2?存儲在 nodeB

    • data2?位于 nodeA?和 nodeB?之間。從 data2?順時針查找,遇到的第一個存儲節點是 nodeB

  • data3 存儲在 nodeC

    • data3 位于 nodeB?和 nodeC?之間。從 data3 順時針查找,遇到的第一個存儲節點是 nodeC

  • data4 存儲在 nodeA

    • data4 位于 nodeC0 之間(或者說 nodeC2^32-1 ?之間,因為環是閉合的)。從 data4 順時針查找,遇到的第一個存儲節點是 nodeA


二、一致性哈希執行案例

我們來設計一個簡單且易于理解的一致性哈希執行案例。我們將聚焦在一個非常常見的場景:一個簡單的分布式緩存系統

場景設定:

????????假設你正在開發一個熱門的社交應用,其中有很多用戶頭像圖片需要緩存。為了提高訪問速度和系統承載能力,你決定使用多個緩存服務器來存儲這些圖片。當用戶請求某個頭像時,你需要知道這張圖片存在哪個緩存服務器上。

  • 緩存內容:用戶頭像圖片。

  • 唯一標識user_id (用戶ID),我們將用它作為分片鍵。

  • 緩存服務器:初始有 3 臺服務器,命名為 CacheA, CacheB, CacheC

我們將使用一致性哈希來決定每張圖片存儲在哪臺緩存服務器上。

步驟一:服務器“入座”哈希環

在系統啟動時,我們的緩存服務器需要先在哈希環上找到自己的“座位”。

  • 我們會用哈希函數計算每臺服務器名稱的哈希值:

    • Hash("CacheA") rightarrow 假設得到 100

    • Hash("CacheB") rightarrow 假設得到 1500

    • Hash("CacheC") rightarrow 假設得到 3000

我們在這假設該哈希函數計算的哈希值在0-3599之間

(注:為了簡化,實際哈希值范圍很大,這里用小數字示意相對位置)?

我們將這些哈希值標注在哈希環上:

? ? ? ? ? ? ? ? ? ? ? ? ? ?

步驟二:用戶頭像圖片“找主人”

????????現在,當用戶請求或上傳一張頭像(user_id)時,系統需要知道它應該存在哪臺緩存服務器上。

我們以兩個用戶為例:

  1. 用戶ID: 1001 的頭像

    • 我們用同樣的哈希函數計算 user_id = 1001 的哈希值:

      Hash("1001") rightarrow 假設得到 500

    • 500 標注在哈希環上。

    • 查找規則:從 500 這個點開始,沿著哈希環順時針方向查找,遇到的第一個緩存服務器是誰,它就歸誰管。

    • 根據圖示,從 500 順時針,第一個遇到的服務器是 CacheB (1500)。

    • 結論用戶1001的頭像 存儲到 CacheB

  2. 用戶ID: 2002 的頭像

    • Hash("2002") rightarrow 假設得到 3200

    • 3200 標注在哈希環上(這里同上,我就不在畫了)。

    • 查找規則:從 3200 順時針查找,由于環是閉合的,它會繞過 3599?重新從 0 開始,遇到的第一個服務器是 CacheA (100)。

    • 結論用戶2002的頭像 存儲到 CacheA

步驟三:服務器擴容,一致性哈希顯神通

? ? ? ?假設現在,你的社交應用用戶量暴增,CacheA, CacheB, CacheC 三臺服務器已經不夠用了!你需要新增一臺緩存服務器:CacheD

  • 哈希取模的痛點:如果是傳統哈希取模 (Hash(user_id) % N),N從3變成4,那幾乎所有用戶頭像的位置都會重新計算,你需要把大量頭像數據從舊服務器搬到新位置,系統可能要停機維護,非常麻煩!

  • 一致性哈希的優勢

    1. CacheD “入座”哈希環

      • 我們計算 Hash("CacheD") rightarrow 假設得到 2000

      • CacheD (2000) 放置在哈希環上。它會落在 CacheB (1500) 和 CacheC (3000) 之間。

    2. 數據遷移分析

      • 觀察哈希環,CacheD 的加入,只會影響到它逆時針方向的那個服務器(CacheB)所負責的部分數據

      • 原來從 CacheB (1500) 順時針到 CacheC (3000) 的這部分區間,現在被 CacheD (2000) 分割了。

      • 只有那些哈希值在 15002000 之間的用戶頭像,需要從 CacheB 遷移到 CacheD

      • CacheA 負責的頭像數據、以及 CacheB 負責的哈希值小于 1500 的頭像數據,位置完全不變!

    ? ? ? ? ? ? ? ? ??

????????這一特性是衡量分布式系統可伸縮性的關鍵優勢。相比于傳統哈希取模在節點變化時需要進行全局數據重分布,一致性哈希實現了漸進式、低影響的擴容/縮容操作,極大地降低了系統維護成本和業務中斷風險。


三、總結:

?????????一致性哈希算法通過將數據鍵與存儲節點共同映射至一個環形哈希空間,并基于“順時針最近匹配”原則進行數據路由,從而巧妙地解決了分布式系統在擴容或縮容場景下,傳統哈希取模算法導致的大規模數據遷移問題。這一機制顯著提升了系統的彈性伸縮能力和可用性。在構建高性能、高可擴展性的分布式緩存或分布式存儲系統時,一致性哈希提供了一種高效且穩定的數據分布與管理策略。

?

?

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

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

相關文章

前端學習 vben 之 axios interceptors

前端學習 vben 之 axios interceptors interceptor 攔截器,是一種軟件設計模式,核心思想就是在程序執行的特定階段(如請求發送前,響應返回后,方法調用前后等)自動插入自定義邏輯。實現對核心流程的“攔截”…

【java面試day4】redis緩存-數據持久化

文章目錄問題💬 Question 1相關知識問題 💬 Question 1 Q:redis作為緩存,數據的持久化是怎么做的? A:有兩種機制,一種是RDB,RDB會在指定的時間間隔內將內存中的數據生成快照,保存…

Vue3中element plus默認獲取最近一周和上個月的時間區間并在后端分開傳值

<el-form-item label"結算時間&#xff1a;" prop"datetimerangevalue"><el-date-pickerv-model"datetimerangevalue"value-format"YYYY-MM-DD HH:mm:ss"type"datetimerange"range-separator"至"start-p…

SQLAlchemy數據庫連接密碼特殊字符處理完全指南

引言 在使用SQLAlchemy連接數據庫時&#xff0c;我們通常使用URL格式指定連接信息&#xff0c;如mysqlpymysql://user:passwordhost:port/database。然而&#xff0c;當密碼中包含特殊字符&#xff08;如、#、$、!等&#xff09;時&#xff0c;會導致URL解析錯誤&#xff0c;進…

1.4 ARM安全參考架構(PSA Certified)

目錄1.4.1 PSA Certified概述1.4.2 PSA認證級別詳解1.4.3 PSA與TF-A的關系1.4.4 PSA安全模型實現信任根(RoT)架構關鍵安全服務&#xff1a;1.4.5 認證流程實踐1.4.6 典型應用案例參考資料1.4.1 PSA Certified概述 ARM Platform Security Architecture (PSA) Certified 是一套完…

企業網絡安全的“金字塔”策略:構建全方位防護體系的核心思路

在數字化轉型的浪潮中&#xff0c;企業的網絡安全已從單一的防護措施&#xff0c;發展成為多層次、全方位的安全體系。如何精準應對日益復雜的網絡威脅&#xff0c;成為眾多企業關注的焦點。本文將分享企業構建高效安全防護“金字塔”的核心思路。一、從“排查隱患”到“主動防…

爬蟲-request模塊使用

1.使用和安裝2.代碼測試打印返回的內容&#xff0c;默認是請求體中的標識.text 是打印源代碼設置一下編碼

HTML + CSS + JavaScript

目錄 1 HTML HTML 文件基本結構 HTML 開發工具 HTML 常見標簽 標題標簽&#xff1a;h1 - h6 段落標簽&#xff1a;p 換行標簽&#xff1a;br 圖片標簽&#xff1a;img 超鏈接標簽&#xff1a;a 表格標簽 表單標簽 form 標簽 input 標簽 select 標簽 textarea 標…

Java 與 MySQL 性能優化:MySQL連接池參數優化與性能提升

文章目錄引言一、連接池的基本概念與作用二、關鍵連接參數詳解2.1 max_connections2.2 wait_timeout2.3 interactive_timeout2.4 connect_timeout2.5 thread_cache_size三、連接池參數不合理導致的性能問題3.1 連接耗盡3.2 響應變慢3.3 連接失效3.4 資源浪費四、連接池參數優化…

浪潮CD1000-移動云電腦-RK3528芯片-2+32G-開啟ADB ROOT破解教程

浪潮CD1000-移動云電腦-RK3528芯片-232G-安卓9-開啟ADB ROOT破解教程破解教程&#xff1a;1.先下載好開心電視助手&#xff08;下載地址及其他版本&#xff1a;【工具大全】-【開心電視助手3.8&#xff0f;4.0&#xff0f;4.6&#xff0f;6.0&#xff0f;6.2&#xff0f;6.3&am…

【網絡編程】簡易的 p2p 模型,實現兩臺虛擬機之間的簡單點對點通信,并以小見大觀察 TCP 協議的具體運行

文章目錄基本概念業務拆解代碼實現準備工作實現被動的功能——多線程指針函數實現主動的功能——用戶選擇界面主函數代碼執行效果意外收獲總結推薦一個零聲教育學習教程&#xff0c;個人覺得老師講得不錯&#xff0c;分享給大家&#xff1a;[Linux&#xff0c;Nginx&#xff0c…

react狀態管理庫 - zustand

什么是zustand&#xff1f; zustand 是一個輕量級、快速且可擴展的 React 狀態管理庫&#xff0c;旨在提供一種簡單直接的方式來管理應用狀態&#xff0c;而無需其他解決方案通常伴隨的繁瑣代碼。根據官方 Zustand 文檔&#xff0c;Zustand 是“一個使用簡化 flux 原理的小型、…

粗排樣本架構升級:融合LTR特征提升模型性能的技術實踐

粗排樣本架構升級&#xff1a;融合LTR特征提升模型性能的技術實踐 ——基于PySpark的樣本構建與特征工程深度解析 一、粗排系統的定位與技術演進 在推薦系統級聯架構中&#xff0c;?粗排&#xff08;Rough Ranking&#xff09;?? 承擔著關鍵過渡角色&#xff1a;從召回層獲…

CCF-GESP 等級考試 2025年6月認證C++四級真題解析

1 單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;第1題 在C中&#xff0c;聲明一個指向整型變量的指針的正確語法是&#xff08; &#xff09;。A. int* ptr; B. *int ptr; C. int ptr*; D. ptr …

PlantUML 在 IDEA 中文版中的安裝與使用指南

目錄 摘要 一、安裝 PlantUML 插件 二、配置 PlantUML 運行環境 三、創建 PlantUML 文件 四、編寫 PlantUML 代碼 五、生成并查看圖表 六、自動生成類圖&#xff08;重點新增&#xff09; 6.1 從 Java 類生成類圖 6.2 類圖語法詳解 6.3 類圖高級技巧 七、常見問題及…

創客匠人:創始人 IP 打造中 “放下身段” 的深層邏輯

在 IP 經濟火熱的當下&#xff0c;無數創始人投身 IP 打造&#xff0c;卻鮮少有人意識到&#xff1a;真正能實現 IP 變現的核心&#xff0c;并非專業知識的堆砌&#xff0c;而是與用戶建立 “可交往” 的連接。創客匠人通過多年服務 IP 的實踐發現&#xff0c;那些穿越周期的創…

C語言<數據結構-鏈表>

鏈表是一種常見且重要的數據結構&#xff0c;在 C 語言中&#xff0c;它通過指針將一系列的節點連接起來&#xff0c;每個節點可以存儲不同類型的數據。相比數組&#xff0c;鏈表在插入和刪除元素時不需要移動大量數據&#xff0c;具有更好的靈活性&#xff0c;尤其適合處理動態…

基于Matlab多特征融合的可視化指紋識別系統

針對中小規模&#xff08;百級&#xff09;指紋模板庫中常見的脊線斷裂、噪聲干擾以及結果缺乏可解釋性等難點&#xff0c;本文提出并實現了一種基于多特征融合的可視化指紋識別系統。系統整體采用模塊化設計&#xff1a;在預處理階段&#xff0c;先通過改進的灰度歸一化與局部…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DoubleVerticalSlider(雙垂直滑塊)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DoubleVerticalSlider組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<scrip…

mysql join語句、全表掃描 執行優化與訪問冷數據對內存命中率的影響

文章目錄join執行邏輯Index Nested_Loop Join&#xff08;NLJ&#xff09;MMR(Mutli-Range Read) 優化BKA(Batched Key Access)算法Simple Nested_Loop JoinBlock Nested-Loop Join&#xff08;BLJ&#xff09;join buffer 一次放不下 驅動表join buffer優化的影響&#xff1a;…