- 在阅读时,必须得对哈希函数的性质有所了解。
一致性哈希解决负载均衡
- 一、场景还原
- 二、解决思路
- 2.1、选择哈希函数
- 2.2、存储时实现负载均衡
- 2.3、解决如何将三台服务器均匀的分布在整个哈希域上
- 2.3.1、虚拟节点技术
- 2.4、为什么这个方式可以解决增加、删除服务器后仍然实现负载均衡
- 2.4.1、添加服务器
- 2.4.2、删除服务器
- 2.5、这样做还有利于管理服务器
一、场景还原
- 现在假设有40亿用户,有三台服务器。现在要将这40亿的用户均衡的存储在这三台服务器上,并且如果增加若干台新的服务器进去,各个服务器之间任然可以保持均衡。将若干台服务器删了,任然负载均衡。
二、解决思路
2.1、选择哈希函数
- 首先选取合适的哈希函数,比如MD5。
2.2、存储时实现负载均衡
- 选择合适的key值,计算这三台服务器的哈希值。并且使得这三台服务器的哈希值将整个MD5哈希域的值尽可能均分(如何实现这个均分后面会介绍),如下图所示;
- 在40亿个用户上选择出合适的key,(key属性在选择时一定要注意,选择的key只用来计算每个用户的哈希值,所以key值的选择,与能否实现均分有着密切的联系)计算出每一个用户的哈希值,如果计算出来的哈希值在第一台到第二台服务器哈希值之间,则将其存储在第二台上。按照这个规则就可以将40亿用户均匀分别存储在三台服务器上。
2.3、解决如何将三台服务器均匀的分布在整个哈希域上
- 为了解决这个问题,我们引进虚拟节点技术;
2.3.1、虚拟节点技术
- 如果用三个服务器很难实现三台服务器的哈希值均分哈希域。但是,如果给每台服务器找1000个不同的key值,计算出1000个哈希值,通过哈希函数的性质可知这个1000个点会均匀分布在整个哈希域上(每台服务器的代表key值越多分布的越均匀)从而这三千个代表节点会将整个哈希域均分。按照2.2部分的存储规则,会将这三千个片段均分给这三台服务器,从而实现三台服务器均分整个哈希域。
- 这个方式就是应用到比例的方式去均分哈希域。
2.4、为什么这个方式可以解决增加、删除服务器后仍然实现负载均衡
2.4.1、添加服务器
- 在添加新的服务器后,按照虚拟节点技术,给新加的服务设置1000个key值,通过计算哈希值,让这1000个哈希值均匀的分布在哈希域上,从而将哈希域均分成4000份,每台服务器各占四分之一。从而实现四台服务器均分整个哈希域。
2.4.2、删除服务器
- 在删除服务器之后,可以将被删除的服务器里面的客户的哈希值按照前面所说的分配原则,就可以实现均分到剩下的服务器当中去。实现负载均衡。
2.5、这样做还有利于管理服务器
- 当服务器的性能不同时,每台服务器上最大的存储量会不一样。这个时候,只需调整每台服务器的代表key的数量,就可以实现,每台服务器占自身性能相对的区域大小。从而实现服务器的管理。
- 例如,现在第一台和第二台服务器的性能相等,且高于第三台服务器。我们假设给第一台第二台服务器各设置1000个key,给第三台服务器设置500个。计算可知,第一台和第二台会占整个区域的五分之二,剩下的五分之一让第三台占取。从而做到按照比例去给服务器分配合适的客户数量。
















