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

采用固定哈希算法平衡负载在大规模的缓存应用中,应运而生了分布式缓存系统。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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ideatomcat日志乱码_tomcat 日志

    ideatomcat日志乱码_tomcat 日志1、tomacat日志有三个地方,分布时Output(控制台)、TomcatLocalhostLog(tomcat本地日志)、TomcatCatalinaLog。启动日志和大部分报错日志、普通日志都在output打印;有些错误日志,在TomcatLocalhostLog。三个日志显示区,都可能出现乱码现象。2、解决方案一:首先,找到本地tomcat的conf目录下的logging.properties,这个文件中有5个编码的位置1)对于控制台output报错的情况,将下图位置

    2022年9月26日
    0
  • 人脸识别之表情识别(二)–基于CNN分类「建议收藏」

    说白了,就是个分类任务,但是纯粹的CNN分类,只是对传统方式的提升,本质思路没有改变,效果也不是很明显。转自:https://blog.csdn.net/walilk/article/details/58709611前言  [机器学习]实验笔记系列是以我在算法研究中的实验笔记资料为基础加以整理推出的。该系列内容涉及常见的机器学习算法理论以及常见的算法应用,每篇博客都会介绍实验相关的数…

    2022年4月1日
    126
  • matlab as(assert dominance)

    目录一.语法1.输入参数二.说明三.示例1.值在预期范围之内2.期望的数据类型3.预期的代码执行情况assert是条件为false时引发错误。一.语法assert(cond)assert(cond,msg)assert(cond,msg,A1,…,An)assert(cond,errID,msg)assert(cond,errID,msg,A1,…,An)1.输入参数cond-断言条件MATLAB表达式..

    2022年4月15日
    40
  • 浅谈时间轮算法[通俗易懂]

    浅谈时间轮算法[通俗易懂]时间轮在计算机世界中,只有待解决的问题变得大规模后,算法的价值才能够最大化的体现。时间轮算法可以将插入和删除操作的时间复杂度都降为O(1),在大规模问题下还能够达到非常好的运行效果。如果我们要实现一个定时任务该如何实现呢?最简单的方式就是使用一个任务队列来完成定时任务。具体实现细节下面详细展开。

    2022年9月27日
    0
  • mysql 查看函数fsync_fsync()函数 Unix/Linux「建议收藏」

    mysql 查看函数fsync_fsync()函数 Unix/Linux「建议收藏」fsync,fdatasync-同步文件在内核态与存储设备内容简介#includeintfsync(intfd);intfdatasync(intfd);描述fsync()transfers(“flushes”)allmodifiedin-coredataof(i.e.,modifiedbuffercachepagesfor)thefilereferre…

    2022年5月18日
    45
  • 关于nginx的五大面试题_vue面试题大全

    关于nginx的五大面试题_vue面试题大全1、你近期使用过的Nginx的版本?生产环境使用Stableversion:最新稳定版注意各版本的区别:Nginx官网提供了三个类型的版本1、Mainlineversion:Mainline是Nginx目前主力在做的版本,可以说是开发版2、Stableversion:最新稳定版,生产环境上建议使用的版本3、Legacyversions:遗留的老版本的稳定版2、Nginx…

    2022年8月29日
    1

发表回复

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

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