MC的分布式算法的实现和一些总结
首先我们知道Memcached是一个分布式的缓存系统,但memcached并不像是mongodb那样,允许配置多个节点,且节点之间是自动分配数据的
也就是说memcached节点之间,是互不相通信的,因此,memcached的分布式,要靠用户去设计算法,把数据分布在多个memcached节点中。
我们来看一下常用的分布式的算法:
1.取模算法:
最容易想到的就是取模算法,即N个节点要从0-》n-1进行编号,key对N取模,余i,则key落在第i台服务器上。
就是将server的hash值与server的总台数进行求余,即hash%N,这种方法的弊端是当增减服务器时,将会有较多的缓存需要被重新分配且会造成缓存分配不均匀的情况(有可能某一台服务器分配的很多,其它的却很少).

但我们来看一下这种算法对缓存命中率的影响:
我们假设有8台服务器,运行中突然down一台,则求余的底数变成7
我们来推算一下产生的后果:

一般地,我们从数学上归纳之:
有N台服务器,变成了N-1台服务器,
每N*(N-1)个数中,只有(n-1)个单元,%n,%(n-1)得到相同的结果
所以 命中率在服务器down的短期内,急遽下降至1/(N-1)
所以 服务器越多,则down机的后果越严重!
我们来讨论下一致性hash的算法:
通俗理解一致性哈希:
把各个服务器节点放在钟表的各个时刻上,我们将Key也映射到钟表的某个时刻上,该key沿钟表顺时针走,碰到第一个比它小的节点后,则这个key就落到这台服务器上。

疑问1:时钟上的指针最大才11点,如果我有上百个memcached节点怎么办?
答: 时钟只是为了便于理解做的比喻,在实际应用中,我们可以在圆环上分布[,^-]的数字,
这样,全世界的服务器都可以装下了. 疑问2:我该如何把”节点名”,”键名”转化成整数?
答: 你可以用现在的函数,如crc32().
也可以自己去设计转化规则,但注意转化后的碰撞率要低.
即不同的节点名,转换为相同的整数的概率要低.
好了,那我们再考虑一下当某个节点Down了之后,后产生什么样的影响?
当某个节点down后,只影响该节点顺时针之后的1个节点,而其他节点不受影响.因此,Consistent Hashing最大限度地抑制了键的重新分布

我们通过上图看到,6号节点down后,所有的压力都转移到7号节点上,造成了7号节点服务器的压力特别的大,那我们考虑是否能够将6号节点的压力注意到其余的节点上呢?
所以我们引入了虚拟节点的概念:
虚拟节点即----N个真实节点,把每个真实节点映射成M个虚拟节点, 再把M*N个虚拟节点,
散列在圆环上. 各真实节点对应的虚拟节点相互交错分布
这样,某真实节点down后,则把其影响平均分担到其他所有节点上

好了,上面就是一致性hash的理论知识点,接下来我们来考虑一下怎样实现?
下面是用php来实现的代码:
<?php
class Consistent {
protected $_nodes = array();
//生成一个数值
public function _hash($str){
return sprintf("%u",crc32($str));
}
public function find($key){
$point = $this->_hash($key);
$pos = current($this->_nodes);
foreach($this->_nodes as $k=>$v){
if($point <= $k){
$pos = $v;
break;
}
}
return $pos;
}
public function addServer($server){
for($i=1;$i<=32;$i++){
$pos = $this->_hash($server."-".$i);
$this->_nodes[$pos] = $server;
}
ksort($this->_nodes,SORT_REGULAR);
}
public function printNodes(){
print_r($this->_nodes);
}
}
$cons = new Consistent();
$cons->addServer('a');
$cons->addServer('b');
$cons->addServer('c');
echo $cons->_hash('name')."<br/>";
echo '应该落在'.$cons->find('name')."<br/>";
$cons->printNodes();
?>
MC的分布式算法的实现和一些总结的更多相关文章
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技 ...
- 图像数据到网格数据-2——改进的SMC算法的实现
概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
- 详解Linux内核红黑树算法的实现
转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
- Python学习(三) 八大排序算法的实现(下)
本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...
随机推荐
- Javascript模式(第三章字面量与构造函数)------读书笔记
一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...
- winform基本控件的使用2(用户登录界面的设计)
首先还是通过例子来讲解,这次的实验主要是使用messageBox的使用方法,关于messageBox的使用方法在我的博客里面有相关的转载,请自己查看,下面说一下实验要求. 功能要求:模拟一个用户登陆的 ...
- Python3学习之路
python基础知识点 1.python基础知识点汇总 2.python常用数据类型 3.python之列表 4.python之字符串 5.python常用数据运算符 6.python之字典 7.py ...
- windows和linux实现文件共享
linux和windows实现共享,需要安装samba服务器 安装步骤: 1.查看是否已经安装samba rpm -q samba 2.如果已经安装,如果你想再次安装,可以卸载 rpm -e samb ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- Java 技术文章摘录
sokcet 编程实例 android bundle类 Android -- Looper.prepare()和Looper.loop() —深入版 Java NIO系列教程 XML操作 Androi ...
- Tomcat7启动log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLDs.就停止不动了
环境: RHEL7,tomcat7.0.70 问题: 启动tomcat时,catalina.out日志打印到如下内容就停止不动了,也不报错 SEVERE: FarmWarDeployer can on ...
- Git学习笔记(一)
1.git clone https://github.com/miguelgrinberg/flasky.git cd flasky git checkout 1a 2.git reset --har ...
- storm 配置,呵呵。
配置项 配置说明 storm.zookeeper.servers ZooKeeper服务器列表 storm.zookeeper.port ZooKeeper连接端口 storm.local.dir s ...
- window.frame
定义和用法 frames 属性返回窗口中所有命名的框架. 该集合是 Window 对象的数组,每个 Window 对象在窗口中含有一个框架或 <iframe>.属性 frames.leng ...