首页 > 编程知识 正文

一致性hash 虚拟节点,一致性hash算法实现

时间:2023-05-05 04:28:35 阅读:165371 作者:1135

采用固定yhdxf算法实现负载平衡

在大规模的缓存APP中,分布式缓存系统应运而生。 key-value如何均匀分布在集群中? 最常见的方法不是hash的取模方式。 例如,假设在群集中可用的计算机的适量为n,则key值为k的数据请求应该简单地路由到与hash[k]modn对应的计算机。 但是,这种解决方案在快速发展的一些web系统中还存在一些缺点。 随着系统访问压力的加大,缓存系统必须通过增加机器节点来提高集群的响应速度和数据负载量。 增加机器意味着,在增加机器节点时,会发生大量的高速缓存错误,需要重建高速缓存数据,就像在hash模式下一样。 此外,迁移整体缓存数据会瞬间对数据库造成非常高的系统负载,并且数据库服务器会因设置而停机。

对于永久数据而不是缓存数据,在扩展容量时,大多数数据都将迁移。 这个也受不了。

一致的yhdxf平衡负载

通过引入一致性yhdxf,解决了上述设备增减导致的负荷瞬间整体增大的问题

通过在整数范围内负责各区域的方式,节点不会随着节点负责区域的负荷的增减而大规模迁移

但是,在最简单的一致性yhdxf中,增减物理机时,似乎必须将节点加倍或减半,才能保证各节点的负荷分散

改进的虚拟节点一致性yhdxf

针对一致性yhdxf负载分布不均匀的问题,提出了基于虚拟节点对一致性yhdxf的改进

四个物理节点是许多虚拟节点,每个虚拟节点支持连续yhdxf环上的段。 此时,添加物理节点时,将相应地添加更多的虚拟节点,这些新虚拟节点将相对均匀地插入整个yhdxf环中,以便更好地分担现有物理节点的压力。 减少一个物理节点将禁用许多对应的虚拟节点。 这样,虽然留下了很多虚拟节点来承担以前的虚拟节点的工作,但对物理节点来说,增加的负载相对平衡。

因此,一个物理节点对应非常多的虚拟节点,且同一物理节点的虚拟节点尽量均衡分布,可以解决增加和减少节点时的负载不均衡问题。

一个物理节点对应多少虚拟节点才能获得更好的均衡效果,这一点很有条理。

x轴表示每个物理服务器需要扩展的虚拟节点的倍数(scale ),y轴是实际的物理服务器数量。 可以看出,在物理服务器数量较少的情况下,需要更大的虚拟节点,而相反,需要更少的节点。 从图中可以看出,如果有10台物理服务器,则必须向每台服务器添加100~200个虚拟节点才能实现真正的负载平衡。

映射表和规则的自定义计算方法

映射表示基于存储库表字段值的查找表方法确定数据源的方式,通常用于热点数据的特殊处理,以及对某些场景中不完全符合规则的规则的补充。

可以通过定制函数实现来计算最终的库。 例如,假设基于id模板划分为四个库。 但是,一些热点id可能希望独立于其他库。 可以用以下公式执行:

if (身份热集) {

返回节点;

}

返回散列(id;

参考:

33558 www.iteye.com/topic/611976

33558 www.iteye.com/topic/684087

《大型网站系统与Java中间件实践》

3358 blog.csdn.net/spark Liang/article/details/5279393

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。