Memcache分布式方案

分布式和集群区别
  • 分布式:分布式处理是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机通过通信网络连接起来,在控制系统的统一管理控制下,协调地完成大规模信息处理任务的计算机系统。简单地说,分布式处理就是多台相连的计算机各自承担同一工作任务的不同部分,在人的控制下,同时运行,共同完成同一件任务。

  • 集群:是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。简单的说,集群就是几台计算机同时部署同一个任务。

有时候一台memcached服务器不能满足我们的要求,需要布置多台服务器,但是有个问题,怎么确定一个数据应该保存到哪台服务器上边呢?

  memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能,memcached 不会互相通信以共享信息,那么,怎样进行分布式呢?这完全取决于客户端的实现。有两种方案,一种是普通Hash分布,另一种是一致性Hash分布。

一、普通Hash分布

  普通Hash函数相对简单,Hash函数如下:

function mHash($key){
   $md5 = substr(md5($key), 0, 8);
   $seed = 31;
   $hash = 0;
  
   for($i=0; $i<8; $i++){
       $hash = $hash*seed + ord($md5[$i]);
       $i++;
   }
   return $hash & 0x7FFFFFFF;
}

  首先通过md5把key处理成一个32位的字符串,取其前8个字符。在经过Hash算法处理成一个整数并返回,然后映射到其中的一台Memcached服务器。

  假如配置两台Memcache服务器,可以使用下面代码映射:

<?php
$servers = [
       ['host'=>'192.168.1.12', 'port'=>11211],
       ['host'=>'192.168.1.21', 'port'=>11211],
];
$key = 'setKeys';
$value = 'setValues';

$sc = $servers[mHash[$key] % 2];

$memcached = new Memcached($sc);
$memcache->set($key, $value);

  通过Hash函数把key转化成整数后,利用这个整数与Memcached服务器数量取模,这样得到的是其中一台服务器的配置,利用这个配置连接Memcache服务器,这样就完成了分布式布置。

二、一致性Hash分布

  在普通服务器数量不改变的时候,普通Hash分布可以很好的运作。当服务器数量发生改变时,问题就出来了,假如增加一台服务器后,同一个key经过hash之后,与服务器取模后的结果跟没增加之前不一样,这样就导致了之前保存的数据丢失,为了把丢失的数据减到最少,可以采用一致性Hash分布算法解决。
  一致性Hash算法分为6步,如下:

  1. 将一个32位整数(即0 - 2^32-1)想象成一个环,将0作为圆环的头, 2^32-1作为圆环的尾,假想把它连起来组成一个环,如图1所示:
  2. 通过Hash函数把key处理成整数。
    例如把4个key通过Hash函数处理成整数:
$key1 = mHash('key1');
$key2 = mHash('key2');
$key3 = mHash('key3');
$key4 = mHash('key4');

把key处理成整数后,就可以在环中找到一个位置与之对应,如图2所示:


01.png
  1. 把Memcached群映射到环上,使用Hash函数处理服务器IP地址。
    加入有三台memcached服务器ip为192.168.1.1, 192.168.1.4, 192.168.1.5。
$server1 = mHash('192.168.1.1');
$server2 = mHash('192.168.1.4');
$server3 = mHash('192.168.1.5');

把服务器映射到环上,经过上面几个步骤,我们把数据Key和服务器都映射到同一个环上,如图3所示:


2.png
  1. 把key映射到服务器上,沿着圆环顺时针方向的key出发,直到遇到第一个服务器位置,把key对应的数据保存在这个服务器上,key1,key4保存到server3上,key3保存到server2上,key2保存到server1上。

  2. 添加服务器
    假如现在需要添加一台服务器server4,用之前的方法得出server4的位置在key1和key4之间,这时受影响的是server4逆时针到server1之间的数据,把这些数据映射到server4上,这里仅需要变动Key1,映射到server4上即可,如图4:

  3. 移除服务器
    假如现在有一台服务器server2故障了,依照上述方法,顺时针映射,受影响的是server2逆时针到server3之间的数据,也就是key3,这里需要把key3顺时针映射到下一个服务器,也就是server1上。

后续我会用PHP实现一致性Hash分布算法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容