成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Consistent Hashing算法

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

在做服務器負載均衡時候可供選擇的負載均衡的算法有很多,包括: 輪循算法(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,memcached,load balancing,負載均衡,算法,key-value store

Consistent Hashing原理示意圖

 

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

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

 

Consistent hashing,memcached,load balancing,負載均衡,算法,key-value store

Consistent Hashing添加服務器示意圖

 

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

 

Consistent hashing,memcached,load balancing,負載均衡,算法,key-value store

 

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

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

2、Consistent Hashing算法實現:

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

 

  1. import java.util.Collection;  
  2. import java.util.SortedMap;  
  3. import java.util.TreeMap;  
  4.  
  5. public class ConsistentHash<T> {  
  6.  
  7.  private final HashFunction hashFunction;  
  8.  private final int numberOfReplicas;  
  9.  private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();  
  10.  
  11.  public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,  
  12.      Collection<T> nodes) {  
  13.    this.hashFunction = hashFunction;  
  14.    this.numberOfReplicas = numberOfReplicas;  
  15.  
  16.    for (T node : nodes) {  
  17.      add(node);  
  18.    }  
  19.  }  
  20.  
  21.  public void add(T node) {  
  22.    for (int i = 0; i < numberOfReplicas; i++) {  
  23.      circle.put(hashFunction.hash(node.toString() + i), node);  
  24.    }  
  25.  }  
  26.  
  27.  public void remove(T node) {  
  28.    for (int i = 0; i < numberOfReplicas; i++) {  
  29.      circle.remove(hashFunction.hash(node.toString() + i));  
  30.    }  
  31.  }  
  32.  
  33.  public T get(Object key) {  
  34.    if (circle.isEmpty()) {  
  35.      return null;  
  36.    }  
  37.    int hash = hashFunction.hash(key);  
  38.    if (!circle.containsKey(hash)) {  
  39.      SortedMap<Integer, T> tailMap = circle.tailMap(hash);  
  40.      hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();  
  41.    }  
  42.    return circle.get(hash);  
  43.  }  
  44.  

 

責任編輯:金賀 來源: ITEYE博客
相關推薦

2018-08-08 15:51:44

Hash分布式算法

2022-02-04 21:56:59

回溯算法面試

2011-08-12 12:34:27

Oracle數據庫consistent

2024-07-05 10:38:15

SOTA目標檢測

2025-05-08 01:00:00

Nginx算法負載均衡

2010-04-20 13:36:17

負載平衡

2024-06-12 10:18:33

2017-11-22 14:20:07

前端JavaScript排序算法

2010-01-06 16:33:50

.Net Framew

2017-03-17 14:18:34

JavaScript算法問題詳解

2010-09-09 14:52:56

CSS盒模型

2009-08-25 17:41:51

C#開發排序算法

2020-09-09 10:20:48

GraphSAGE神經網絡人工智能

2010-01-11 15:01:55

VB.NET冒泡排序

2024-04-18 15:44:20

2022-03-03 19:31:31

隊列算法Harmony

2015-08-20 11:01:22

Java虛擬機GC算法種類

2018-07-06 11:39:40

2022-03-18 06:32:43

遞歸Python算法

2020-10-14 08:32:08

算法遞歸面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久av资源网| 成人特区 | 亚洲网站在线观看 | 国产高清在线视频 | 久久99精品久久久久 | 日韩一区二区三区在线观看 | 国产精品特级毛片一区二区三区 | 国产精品影视在线观看 | 久久久久久国产精品免费免费 | av二区三区 | 国产精品国产三级国产aⅴ无密码 | 欧美中文字幕在线 | 精品久久久久久久久久久久 | 亚洲精品一二三区 | 久久国产精品免费一区二区三区 | 国产女人与拘做受免费视频 | 在线免费观看黄网 | av一区二区三区四区 | 亚洲成人网在线播放 | 免费视频一区二区 | 岛国av免费在线观看 | 亚洲国产区| 久久91| 国产久| 国产午夜精品福利 | 女女百合av大片一区二区三区九县 | 日本午夜精品一区二区三区 | 激情综合五月天 | 免费观看的av| 久久亚洲春色中文字幕久久久 | 精品欧美乱码久久久久久1区2区 | 久99久视频 | 欧美中文字幕一区二区三区亚洲 | av一级| 国产乱码精品1区2区3区 | 国产精品久久久久久久久免费相片 | 看毛片网站 | 久久亚洲视频 | 欧美xxxx日本 | 中文字幕国产 | 欧美在线视频a |