我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何实现Consistent Hashing算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何实现Consistent Hashing算法

这篇文章给大家分享的是有关如何实现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原理示意图

新增一个节点:只有在圆环上新增节点到逆时针方向的***个节点之间的数据会受到影响(增加节点顺时针的***个节点的信息需要迁移到增加节点上)。

删除一个节点:只有在圆环上原来删除节点到 逆时针 方向的***个节点之间的数据会受到影响(删除节点的信息需要迁移到顺时针的***个节点上) ,因此通过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算法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何实现Consistent Hashing算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何实现Consistent Hashing算法

这篇文章给大家分享的是有关如何实现Consistent Hashing算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robi
2023-06-17

Java如何实现Floyd算法

本篇内容主要讲解“Java如何实现Floyd算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现Floyd算法”吧!一 问题描述求节点0到节点2的最短路径。二 代码package
2023-07-02

Python如何实现KPM算法

这篇文章主要介绍Python如何实现KPM算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!知识点说明:先说前缀,和后缀吧比如有一个串:abab则在下标为3处的(前缀和后缀都要比下标出的长度小1,此处下标为3出的长度
2023-06-21

Java MD5算法如何实现

本文小编为大家详细介绍“Java MD5算法如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java MD5算法如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。MD5加密简介哈希算法又称散列算法,是
2023-07-02

Java如何实现RSA算法

小编给大家分享一下Java如何实现RSA算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!以下是引用片段:package rsa; import java.mat
2023-06-03

PHP如何实现LRU算法

小编给大家分享一下PHP如何实现LRU算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!整体设计1:用数组保存缓存对象(Node);2:缓存对象(Node)之间通
2023-06-20

python如何实现Simhash算法

这篇文章主要介绍python如何实现Simhash算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、simhash步骤simhash包含分词、hash、加权、合并、降维五大步骤simhash代码如下:import
2023-06-29

Java如何实现Kruskal算法

本文小编为大家详细介绍“Java如何实现Kruskal算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现Kruskal算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍构造最小生成树还有一种
2023-07-02

php如何实现乘法运算

本篇内容主要讲解“php如何实现乘法运算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何实现乘法运算”吧!在PHP中,可以利用“*”算术运算符实现乘法运算,该运算符用于计算前后两个数的乘
2023-06-29

php如何实现漏桶算法

这篇文章主要讲解了“php如何实现漏桶算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现漏桶算法”吧!漏桶算法是一种流控算法,常用于限制网络流量。对于服务器防止突发大流量攻击有
2023-07-05

Python如何实现鸡群算法

这篇“Python如何实现鸡群算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python如何实现鸡群算法”文章吧。算法简
2023-07-04

php如何实现查找算法

小编给大家分享一下php如何实现查找算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支
2023-06-14

如何用Nacos实现Raft算法

这篇文章主要介绍“如何用Nacos实现Raft算法”,在日常操作中,相信很多人在如何用Nacos实现Raft算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Nacos实现Raft算法”的疑惑有所帮助!
2023-06-02

JavaScript如何实现洗牌算法

这篇文章给大家分享的是有关JavaScript如何实现洗牌算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。洗牌算法早前的 chrome 对于元素小于 10 的数组会采用插入排序,这会导致对数组进行的乱序并不是真
2023-06-27

Python如何实现蚁群算法

这篇文章将为大家详细讲解有关Python如何实现蚁群算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、引言在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的
2023-06-29

Python查找算法如何实现

本文小编为大家详细介绍“Python查找算法如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python查找算法如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。查找算法是用来检索序列数据(群体)中是
2023-06-30

java算法如何实现红黑树

这篇文章主要介绍了java算法如何实现红黑树,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。红黑树定义红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录