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

詳解Consistent Hashing算法

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

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

典型的應(yīng)用場(chǎng)景是: 有N臺(tái)服務(wù)器提供緩存服務(wù),需要對(duì)服務(wù)器進(jìn)行負(fù)載均衡,將請(qǐng)求平均分發(fā)到每臺(tái)服務(wù)器上,每臺(tái)機(jī)器負(fù)責(zé)1/N的服務(wù)。

常用的算法是對(duì)hash結(jié)果取余數(shù) (hash() mod N ):對(duì)機(jī)器編號(hào)從0到N-1,按照自定義的 hash()算法,對(duì)每個(gè)請(qǐng)求的hash()值按N取模,得到余數(shù)i,然后將請(qǐng)求分發(fā)到編號(hào)為i的機(jī)器。但這樣的算法方法存在致命問(wèn)題,如果某一臺(tái)機(jī)器宕機(jī),那么應(yīng)該落在該機(jī)器的請(qǐng)求就無(wú)法得到正確的處理,這時(shí)需要將當(dāng)?shù)舻姆?wù)器從算法從去除,此時(shí)候會(huì)有(N-1)/N的服務(wù)器的緩存數(shù)據(jù)需要重新進(jìn)行計(jì)算;如果新增一臺(tái)機(jī)器,會(huì)有N /(N+1)的服務(wù)器的緩存數(shù)據(jù)需要進(jìn)行重新計(jì)算。對(duì)于系統(tǒng)而言,這通常是不可接受的顛簸(因?yàn)檫@意味著大量緩存的失效或者數(shù)據(jù)需要轉(zhuǎn)移)。那么,如何設(shè)計(jì)一個(gè)負(fù)載均衡策略,使得受到影響的請(qǐng)求盡可能的少呢?

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

1、Consistent Hashing算法描述

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

由于hash算法結(jié)果一般為unsigned int型,因此對(duì)于hash函數(shù)的結(jié)果應(yīng)該均勻分布在[0,232 -1]間,如果我們把一個(gè)圓環(huán)用232 個(gè)點(diǎn)來(lái)進(jìn)行均勻切割,首先按照hash(key)函數(shù)算出服務(wù)器(節(jié)點(diǎn))的哈希值, 并將其分布到0~232 的圓上。

用同樣的hash(key)函數(shù)求出需要存儲(chǔ)數(shù)據(jù)的鍵的哈希值,并映射到圓上。然后從數(shù)據(jù)映射到的位置開始順時(shí)針查找,將數(shù)據(jù)保存到找到的***個(gè)服務(wù)器(節(jié)點(diǎn))上。

 

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

Consistent Hashing原理示意圖

 

1. 新增一個(gè)節(jié)點(diǎn):只有在圓環(huán)上新增節(jié)點(diǎn)到逆時(shí)針?lè)较虻?**個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)會(huì)受到影響(增加節(jié)點(diǎn)順時(shí)針的***個(gè)節(jié)點(diǎn)的信息需要遷移到增加節(jié)點(diǎn)上)。

2. 刪除一個(gè)節(jié)點(diǎn):只有在圓環(huán)上原來(lái)刪除節(jié)點(diǎn)到 逆時(shí)針 方向的***個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)會(huì)受到影響(刪除節(jié)點(diǎn)的信息需要遷移到順時(shí)針的***個(gè)節(jié)點(diǎn)上) ,因此通過(guò)Consistent Hashing很好地解決了負(fù)載均衡中由于新增節(jié)點(diǎn)、刪除節(jié)點(diǎn)引起的hash值顛簸問(wèn)題。

 

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

Consistent Hashing添加服務(wù)器示意圖

 

虛擬節(jié)點(diǎn)(virtual nodes): 之所以要引進(jìn)虛擬節(jié)點(diǎn)是因?yàn)樵诜?wù)器(節(jié)點(diǎn))數(shù)較少的情況下(例如只有3臺(tái)服務(wù)器),通過(guò)hash(key)算出節(jié)點(diǎn)的哈希值在圓環(huán)上并不是均勻分布的(稀疏的),仍然會(huì)出現(xiàn)各節(jié)點(diǎn)負(fù)載不均衡的問(wèn)題。虛擬節(jié)點(diǎn)可以認(rèn)為是實(shí)際節(jié)點(diǎn)的復(fù)制品(replicas),本質(zhì)上與實(shí)際節(jié)點(diǎn)實(shí)際上是一樣的(key并不相同)。引入虛擬節(jié)點(diǎn)后,通過(guò)將每個(gè)實(shí)際的服務(wù)器(節(jié)點(diǎn))數(shù)按照一定的比例(例如200倍)擴(kuò)大后并計(jì)算其hash(key)值以均勻分布到圓環(huán)上。在進(jìn)行負(fù)載均衡時(shí)候,落到虛擬節(jié)點(diǎn)的哈希值實(shí)際就落到了實(shí)際的節(jié)點(diǎn)上。由于所有的實(shí)際節(jié)點(diǎn)是按照相同的比例復(fù)制成虛擬節(jié)點(diǎn)的,因此解決了節(jié)點(diǎn)數(shù)較少的情況下哈希值在圓環(huán)上均勻分布的問(wèn)題。

 

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

 

虛擬節(jié)點(diǎn)對(duì)Consistent Hashing結(jié)果的影響

從上圖可以看出,在節(jié)點(diǎn)數(shù)為10個(gè)的情況下,每個(gè)實(shí)際節(jié)點(diǎn)的虛擬節(jié)點(diǎn)數(shù)為實(shí)際節(jié)點(diǎn)的100-200倍的時(shí)候,結(jié)果還是很均衡的。

2、Consistent Hashing算法實(shí)現(xiàn):

文章Consistent Hashing 中描述了Consistent Hashing的Java實(shí)現(xiàn),很簡(jiǎn)潔。

 

  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.  

 

責(zé)任編輯:金賀 來(lái)源: ITEYE博客
相關(guān)推薦

2018-08-08 15:51:44

Hash分布式算法

2022-02-04 21:56:59

回溯算法面試

2011-08-12 12:34:27

Oracle數(shù)據(jù)庫(kù)consistent

2025-05-08 01:00:00

Nginx算法負(fù)載均衡

2024-07-05 10:38:15

SOTA目標(biāo)檢測(cè)

2017-11-22 14:20:07

前端JavaScript排序算法

2010-04-20 13:36:17

負(fù)載平衡

2024-06-12 10:18:33

2009-08-25 17:41:51

C#開發(fā)排序算法

2020-09-09 10:20:48

GraphSAGE神經(jīng)網(wǎng)絡(luò)人工智能

2010-01-06 16:33:50

.Net Framew

2017-03-17 14:18:34

JavaScript算法問(wèn)題詳解

2010-09-09 14:52:56

CSS盒模型

2010-01-11 15:01:55

VB.NET冒泡排序

2024-04-18 15:44:20

2020-10-14 08:32:08

算法遞歸面試

2022-03-03 19:31:31

隊(duì)列算法Harmony

2015-08-20 11:01:22

Java虛擬機(jī)GC算法種類

2018-07-06 11:39:40

2022-03-18 06:32:43

遞歸Python算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久精彩 | 综合欧美亚洲 | 免费看国产a | 一色桃子av一区二区 | 小草久久久久久久久爱六 | 精品久| 亚洲久草视频 | 久久久国产精品 | 久久久久久蜜桃一区二区 | 亚洲欧洲在线视频 | 99精品久久 | 日韩一区二区av | 欧美a区 | 亚洲精品国产电影 | 岛国在线免费观看 | 91国内精品 | 国产精品毛片 | 国产乱码精品一区二区三区忘忧草 | 91在线精品一区二区 | 免费一看一级毛片 | 国产精品美女一区二区 | 一区二区在线观看av | 成人免费小视频 | 久久精品视频网站 | 久久99蜜桃综合影院免费观看 | 亚洲精品1区2区3区 91免费看片 | 欧美a√| 欧美一级在线观看 | 午夜欧美一区二区三区在线播放 | 精品欧美一区二区三区久久久 | 午夜影院免费体验区 | 国产a级黄色录像 | 亚洲午夜精品一区二区三区他趣 | 久久久久久久国产 | 亚洲国产成人精品女人久久久 | 自拍偷拍亚洲视频 | 超碰地址| 91久久久久久 | 国产精品日韩一区二区 | xxx.在线观看 | av国产精品 |