目录
一、什么是一致性哈希
二、一致性哈希原理
2.1 hash 环
三、服务器扩容场景
3.1 服务器增加
3.2 服务器减少
3.3 使用虚拟节点
四、 一致性哈希的使用场景
一、什么是一致性哈希
一致性哈希是一种哈希算法,用于将数据分布到不同的节点或存储区域,而保持数据的一致性和均衡性。在分布式系统中,一致性哈希通常用于解决负载均衡和数据分布的问题。
一致性哈希的基本原理是将数据的键通过哈希函数映射到一个固定的哈希空间中。然后,将这个哈希空间分布到环形的哈希环上。每个节点或存储区域在哈希环上占据一个位置,称为虚拟节点或者物理节点。
当需要存储或查找数据时,通过哈希函数计算数据的哈希值,并沿着哈希环顺时针寻找距离最近的节点。这样可以实现数据的高效分布和查找,同时也能够避免节点动态增减时数据重新分布的开销。
一致性哈希算法的优势在于其简单、高效,并且能够保持数据的均衡性和一致性。在分布式存储系统、负载均衡器等场景中被广泛应用。
一致性哈希算法的优点在于:当新增或删除节点时,只会影响到环上的一小部分节点,因此不会像传统的哈希算法那样造成大量的数据迁移和重新分片。同时,由于节点数较多,请求可以被更好地平均分配,从而实现了负载均衡的效果。
另外,一致性哈希算法还可以通过增加虚拟节点来解决节点不均衡的问题,从而进一步提高负载均衡的效果。
例如:有三台服务器编号node1,node2,node3;有3000万个key,需要将这3000万个key均匀的缓存到三台机器上。
解决方案:取模算法 hash(key)% N
,即:对 key 进行 hash 运算后取模,N 是机器的数量;
这样对 key 进行 hash 后的结果对 3 取模,得到的结果一定是 0、1 或 2,正好对应服务器node0
、node1
、node2
,存取数据直接找对应的服务器即可。
取模算法虽然使用简单,而服务器数量 N 发生变化后 hash(key)% N
计算的结果也会随之变化!
二、一致性哈希原理
一致性哈希算法也是取模算法,与上面的对服务器取模不同的是它是对 2^32 取模。
即:key % (2^32)
2.1 hash 环
这时,通过计算 key%(2^32),看它落到了圆上的哪一点,然后顺时针向后走,遇到的第一台服务器就是它存放的服务器。
A->B弧线上的点都对应->B服务器
B->C弧线上的点都对应->C服务器
C->A弧线上的点都对应 ->A服务器
三、服务器扩容场景
3.1 服务器增加
受到影响的数据范围只有 A到D 这条弧线上的数据
3.2 服务器减少
受到影响的数据范围只有A->B
3.3 使用虚拟节点
实际应用中,服务器绑定的点可能长这个样子:
这样的话容易出现数据偏斜:A服务器承担压力太大,B和C服务器性能浪费了。
这时候就要用到虚拟节点技术:我们就给A服务器,设置三个虚拟的分身,B/C也一样
A->A1 A2 A3
B->B1 B2 B3
C->C1 C2 C3
这里只有ABC三台服务器是真正存在的,所以数据如果顺时针遇到的是A的分身服务器,则直接存储到A上。
同理,B的分身,存储到B服务器上
同理,C的分身,存储到C服务器上
四、 一致性哈希的使用场景
一致性哈希是一种在分布式系统中常用的技术,其使用场景包括但不限于以下几个方面:
-
负载均衡:一致性哈希可以用于负载均衡,将请求均匀地分布到多个服务器上,避免出现某些服务器负载过重的情况。
-
缓存分布:在分布式缓存系统中,一致性哈希可以用来确定将数据存储在哪个节点上,从而提高缓存命中率和整体性能。
-
分布式存储:一致性哈希可用于分布式存储系统中,确定数据存储在哪个节点上,提高数据的访问速度和可靠性。
-
容错性:当系统中的节点出现故障或新增节点时,一致性哈希可以帮助系统快速地重新分配数据,提高系统的容错性和可扩展性。
-
P2P 网络:在对等网络(P2P)中,一致性哈希可以帮助节点发现其他节点的位置并快速建立连接。
总的来说,一致性哈希在分布式系统中起到了路由和数据分布的作用,能够提高系统的性能和可靠性。