一致性哈希算法 虚拟节点(比一致性哈希还好的算法)

采用固定哈希算法平衡负载在大规模的缓存应用中,应运而生了分布式缓存系统。key-value如何均匀的分散到集群中?最常规的方式莫过于hash取模的方式。比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K)modN对应的机器。但是在一些高速发展的web系统中,这样的解决方案仍有些缺陷。随着系统访问压力的增长,缓存系统不得不通过增加机器节点的方式提高集群的相应速…

大家好,又见面了,我是你们的朋友全栈君。

采用固定哈希算法平衡负载

在大规模的缓存应用中,应运而生了分布式缓存系统。key-value如何均匀的分散到集群中?最常规的方式莫过于hash取模的方式。比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K) mod N对应的机器。但是在一些高速发展的web系统中,这样的解决方案仍有些缺陷。随着系统访问压力的增长,缓存系统不得不通过增加机器节点的方式提高集群的相应速度和数据承载量。增加机器意味着按照hash取模的方式,在增加机器节点的这一时刻,大量的缓存命不中,缓存数据需要重新建立,甚至是进行整体的缓存数据迁移,瞬间会给DB带来极高的系统负载,设置导致DB服务器宕机。

如果不是缓存数据,而是持久化的数据,那么当扩容的时候,绝大部分数据都要迁移(取模的基数N变化了),这也是不能忍受的。

一致性哈希平衡负载

引入一致性哈希,解决以上增减机器导致负载瞬间整体增大问题

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

但是最简单的一致性哈希,在增减物理机的时候,似乎要增加一倍节点或减去一半节点才能保证各个节点的负载均衡

虚拟节点对一致性哈希的改进

对于一致性哈希的负载分布不平均问题,所以提出:虚拟节点对一致性哈希的改进

4个物理节点可以变成很多个虚拟节点,每个虚拟节点支持连续的哈希环上的一段。而这时如果加入一个物理节点,就会相应加入很多虚拟节点,这些新的虚拟节点是相对均匀地插入到整个哈希环上,这样,就可以很好的分担现有物理节点的压力了;如果减少一个物理节点,对应的很多虚拟节点就会失效,这样,就会有很多剩余的虚拟节点来承担之前虚拟节点的工作,但是对于物理节点来说,增加的负载相对是均衡的。

所以可以通过一个物理节点对应非常多的虚拟节点,并且同一个物理节点的虚拟节点尽量均匀分布的方式来解决增加或减少节点时负载不均衡的问题。

至于一个物理节点对应多少的虚拟节点才能达到比较好的均衡效果,有一个图

c5c9681f127c270bb278a51e9804bb6f.png

x轴表示的是需要为每台物理服务器扩展的虚拟节点倍数(scale),y轴是实际物理服务器数,可以看出,当物理服务器的数量很小时,需要更大的虚拟节点,反之则需要更少的节点,从图上可以看出,在物理服务器有10台时,差不多需要为每台服务器增加100~200个虚拟节点才能达到真正的负载均衡。

映射表与规则自定义计算方式

映射表示根据分库分表字段的值的查表法来确定数据源的方法,一般用于对热点数据的特殊处理,或者在一些场景下对不完全符合规律的规则进行补充。

可以通过自定义函数实现来计算最终的分库,举例来说,假设根据id取模分成了4个库,但是对于一些热点id,我们希望将其独立到另外的库,那么通过类似下面的表达式可以完成:

if (id in hotset) {

return nodes;

}

return hash(id);

参考:

http://www.iteye.com/topic/611976

http://www.iteye.com/topic/684087

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

http://blog.csdn.net/sparkliang/article/details/5279393

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129708.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Java】一篇文章带你了解String、StringBuffer和StringBuilder的区别

    【Java】一篇文章带你了解String、StringBuffer和StringBuilder的区别String:字符串常量StringBuffer:字符串变量(多线程情况下使用,保护线程安全)synchronized:保护线程安全的StringBuilder:字符串变量(单线程情况下使用)String、StringBuffer、StringBuilder的主要区别:1.String类的内容不可以修改,而StringBuffer和StringBuilder的内容可以修改;2.StringBuffer和StringBuilder的大部分功能都是相似的;3.StringBu..

    2022年7月17日
    17
  • linux 修改文件内容命令

    linux 修改文件内容命令1、进入文件:vim文件名eg#vim/etc/httpd/httpd.conf2、查找待修改内容位置:(1)shift+“:”,使文件变成可查询状态(2)输入/+查询内容(eg查询Directory参数,即/Directory)eg找到Directory参数,注释掉Requirealldenied添加Requireallgranted3、找到位置后修改:按键盘i键即变成可编辑状态4、修改文件内容后退出:按ESC键5、保存修改:(1)shift+“:”,使

    2022年7月26日
    25
  • KDD2018《Adversarial Attacks on Neural Networks for Graph Data》 论文详解「建议收藏」

    KDD2018《Adversarial Attacks on Neural Networks for Graph Data》 论文详解「建议收藏」论文链接:https://arxiv.org/pdf/1805.07984.pdfAbstract本文介绍了第一个在属性图上进行对抗攻击的研究,特别关注利用图卷积的思想模型。除了在测试阶段进行攻击,本文进行了更具挑战的poisoningattack(聚焦于机器学习模型的训练阶段)类别。在考虑实例间依赖关系的情况下,针对节点特征和图结构进行对抗扰动(adversarialperturbation)。通过保证重要的数据特征保证扰动是不可见的(unnoticeable)。为了解决底层的离散域(disc

    2022年8月11日
    13
  • Google API 地图离线版「建议收藏」

    Google API 地图离线版「建议收藏」GoogleMapAPIV3离线版可以不在线调用GoogleMapJavaScritp的情况下,仍然可以使用GoogleMap的服务。Google地图在中国最后申请的牌照时间已经过了,仍然没有看到官方通过的说明,很有可能Google地图在7月份会被停掉,这对我们这些经常使用Google地图,或者二次开发者来说,会是一个巨大的悲哀!这对国内的地图服务商或许是一件好事,可

    2022年9月20日
    1
  • uva 10817 Headmaster's Headache 出发dp 位计算

    uva 10817 Headmaster's Headache 出发dp 位计算

    2022年1月2日
    51
  • ajax培训示例_jquery前端开发实战教程

    ajax培训示例_jquery前端开发实战教程ajax培训示例

    2022年9月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号