博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式的两种算法
阅读量:5245 次
发布时间:2019-06-14

本文共 728 字,大约阅读时间需要 2 分钟。

 1.取模算法

这种算法非常的简单,就是根据服务器台数的余数进行分散,求得整数值的hash值,再除以服务器的台数,根据其余数来选择服务器,将server的hash值与server的总台数进行求余,即hash%N。

但是在这种算法对缓存命中率的影响下:

我们假设有8台服务器,运行中突然down了一台,则求余的底数变成了7,那么其产生的结果就完全变了

一般地,我们从数学上归纳之:

有N台服务器,变成了N-1台服务器,所以命中率在服务器down的短期内,急剧下降至1/(N-1),所以服务器越多,则down机的后果越严重

2.一致性hash算法

为了解决上述取模算法遇到的问题,我们可以使用另一种分布式算法,即一致性hash算法,所谓的一致性hash算法,就是把服务器的各个节点放在钟表的各个时刻上,同时,我们也将要存储的key也映射到钟表的某个时刻上,该key延钟表顺时针走,碰到第一个比他小的节点之后,则key就落在这台服务器上

补充:利用crc32()函数可以将key值转换成整数

当某个节点down后,只影响该节点顺时针之后的1个节点,而其他节点不受影响

我们通过上图看到,6号节点down后,所有的压力都转移到7号节点上,造成了7号节点服务器的压力特别的大,那我们考虑是否能够将6号节点的压力注意到其余的节点上?

所以我们引入了虚拟节点的概念:

虚拟节点-N个真实节点,把每个真实节点映射成M个虚拟节点, 再把M*N个虚拟节点,散列在圆环上. 各真实节点对应的虚拟节点相互交错分布,这样某个真实节点down后,则把其影响平均分担到其他所有节点上

 

转载于:https://www.cnblogs.com/angelyan/p/10852609.html

你可能感兴趣的文章
Python-PyQt4学习资料汇总
查看>>
iOS:苹果推送----推送证书的生成
查看>>
1.1 Java 的概述
查看>>
如何判断单链表是否有环,如果有怎么找到进入环的节点
查看>>
Java学习之杨辉三角
查看>>
设计软件AI学习体会及图片
查看>>
jQuery开发者眼中的AngularJS
查看>>
SpringMVC中使用Interceptor拦截器
查看>>
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
查看>>
在Django中使用ORM创建图书管理系统
查看>>
高性能Javascrip 改变作用域链
查看>>
react面试宝典
查看>>
电脑上的windows键突然失灵了,肿么办
查看>>
linux命令:返回上一次目录
查看>>
利用 Chrome 原生工具进行网页长截图
查看>>
UVa LA 4254 - Processor 二分,贪心 难度: 1
查看>>
ANDROID笔记:利用XML布局文件生成Menu
查看>>
常用数据结构图--拓扑排序
查看>>
Oracle学习之buffer cache(copy过来的文本,待补充笔记)
查看>>
基数排序——浮点数结构体进阶
查看>>