一致性哈希

推薦閱讀: 一致性哈希算法及其在分佈式系統中的應用

一、普通哈希方案

1. 系統背景

通過三臺緩存服務器來處理服務器壓力:
在這裏插入圖片描述

2. 簡單策略

  • 最簡單的策略: 將每一次 Memcached 請求隨機發送到一臺Memcached服務器

  • 該策略的兩個問題

    1. 一是同一份數據可能被存在不同的機器上而造成數據冗餘
    2. 二是有可能某數據已經被緩存但是訪問卻沒有命中,因爲無法保證對相同key的所有訪問都被髮送到相同的服務器

3. 簡單哈希策略

  • 解決上述問題: 保證對相同 key 的訪問會被髮送到相同的服務器

    很多方法可以實現這一點,最常用的方法是計算哈希:h = Hash(key) % N

  • 簡單哈希策略的問題: 容錯性和擴展性不好:
    • 容錯性: 當系統中某一個或幾個服務器不可用時,整個系統是否可以正確高效運行
    • 擴展性: 當加入新的服務器後,整個系統是否可以正確高效運行

    舉例:

    • 現假設一臺服務器宕機,那麼爲了填補空缺,要將宕機的服務器從編號列表中移除,後面的服務器按順序前移一位並將其編號值減一,此時每個key就要按h = Hash(key) % (N-1)重新計算
    • 同樣,如果新增了一臺服務器,雖然原有服務器編號不用改變,但是要按h = Hash(key) % (N+1)重新計算哈希值
    • 因此係統中一旦有服務器變更,大量的key會被重定位到不同的服務器從而造成大量的緩存不命中

    而這種情況在分佈式系統中是非常糟糕的

二、一致性哈希

  • 一致性哈希: 具有良好的單調性的分佈式哈希方案,即服務節點的增減不會造成大量哈希重定位

1. 算法簡介

一致性哈希將整個哈希值空間組織成一個虛擬的圓環:

  • 假設某哈希函數H的值空間爲 0 到 2322^{32}-1(即哈希值是一個32位無符號整形),整個哈希空間環如下:
    在這裏插入圖片描述

  • 下一步將各個服務器使用 H 進行一個哈希:

    具體可以選擇服務器的 ip 或主機名作爲關鍵字進行哈希

    在這裏插入圖片描述

  • 接下來使用如下算法定位數據訪問到相應服務器:將數據 key 使用相同的函數 H 計算出哈希值 h,根據 h 確定此數據在環上的位置,從此位置沿環順時針“行走”,第一臺遇到的服務器就是其應該定位到的服務器:

    例如我們有A、B、C、D四個數據對象,經過哈希計算後,在環空間上的位置如下:
    在這裏插入圖片描述
    根據一致性哈希算法,數據 A 會被定爲到 Server 1上,D 被定爲到Server 3上,而B、C分別被定爲到Server 2上

2. 虛擬節點

  • 一致性哈希算法在服務節點太少時,容易因爲節點分部不均勻而造成數據傾斜問題
  • 一致性哈希算法引入了虛擬節點機制,即對每一個服務節點計算多個哈希,每個計算結果位置都放置一個此服務節點,稱爲虛擬節點

3. 特性

  • 平衡性:哈希的結果能夠儘可能分佈到所有的緩衝中,使得所有緩衝空間都得到利用
  • 單調性: 保證原有已分配的內容可以被映射到新的緩衝區中,而不會被映射到舊的緩衝集合中的其他緩衝區

    即: 當新的服務器添加時,不需要重新分配hash緩存,只需要保證新元素加到新的hash緩存

    • 哈希結果的變化意味着當緩衝空間發生變化時,所有的映射關係需要在系統內全部更新
  • 分散性: 在分佈式環境中,終端可能看不到所有的緩衝,導致相同的內容被不同的終端映射到不同的緩衝區中
  • 負載: 從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的用戶映射爲不同的內容
  • 平滑性: 指緩存服務器的數目平滑改變和緩存對象的平滑改變是一致的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章