負載均衡 - 一致性hash算法

構建場景

假如我們有三臺緩存服務器編號node0、node1、node2,現在有3000萬個key,希望可以將這些個key均勻的緩存到三臺機器上,你會想到什么方案呢?

我們可能首先想到的方案,是取模算法hash(key)% N,對key進行hash運算后取模,N是機器的數量。key進行hash后的結果對3取模,得到的結果一定是0、1或者2,正好對應服務器node0、node1、node2,存取數據直接找對應的服務器即可,簡單粗暴,完全可以解決上述的問題。
在這里插入圖片描述

hash的問題

取模算法雖然使用簡單,但對機器數量取模,在集群擴容和收縮時卻有一定的局限性,因為在生產環境中根據業務量的大小,調整服務器數量是常有的事;而服務器數量N發生變化后hash(key)% N計算的結果也會隨之變化。
在這里插入圖片描述

比如:一個服務器節點掛了,計算公式從hash(key)% 3變成了hash(key)% 2,結果會發生變化,此時想要訪問一個key,這個key的緩存位置大概率會發生改變,那么之前緩存key的數據也會失去作用與意義。

大量緩存在同一時間失效,造成緩存的雪崩,進而導致整個緩存系統的不可用,這基本上是不能接受的,為了解決優化上述情況,一致性hash算法應運而生。

一致性hash

一致性hash算法本質上也是一種取模算法,不過,不同于上邊按服務器數量取模,一致性hash是對固定值2^32取模。

IPv4的地址是4組8位2進制數組成,所以用2^32可以保證每個IP地址會有唯一的映射

hash環

我們可以將這2^32個值抽象成一個圓環,圓環的正上方的點代表0,順時針排列,以此類推,1、2、3、4、5、6……直到2^32-1,而這個由2的32次方個點組成的圓環統稱為hash環。

在這里插入圖片描述

那么這個hash環和一致性hash算法又有什么關系?我們還是以上邊的場景為例,三臺緩存服務器編號node0、node1、node2,3000萬個key。

服務器映射到hash環

這個時候計算公式就從hash(key)% N 變成了hash(服務器ip)% 2^32,使用服務器IP地址進行hash計算,用哈希后的結果對2^32取模,結果一定是一個0到2^32-1之間的整數,而這個整數映射在hash環上的位置代表了一個服務器,依次將node0、node1、node2三個緩存服務器映射到hash環上。

在這里插入圖片描述

對象key映射到hash環

接著在將需要緩存的key對象也映射到hash環上,hash(key)% 2^32,服務器節點和要緩存的key對象都映射到了hash環,那對象key具體應該緩存到哪個服務器上呢?
在這里插入圖片描述

對象key映射到服務器

從緩存對象key的位置開始,沿順時針方向遇到的第一個服務器,便是當前對象將要緩存到的服務器。

因為被緩存對象與服務器hash后的值是固定的,所以,在服務器不變的條件下,對象key必定會被緩存到固定的服務器上。根據上邊的規則,下圖中的映射關系:

key-1 -> node-1
key-3 -> node-2
key-4 -> node-2
key-5 -> node-2
key-2 -> node-0

在這里插入圖片描述

如果想要訪問某個key,只要使用相同的計算方式,即可得知這個key被緩存在哪個服務器上了。

一致性hash的優勢

我們簡單了解了一致性hash的原理,那它又是如何優化集群中添加節點和縮減節點,普通取模算法導致的緩存服務,大面積不可用的問題呢?

先來看看擴容的場景,假如業務量激增,系統需要進行擴容增加一臺服務器node-4,剛好node-4被映射到node-1和node-2之間,沿順時針方向對象映射節點,發現原本緩存在node-2上的對象key-4、key-5被重新映射到了node-4上,而整個擴容過程中受影響的只有node-4和node-1節點之間的一小部分數據。
在這里插入圖片描述

反之,假如node-1節點宕機,沿順時針方向對象映射節點,緩存在node-1上的對象key-1被重新映射到了node-4上,此時受影響的數據只有node-0和node-1之間的一小部分數據。
在這里插入圖片描述

從上邊的兩種情況發現,當集群中服務器的數量發生改變時,一致性hash算只會影響少部分的數據,保證了緩存系統整體還可以對外提供服務的。

數據偏斜問題

前邊為了便于理解原理,畫圖中的node節點都很理想化的相對均勻分布,但理想和實際的場景往往差別很大。

在服務器節點數量太少的情況下,很容易因為節點分布不均勻而造成數據傾斜問題,如下圖被緩存的對象大部分緩存在node-4服務器上,導致其他節點資源浪費,系統壓力大部分集中在node-4節點上,這樣的集群是非常不健康的。
在這里插入圖片描述

解決數據傾斜的辦法也簡單,我們就要想辦法讓節點映射到hash環上時,相對分布均勻一點。

一致性Hash算法引入了一個虛擬節點機制,即對每個服務器節點計算出多個hash值,它們都會映射到hash環上,映射到這些虛擬節點的對象key,最終會緩存在真實的節點上。

虛擬節點的hash計算通常可以采用,對應節點的IP地址加數字編號后綴 hash(10.24.23.227#1) 的方式,舉個例子,node-1節點IP為10.24.23.227,正常計算node-1的hash值。

  • hash(10.24.23.227#1)% 2^32

假設我們給node-1設置三個虛擬節點,node-1#1、node-1#2、node-1#3,對它們進行hash后取模。

  • hash(10.24.23.227#1)% 2^32
  • hash(10.24.23.227#2)% 2^32
  • hash(10.24.23.227#3)% 2^32

下圖加入虛擬節點后,原有節點在hash環上分布的就相對均勻了,其余節點壓力得到了分攤。
在這里插入圖片描述

但需要注意一點,分配的虛擬節點個數越多,映射在hash環上才會越趨于均勻,節點太少的話很難看出效果

引入虛擬節點的同時也增加了新的問題,要做虛擬節點和真實節點間的映射,對象key->虛擬節點->實際節點之間的轉換。
在這里插入圖片描述

一致性hash的應用場景

一致性hash在分布式系統中應該是實現負載均衡的首選算法,它的實現比較靈活,既可以在客戶端實現,也可以在中間件上實現,比如日常使用較多的緩存中間件memcached和redis集群都有用到它。

memcached的集群比較特殊,嚴格來說它只能算是偽集群,因為它的服務器之間不能通信,請求的分發路由完全靠客戶端來的計算出緩存對象應該落在哪個服務器上,而它的路由算法用的就是一致性hash。
在這里插入圖片描述

還有redis集群中hash槽的概念,雖然實現不盡相同,但思想萬變不離其宗。

其它的應用場景還有很多:

  • RPC框架Dubbo用來選擇服務提供者
  • 分布式關系數據庫分庫分表:數據與節點的映射關系
  • LVS負載均衡調度器

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

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

相關文章

pdfplumber 解析 PDF 表格的原理

📌 pdfplumber 解析 PDF 表格的原理 pdfplumber 處理表格的原理是基于幾何分析(geometric analysis),它通過分析 PDF 頁面中的線條、單元格間距和文本分布,提取表格數據。它主要利用 垂直線(vertical line…

洛谷P1334

題目如下 思路: 每次選擇最短的兩塊木板進行合并,直到只剩下一塊木板。使用最小堆(優先隊列)來實現這一過程。使用最小堆: 將所有木板的長度放入最小堆(優先隊列) 每次從堆中取出兩塊最短的木…

JVM(Java Virtual Machine,Java 虛擬機)的作用

JVM(Java Virtual Machine,Java 虛擬機)的作用至關重要,它是 Java 語言“一次編寫,到處運行”(Write Once, Run Anywhere,WORA)特性的基石,也是 Java 平臺的核心組成部分…

總結(尚硅谷Vue3入門到實戰,最新版vue3+TypeScript前端開發教程)

1.Vue簡介 2020年9月18日,Vue.js發布版3.0版本,代號:One Piece 1.1.性能的提升 打包大小減少41%。 初次渲染快55%, 更新渲染快133%。 內存減少54%。 1.2.源碼的升級 使用Proxy代替defineProperty實現響應式。 重寫虛擬DOM的實現和Tree-Shak…

SolidWorks 轉 PDF3D 技術詳解

在現代工程設計與制造流程中,不同軟件間的數據交互與格式轉換至關重要。將 SolidWorks 模型轉換為 PDF3D 格式,能有效解決模型展示、數據共享以及跨平臺協作等問題。本文將深入探討 SolidWorks 轉 PDF3D 的技術原理、操作流程及相關注意事項,…

【深度學習CV】【圖像分類】從CNN(卷積神經網絡)、ResNet遷移學習到GPU高效訓練優化【案例代碼】詳解

摘要 本文分類使用的是resNet34,什么不用yolo v8,yolo v10系列,雖然他們也可以分類,因為yolo系列模型不純粹,里面包含了目標檢測的架構,所以分類使用的是resNet 本文詳細介紹了三種不同的方法來訓練卷積神經網絡進行 CIFAR-10 圖…

OPPO Find N5折疊手機:創新與實用的完美融合,FPC應用展現科技魅力【新立電子】

OPPO Find N5作為2025年新出世的折疊手機,以其卓越的設計、強大的性能以及創新的技術,為消費者帶來了全新的使用體驗。FPC(柔性電路板)在其中的運用,也進一步提升了手機的整體性能和用戶體驗。 OPPO Find N5的最大亮點…

【AD】PCB增加相關圖層——以機械層為例

問題:圖中PCB僅有機械層1和機械層2,想要在加一個機械層3 解決 1.點擊視圖—面板—View Configuration,選中機械層右鍵單擊增加層,其他層類似

Qt5 C++ QMap使用總結

文章目錄 功能解釋代碼使用案例代碼解釋注意事項代碼例子參考 功能解釋 QList<T> QMap::values() const Returns a list containing all the values in the map, in ascending order of their keys. If a key is associated with multiple values, all of its values wi…

測試用例總結

一、通用測試用例八要素   1、用例編號&#xff1b;    2、測試項目&#xff1b;   3、測試標題&#xff1b; 4、重要級別&#xff1b;    5、預置條件&#xff1b;    6、測試輸入&#xff1b;    7、操作步驟&#xff1b;    8、預期輸出 二、具體分析通…

不用寫代碼,批量下載今日頭條文章導出excel和pdf

前幾天有人問我怎么批量抓取今日頭條某個號的所有文章數據&#xff0c;需要文章鏈接&#xff0c;標題和時間&#xff0c;但是不會寫代碼&#xff0c;于是我寫了個簡單的教程 這里以渤海小吏為例 首先用edge瀏覽器安裝web-scraper瀏覽器擴展 然后打開瀏覽器控制臺&#xff0c;找…

Starrocks 寫入報錯 primary key memory usage exceeds the limit

背景 本文基于 StarRocks 3.3.5 單個Starrocks BE配置是 16CU 32GB 在Flink Yaml CDC 任務往 Starrocks寫數據的過程中&#xff0c;突然遇到了primary key memory usage exceeds the limit 問題&#xff0c;具體如下&#xff1a; java.lang.RuntimeException: com.starrocks.…

Django:文件上傳時報錯in a frame because it set ‘X-Frame-Options‘ to ‘deny‘.

即&#xff1a;使用Content-Security-Policy 1.安裝Django CSP中間件&#xff1a; pip install django-csp 2.更改項目配置&#xff1a; # settings.py MIDDLEWARE [...csp.middleware.CSPMiddleware,... ]CSP_DEFAULT_SRC ("self",) CSP_FRAME_ANCESTORS (&q…

利用Adobe Acrobat 實現PPT中圖片分辨率的提升

1. 下載適用于 Windows 的 64 位 Acrobat 注冊方式參考&#xff1a;https://ca.whu.edu.cn/knowledge.html?type1 2. 將ppt中需要提高分辨率的圖片復制粘貼到新建的pptx問價中&#xff0c;然后執行“文件—>導出---->創建PDF、XPS文檔” 3. 我們會發現保存下來的distrib…

【Python爬蟲】爬取公共交通路網數據

程序來自于Github&#xff0c;以下這篇博客作為完整的學習記錄&#xff0c;也callback上一篇爬取公共交通站點的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 這個項目是基于高德開放平臺和公交網獲取公交線路及站點數據&#xff0c;并生成shp文件&#xff0c;…

Stable Diffusion模型高清算法模型類詳解

Stable Diffusion模型高清算法模型類詳細對比表 模型名稱核心原理適用場景參數建議顯存消耗細節增強度優缺點4x-UltraSharp殘差密集塊(RDB)結構優化紋理生成真實人像/建筑攝影重繪幅度0.3-0.4&#xff0c;分塊尺寸768px★★★★★☆皮膚紋理細膩&#xff0c;但高對比場景易出現…

VUE_使用Vite構建vue項目

創建項目 // 安裝vite npm install vite// 創建名為vite-app的項目 npm create vite vite-app --template vue// 到項目目錄 cd vite-app// 安裝依賴 npm install// 運行項目 npm run dev// 打包 npm run build// 打包預覽 npm run serve 增加路由 // 安裝路由 npm add vue-r…

ctf網絡安全賽題

CTF簡介 CTF&#xff08;Capture The Flag&#xff09;中文一般譯作奪旗賽&#xff0c;在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式。CTF起源于1996年DEFCON全球黑客大會&#xff0c;以代替之前黑客們通過互相發起真實攻擊進行技術比拼的方式。發展…

【朝夕教育】《鴻蒙原生應用開發從零基礎到多實戰》004-TypeScript 中的泛型

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯&#xff0c;華為云云享專家&#xff0c;華為開發者專家&#xff0c;華為產品云測專家&#xff0c;CSDN博客專家&#xff0c;CSDN商業化專家&#xff0c;阿里云專家博主&#xff0c;阿里云簽約作者&#xff0c;騰訊云優秀博主&…

性能測試監控工具jmeter+grafana

1、什么是性能測試監控體系&#xff1f; 為什么要有監控體系&#xff1f; 原因&#xff1a; 1、項目-日益復雜&#xff08;內部除了代碼外&#xff0c;還有中間件&#xff0c;數據庫&#xff09; 2、一個系統&#xff0c;背后可能有多個軟/硬件組合支撐&#xff0c;影響性能的因…