一致性哈希
在分布式集群系统中会用到一致性哈希算法,在此进行记录。
一般系统分为前端服务器和后端服务器,前端服务器负责数据的接收和分发工作,后端负责存储、处理、提供数据。后端服务器不止一台,此时就涉及到了数据如何分发的问题。一致性哈希算法就可以用来解决这一问题。
经典结构
通过哈希函数我们可以建立key-value的对应关系。假设目前一共有3台服务器用于数据存储,那么在一个数据存储request发来时,可以对其计算一个hash value,然后将hash value模3来决定将该数据存储在哪台机器当中。由于哈希函数的均匀随机特性,可以做到数据存储的负载均衡。
**缺陷:**虽然这种经典结构可以做到负载均衡,但是在增加删除机器时,需要重新计算一遍所有数据的哈希值来确定其新的所属的机器。
一致性哈希
针对经典结构不利于机器添加删除的缺陷,提出一致性哈希算法。
将哈希函数域的最大值为max_value,将其值域看做一个首尾相连的环,然后根据机器的ip或者mac值算出一个hash value,从而确定该机器在这个环上的位置。将机器的hash value排序后存储在前端服务器当中,这样在一个request到来时,算出其hash value,然后根据这个值得到第一个哈希值大于该值的机器,然后将该数据存储在这台机器当中。
新增机器时,例如图中新增机器m4,算得哈希值位于m2与m3之间,那么就将m3中哈希值小于m4机器哈希值的数据转移存储到m4当中。如果要删除m4,就将m4中的数据全部交给m3。
**缺陷:**虽然通过上述方法可以实现机器方便的添加删除,但由于哈希函数的随机特性,当机器很多时可以做到数据存储负载均衡,而机器少时,很可能某些机器存储的数据很少,某些机器存储的数据却很多,做不到负载均衡,且即使某情况下均衡了,后续添加机器又会破坏这种均衡。
虚拟节点技术
针对上述缺陷,提出虚拟节点技术:对每个机器产生很多个虚拟值,然后对这些虚拟值计算哈希值,得到很多个虚拟节点去占据哈希域(相当于一个机器模拟了许多虚拟机器)。然后将属于虚拟节点的数据交给对应的机器。