談談一致性哈希演算法

来源:https://www.cnblogs.com/jilodream/archive/2023/06/02/17452331.html
-Advertisement-
Play Games

一致性哈希演算法是1997年由麻省理工的幾位學者提出的用於解決分散式緩存中的熱點問題。大家有沒有發現,我們之前介紹的例如快排之類的演算法是更早的六七十年代,此時分散式還沒有發展起來,大家往往還在提高單機性能。但是九十年代開始,逐漸需要用分散式集群來解決大型問題,相應的演算法研究也就應運而生。在說到一致性哈 ...


一致性哈希演算法是1997年由麻省理工的幾位學者提出的用於解決分散式緩存中的熱點問題。大家有沒有發現,我們之前介紹的例如快排之類的演算法是更早的六七十年代,此時分散式還沒有發展起來,
大家往往還在提高單機性能。但是九十年代開始,逐漸需要用分散式集群來解決大型問題,相應的演算法研究也就應運而生。
在說到一致性哈希演算法,我們還是得先從緩存的發展談起:
緩存,我們一般是用來提速的,當規模或者說數據量小時,我們往往用單機來部署一套緩存系統即可,如下圖:

多台客戶端在查詢數據時,只要根據key進入緩存伺服器查詢到自己想要的內容即可。
但是隨著業務的發展,單一的緩存伺服器往往無法支撐住我們的業務需要。比如緩存數據太大,多城多活的網路部署等,
我們就需要多台緩存伺服器來支撐,如下圖:

客戶端需要查詢緩存時,先根據哈希演算法,講key進行計算,得到哈希值。然後通過哈希值對機器數取模(%n)來判定落在哪台機器上。
這個架構很簡單,也很易實現,我們就不多說了。
但是這裡會存在一個緩存伺服器伸縮的問題:什麼意思呢?比如目前是三台,我們由於業務的需要,需要變為四台,或者變為兩台。那麼我們需要調整一遍所有數據所處的伺服器位置,因為他們存在的位置都有可能改變。

分散式緩存本來就是為瞭解決大數據量問題的,此時重新調整,勢必會極度影響可用性。那麼如何解決呢?
來看看一致性哈希演算法的思路:
我們假設存在一個虛擬環,這個環足夠大,上邊存在2^32個節點,三台器機器呢,我們根據id計算出他們在環中所處的位置,如圖所示:

 

當我們計算數據所處的緩存位置,不再是根據n來取模,而是根據2^32來取模,此時會有相當多的數據並沒有落在緩存伺服器所處的節點上。
那怎麼辦呢?我們按照順時針方向計算,將數據落在下一個最*的順時針節點上。
如下圖所示:

這樣當我們新增或者刪除節點時,只會影響有限的節點上的數據,極大的縮小了受影響的節點和數據。我們只需要重新計算受影響的數據即可,但是這樣還會存在新的問題:
1、緩存伺服器計算出的位置不均勻,導致覆蓋的節點數差異明顯;
2、數據並不均衡:數據經過哈希和取模運算後,可能落在集中的一片區域中,造成對應的緩存伺服器的數據特別大。
以上問題我們稱之為數據傾斜。數據傾斜的程度明顯後,可能會導致所解決的問題再次出現(前文中的紅字部分)。
那如何解決這種問題呢?很簡單,加節點,只要節點足夠多,那麼就會越來越趨*於*均,數據傾斜的情況就會越不突出。但是緩存伺服器是有限的,並不是想加多少都可以的。
那怎麼辦呢?

我們可以採用虛擬緩存節點的形式解決問題。什麼是虛擬緩存節點,就是並不實際存在的緩存節點。只是一個虛擬的點。
每個真實的緩存伺服器對應多個虛擬緩存節點,兩者是一對多的關係,如下圖所示:

虛擬節點--圖中連接在環上的就是虛擬緩存節點。
真實緩存節點--Cache
每個Cache對應若幹的虛擬節點。當增減Cache時,我們只要調整對應的虛擬節點所對應的數據即可。

 

如果你覺得寫的不錯,歡迎轉載和點贊。 轉載時請保留作者署名jilodream/王若伊_恩賜解脫(博客鏈接:http://www.cnblogs.com/jilodream/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • **原文鏈接:** [為什麼說 Go 語言字元串是不可變的?](https://mp.weixin.qq.com/s/AOb6AjKwyTwLeAUou0AU-Q) 最近有讀者留言說,平時在寫代碼的過程中,是會對字元串進行修改的,但網上都說 Go 語言字元串是不可變的,這是為什麼呢? 這個問題本身並 ...
  • aliases: [] tags : " " summary: [基於TCP/IP和UDP協議的Java Socket網路通信編程] author : [yaenli] notekey: [20230512-143738] # Socket 網路模型 Socket編程是在TCP/IP、UDP協議上的 ...
  • # Rust Web 全棧開發之增加教師管理功能 ## 增加教師管理功能 ### 目標 #### Actix HTTP Server #### Actix App - Routes - GET /teachers - GET / teachers /{teacher_id} - POST /teac ...
  • ## 教程簡介 Google Charts 是一個純粹的基於JavaScript的圖表庫,旨在通過添加互動式圖表功能來增強Web應用程式.它支持各種圖表.在Chrome,Firefox,Safari,Internet Explorer(IE)等標準瀏覽器中使用SVG繪製圖表.在傳統的IE 6中,VM ...
  • ## 教程簡介 Excel是辦公室自動化中非常重要的一款軟體,Excel函數則是Excel中的內置函數。Excel函數共包含11類,分別是資料庫函數、日期與時間函數、工程函數、財務函數、信息函數、邏輯函數、查詢和引用函數、數學和三角函數、統計函數、文本函數以及用戶自定義函數。 熟練且高效的使用Exc ...
  • 前端組件 <hd-flex> <el-dialog v-model="isUploadDialog" width="50%" lock-scroll=false> <el-upload class="upload-demo" drag :action="url" :on-success="succe ...
  • 基於java的酒店管理系統設計與實現,酒店訂票系統,酒店預訂系統,酒店信息管理系統,app訂房系統設計與實現; ...
  • 本章將繼續探索內核中解析PE文件的相關內容,PE文件中FOA與VA,RVA之間的轉換也是很重要的,所謂的FOA是文件中的地址,VA則是記憶體裝入後的虛擬地址,RVA是記憶體基址與當前地址的相對偏移,本章還是需要用到`《驅動開發:內核解析PE結構導出表》`中所封裝的`KernelMapFile()`映射函... ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...