91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Consistent Hashing算法

發布時間:2021-12-27 10:14:52 來源:億速云 閱讀:108 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何實現Consistent Hashing算法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

在做服務器負載均衡時候可供選擇的負載均衡的算法有很多,包括: 輪循算法(Round Robin)、哈希算法(HASH)、最少連接算法(Least Connection)、響應速度算法(Response Time)、加權法(Weighted )等。其中哈希算法是最為常用的算法.

典型的應用場景是: 有N臺服務器提供緩存服務,需要對服務器進行負載均衡,將請求平均分發到每臺服務器上,每臺機器負責1/N的服務。

常用的算法是對hash結果取余數 (hash() mod N ):對機器編號從0到N-1,按照自定義的 hash()算法,對每個請求的hash()值按N取模,得到余數i,然后將請求分發到編號為i的機器。但這樣的算法方法存在致命問題,如果某一臺機器宕機,那么應該落在該機器的請求就無法得到正確的處理,這時需要將當掉的服務器從算法從去除,此時候會有(N-1)/N的服務器的緩存數據需要重新進行計算;如果新增一臺機器,會有N /(N+1)的服務器的緩存數據需要進行重新計算。對于系統而言,這通常是不可接受的顛簸(因為這意味著大量緩存的失效或者數據需要轉移)。那么,如何設計一個負載均衡策略,使得受到影響的請求盡可能的少呢?

在Memcached、Key-Value Store 、Bittorrent DHT、LVS中都采用了Consistent Hashing算法,可以說Consistent Hashing 是分布式系統負載均衡的***算法。

1、Consistent Hashing算法描述

下面以Memcached中的Consisten Hashing算法為例說明(參考memcached的分布式算法 )。

由于hash算法結果一般為unsigned int型,因此對于hash函數的結果應該均勻分布在[0,232 -1]間,如果我們把一個圓環用232 個點來進行均勻切割,首先按照hash(key)函數算出服務器(節點)的哈希值, 并將其分布到0~232 的圓上。

用同樣的hash(key)函數求出需要存儲數據的鍵的哈希值,并映射到圓上。然后從數據映射到的位置開始順時針查找,將數據保存到找到的***個服務器(節點)上。

如何實現Consistent Hashing算法

Consistent Hashing原理示意圖

1. 新增一個節點:只有在圓環上新增節點到逆時針方向的***個節點之間的數據會受到影響(增加節點順時針的***個節點的信息需要遷移到增加節點上)。

2. 刪除一個節點:只有在圓環上原來刪除節點到 逆時針 方向的***個節點之間的數據會受到影響(刪除節點的信息需要遷移到順時針的***個節點上) ,因此通過Consistent Hashing很好地解決了負載均衡中由于新增節點、刪除節點引起的hash值顛簸問題。

如何實現Consistent Hashing算法

Consistent Hashing添加服務器示意圖

虛擬節點(virtual nodes): 之所以要引進虛擬節點是因為在服務器(節點)數較少的情況下(例如只有3臺服務器),通過hash(key)算出節點的哈希值在圓環上并不是均勻分布的(稀疏的),仍然會出現各節點負載不均衡的問題。虛擬節點可以認為是實際節點的復制品(replicas),本質上與實際節點實際上是一樣的(key并不相同)。引入虛擬節點后,通過將每個實際的服務器(節點)數按照一定的比例(例如200倍)擴大后并計算其hash(key)值以均勻分布到圓環上。在進行負載均衡時候,落到虛擬節點的哈希值實際就落到了實際的節點上。由于所有的實際節點是按照相同的比例復制成虛擬節點的,因此解決了節點數較少的情況下哈希值在圓環上均勻分布的問題。

如何實現Consistent Hashing算法

虛擬節點對Consistent Hashing結果的影響

從上圖可以看出,在節點數為10個的情況下,每個實際節點的虛擬節點數為實際節點的100-200倍的時候,結果還是很均衡的。

2、Consistent Hashing算法實現:

文章Consistent Hashing 中描述了Consistent Hashing的Java實現,很簡潔。

import java.util.Collection;  import java.util.SortedMap;  import java.util.TreeMap;   public class ConsistentHash<T> {    private final HashFunction hashFunction;   private final int numberOfReplicas;   private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();    public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,       Collection<T> nodes) {     this.hashFunction = hashFunction;     this.numberOfReplicas = numberOfReplicas;      for (T node : nodes) {       add(node);     }   }    public void add(T node) {     for (int i = 0; i < numberOfReplicas; i++) {       circle.put(hashFunction.hash(node.toString() + i), node);     }   }    public void remove(T node) {     for (int i = 0; i < numberOfReplicas; i++) {       circle.remove(hashFunction.hash(node.toString() + i));     }   }    public T get(Object key) {     if (circle.isEmpty()) {       return null;     }     int hash = hashFunction.hash(key);     if (!circle.containsKey(hash)) {       SortedMap<Integer, T> tailMap = circle.tailMap(hash);       hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();     }     return circle.get(hash);   }   }

感謝各位的閱讀!關于“如何實現Consistent Hashing算法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新绛县| 永平县| 涞水县| 长治市| 南安市| 于都县| 胶南市| 丹东市| 开平市| 辉南县| 江达县| 南汇区| 防城港市| 杨浦区| 旬邑县| 巴彦淖尔市| 射阳县| 儋州市| 治多县| 天镇县| 灵璧县| 镇江市| 广饶县| 凤台县| 辽中县| 牙克石市| 闵行区| 绥滨县| 固安县| 洛南县| 黑水县| 巨野县| 牡丹江市| 策勒县| 甘孜县| 临泉县| 哈巴河县| 古丈县| 林甸县| 中方县| 镇康县|