一致性哈希
传统方式实现数据库分区的问题
- 使用散列函数将数据转化为一个数字
- 将数字除以分区数量,取余
- 根据余数决定将数据放在哪个分区
问题: 当增加或删除节点时,所有数据需要重新映射分区,计算量很大
一致性哈希概念
- 将哈希空间组织成一个虚拟圆环
- 把服务器按照IP或主机名进行哈希,确定其在虚拟圆环中的位置
- 将数据通过哈希函数分布到圆环上
- 从数据所在位置按顺时针移动,遇到的第一个服务器节点即为该数据的存储位置
同时下n个节点也会保存上一个节点的数据副本,用于在节点故障时进行数据恢复。
当节点添加或移除时: 根据“顺时针移动规则”,只有一个节点会受到影响
虚拟节点(Vnodes)
为什么要使用虚拟节点?
- 如果节点较少,在添加或删除节点时,容易造成数据分布不均匀的情况,影响系统性能。
- 为了容错,每个节点的 数据可能会被复制到固定数量的其他节点上。当需要重建一个节点时,只有它的副本节点才能提供数据,这会给副本节点带来很大压力,并可能导致服务降级。
虚拟节点将圆环分割成更小的单位,每个真实节点对应多个虚拟节点,并且每个真实节点分到的虚拟节点通常不是连续的。
使用虚拟节点的优势
- 虚拟节点帮助物理节点更均匀地分布负载。在添加或删除物理节点后,加速了重新平衡的过程:当添加新节点时,新物理节点会从现有节点中吸收许多虚拟节点;当一个节点需要重建时,许多节点都会共同提供副本数据,减轻了节点压力
- 维护包含异构机器的集群变得更加容易。可以将更多虚拟节点分配给性能强大的服务器,将较少的虚拟节点分配给弱性能的服务器
什么场景使用一致性哈希
- 需要根据使用情况扩展或缩减存储的系统,例如:由于高流程,在节假日期间需要更多存储
- 需要根据流量负载添加或删除缓存服务器来进行动态调整的分布式系统
- 想要复制数据分片以实现高可用的系统