memache的分布式是在客户端实现的,memcache集群直接使用addServer就可以实现
测试:
两台memcache服务器192.168.20.193和192.168.20.194
192.168.20.193
cache_set.php
<?php
$mem = new Memcache();
$mem->addServer('192.168.20.193', 11211);
$mem->set("193_key", "这个值在194添加前添加的");
$mem->addServer('192.168.20.194', 11211);
if (!$mem) echo "Connection to memd failed";
$mem->set("str_key", "String to store in memd");
$mem->set("num_key", 123);
$object = new StdClass;
$object->attribute = 'test';
$mem->set("obj_key", $object);
$array = Array('assoc'=>123, 345, 567);
$mem->set("arr_key", $array);
print_r($mem->get('193_key'));
echo '<br/>';
print_r($mem->get('str_key'));
echo '<br/>';
print_r($mem->get('num_key'));
echo '<br/>';
print_r($mem->get('obj_key'));
echo '<br/>';
print_r($mem->get('arr_key'));
执行
现在停掉其中一台memcache服务如把193的memcached进程停了
[root@web_slave3 ~]# ps -ef | grep 11211
root 1492 1 0 11:45 ? 00:00:00 memcached -d -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached/memcached.pid
root 1500 1463 0 11:45 pts/0 00:00:00 grep 11211
[root@web_slave3 ~]# service memcached stop
Stopping memcached: [ OK ]
192.168.20.194上访问
cache_get.php
<?php
$mem = new Memcache();
$mem->addServer('192.168.20.193', 11211);
$mem->addServer('192.168.20.194', 11211);
if (!$mem) echo "Connection to memd failed";
print_r($mem->get('193_key'));
echo '<br/>';
print_r($mem->get('str_key'));
echo '<br/>';
print_r($mem->get('num_key'));
echo '<br/>';
print_r($mem->get('obj_key'));
echo '<br/>';
print_r($mem->get('arr_key'));
echo '<br/>';
//echo '<pre>';
print_r($memStats = $mem->getExtendedStats());exit;
192.168.20.193上访问
cache_get.php
发现停掉一台memcache服务器后,很多缓存数据丢失了,
为什么会出现这个问题?主要是hash(key)%N中的N(服务器节点)发生了变化
具体:
假如现在有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache ;
hash(object)%N ,一切都运行正常,再考虑如下的两种情况;
1 一个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache m 的对象都会失效,怎么办,需要把 cache m 从 cache 中移除,这时候 cache 是 N-1 台,映射公式变成了 hash(object)%(N-1) ;
2 由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1) ;
1 和 2 意味着什么?这意味着突然之间几乎所有的 cache 都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器;
再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的 hash 算法也做不到。
有什么方法可以改变这个状况呢,这就是memache的一致性hash算法:consistent hashing,怎么操作
参考我另外的博文:http://blog.youkuaiyun.com/nuli888/article/details/52128606