memcache 分布式,算法实现

memcached 虽然称为 “ 分布式 ” 缓存服务器,但服务器端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。 memcached 的分布式,则是完全由客户端程序库实现的。 这种分布式是 memcached 的最大特点。

分布式原理

这里多次使用了 “ 分布式 ” 这个词,但并未做详细解释。 现在开始简单地介绍一下其原理,各个客户端的实现基本相同。

下面假设 memcached 服务器有 node1 ~ node3 三台, 应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。

图 1 分布式简介:准备

首先向 memcached 中添加 “tokyo” 。将 “tokyo” 传给客户端程序库后, 客户端实现的算法就会根据 “ 键 ” 来决定保存数据的 memcached 服务器。 服务器选定后,即命令它保存 “tokyo” 及其值。

图 2 分布式简介:添加时

同样, “kanagawa”“chiba”“saitama”“gunma” 都是先选择服务器再保存。

接下来获取保存的数据。获取时也要将要获取的键 “tokyo” 传递给函数库。 函数库通过与数据保存时相同的算法,根据 “ 键 ” 选择服务器。 使用的算法相同,就能选中与保存时相同的服务器,然后发送 get 命令。 只要数据没有因为某些原因被删除,就能获得保存的值。

图 3 分布式简介:获取时

这样,将不同的键保存到不同的服务器上,就实现了 memcached 的分布式。 memcached 服务器增多后,键就会分散,即使一台 memcached 服务器发生故障 无法连接,也不会影响其他的缓存,系统依然能继续运行。

分布式算法

缓存系统中应用比较多的是余数计算分散和一致性 HASH 计算分散。

余数计算分散

原理

余数计算分散法简单来说,就是 “ 根据服务器台数的余数进行分散 ” 。

1.       求得传入键的整数哈希值( int hashCode )。

2.       使用计算出的 hashCode 除以服务器台数 (N) 取余数( C=hashCode % N )

3.       在 N 台服务器中选择序号为 C 的服务器。

特点

余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。 那就是当添加或移除服务器时,缓存重组的代价相当巨大。 添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器, 从而影响缓存的命中率。

Consistent Hashing

算法

一致性 HASH 算法我的理解,简单来说就是 , 在一个大的数据范围内的构建一个虚拟的环,首( 0 )尾(Integer.MAXVALUE )相接的圆环,然后通过 某种 HASH 算法 增加虚拟节点的方式( 1 个实体节点可以虚拟 N个虚拟阶段,如 160 , 200 , 1000 等)让节点更为均匀的分别在环上。 KEY 请求的时候,也通过相同的某种HASH 算法 计算出 HASH 值,然后在在到环上定位同向最接近的虚拟节点,最后通过虚拟节点与实体节点的对应关系找到服务的实体节点。

网上介绍很多,图也多,不想在截取了。那就给个连接:

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

另外公司现有的项目中也使用 Consistent Hashing 用于分表定位,缓存定位等。工程项目中也有先关算法的实现。

特点

1. 算法实现比较麻烦,需要构建虚拟环。

2. 解决了余数算法增加节点命中大幅额度降低的问题,理论上,插入一个实体节点,平均会影响到:虚拟节点数/2 的节点数据的命中

时间: 2024-10-11 11:46:18

memcache 分布式,算法实现的相关文章

memcache分布式 [一致性hash算法] 的php实现

最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是为了解决这个问题,把失效数据降到最低,相关资料可以google一下! php实现效率有一定的缺失,如果要高效率,还是写扩展比较好经测试,5个memcache,每个memcache生成100个虚拟节点,set加get1000次,与单个memcache直接set加get慢5倍,所以效率一般,有待优化!实

【转载】memcache分布式 [一致性hash算法] 的php实现

最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是为了解决这个问题,把失效数据降到最低,相关资料可以google一下! php实现效率有一定的缺失,如果要高效率,还是写扩展比较好经测试,5个memcache,每个memcache生成100个虚拟节点,set加get1000次,与单个memcache直接set加get慢5倍,所以效率一般,有待优化!实

Memcache Hash算法揭秘

 序 在大型互联网应用架构中,通常由多台Memcache缓存服务器来构建Memcache集群,也叫做分布式Memcache.数据在写入缓存和从缓存中读取时,都会采用某中Hash算法,将数据Hash到某台具体的Memcache上,为了使应用在线的动态增加和移除Memcache服务器而不影响或很少影响其他已部署的Memcache服务器(也就是其他Memcache服务器中缓存的数据还能正常使用),这种Hash算法被称作为一致性Hash. 由一篇文章---Memcache分布式实现原理我们知道,Ja

memcache分布式 存取

Memcached分布式 Memcached虽然称为“分布式“缓存服务器,但服务器端并没有“分布式”的功能.Memcached的分布式完全是有客户端实现的.memcached是怎么实现分布式缓存的呢? 例如下面假设memcached服务器有node1-node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据. 首先向memcached中添加“tokyo”.将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保

memcache分布式部署的原理分析

下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦. 今天在封装memcache操作类库过程中,意识到一直以来对memcache的使用都是局限在单台服务器的情况下,还没有使用到memcache的分布式部署.虽然知道memcache的分布式是怎么回事,但是为了更加深入的理解,还是通过谷歌搜索了这方面的相关资料. 下面是精摘于网络的一些关于 memcache分布式部署 的资料. memcache分布式部署是什么呢?下面通过一个例子

MemCache分布式缓存的一个bug

Memcached分布式缓存策略不是由服务器端至支持的,多台服务器之间并不知道彼此的存在.分布式的实现是由客户端代码(Memcached.ClientLibrary)通过缓存key-server映射来实现的,基本原理就是对缓存key求hash值,用hash值对服务器数量进行模运算,该key值被分配到模运算结果为索引的那台server上. Memcached.ClientLibrary对缓存key计算hashcode的核心算法如下: 1 /// <summary> 2 /// Returns a

Memcache 分布式解决方案 之 : 普通 Hash 分布

<?php /* mhash * 其实说白了,就是为了实现返回0或1 */ function mmhash($key){ $md5 = substr(md5($key),0,8);//取该字符串的md5后的前八位 $seed = 31;//设置步长 $hash = 0;//初始值 for($i=0;$i<8;$i++){ $hash = $hash * $seed + ord($md5{$i});//ASCII 累乘 } return ($hash & 0x7FFFFFFF) % 2;

memcache分布式小实例

<?php /** * 分布式的 memcache set 实现 */ /** * 创建缓存实现memcache 添加分布式服务器 并设置权限 */ function createCache() { $arr = array( array("host" => "127.0.0.1", "port" => 11211, "weight" => 20), //127.0.0.1:11211的权重是20% a

memcache 分布式缓存

转载地址:http://www.cnblogs.com/phpstudy2015-6/p/6713164.html 作者:那一叶随风 1.memcached分布式简介 memcached虽然称为"分布式"缓存服务器,但服务器端并没有"分布式"功能.Memcache集群主机不能够相互通信传输数据,它的"分布式"是基于客户端的程序逻辑算法进一步实现的. 请看下面简图: 根据上图我们简述分析分布式memcached的set与get的过程 set过程: