转载地址:http://www.cnblogs.com/phpstudy2015-6/p/6713164.html
作者:那一叶随风
1、memcached分布式简介
memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算法进一步实现的。
请看下面简图:
根据上图我们简述分析分布式memcached的set与get的过程
set过程:
1、首先通过应用程序set(‘key’,’value’)
2、进入程序,使用key通过逻辑算法得出这个key需要存储的节点位置
3、根据节点位置连接相应的memcached服务器,并发送set命令
get过程:
1、首先通过应用程序get(‘key’)
2、接着使用该key通过逻辑算法获取该key的存储节点
3、根据节点连接相应的memcached服务器,并发送get命令
实现memcached有很多种方式,其中最常用的就是一致哈希思想的分布式(就简称为一致哈希分布式啦)。好的东西当然需要次劣品来衬托它的优点啦,因此在这里除了讲解一致哈希分布式,还会讲到取模分布式。从而进一步分析他们的优缺点。
这里的例子都会采用PHP代码实现,当然啦,最重要的是思想与方法嘛!毕竟这两样东西在任何语言中都是相通的。
2、取模算法方式
何为取模算法方式分布式?就是将key转换为32位的数字,并与memcached服务器的总数进行相除取得余数。而这个余数就是memcached服务器的节点node。有了这个node我们就可以确定memcached服务器,就可以发送命令给memcached执行了。
图示解析:
整个过程上图所示。
1)、PHP代码实现
GetModMemcache.class.php
1 <?php
2 #分布式memcache(取模计算)
3 class GetModMemcache
4 {
5 private $total=‘‘; #存储memcache服务器的总数
6 private $servers=array(); #存储memcache服务器的具体信息
7 /**
8 * @desc 构造函数
9 *
10 * @param $serversArr array | memcache服务器具体信息
11 */
12 public function __construct($serversArr)
13 {
14 $this->total=count($serversArr);
15 $this->servers=$serversArr;
16 }
17
18 /**
19 * @desc 计算$key的存储位置(即哪个服务器)
20 *
21 * @param string | key字符串
22 *
23 * @return int 返回第几个服务器
24 */
25 protected function position($key)
26 {
27 #使用crc32(),将字符串转化为32为的数字
28 return sprintf(‘%u‘,crc32($key))%$this->total; #取余
29 }
30
31 /**
32 * @desc 获取memcached对象
33 *
34 * @param $position int | key的位置信息
35 *
36 * @return object 返回实例化memcached对象
37 */
38 protected function getMemcached($position)
39 {
40 $host=$this->servers[$position][‘host‘]; #服务器池中某台服务器host
41 $port=$this->servers[$position][‘port‘]; #服务器池中某台服务器port
42 $m= new memcached();
43 $m->addserver($host, $port);
44 return $m;
45 }
46
47 /**
48 * @desc 设置key-value值
49 *
50 * @param string | key字符串
51 * @param mixed | 值可以是任何有效的非资源型php类型
52 *
53 * @return 返回结果
54 */
55 public function setKey($key, $value)
56 {
57 $num=$this->position($key);
58 echo $num; #调试用
59 $m=$this->getMemcached($num); #获取memcached对象
60 return $m->set($key, $value);
61 }
62
63 public function getKey($key)
64 {
65 $num=$this->position($key);
66 $m=$this->getMemcached($num);
67 return $m->get($key);
68 }
69
70
71 }
72
73
74 $arr=array(
75 array(‘host‘=>‘192.168.95.11‘, ‘port‘=>‘11210‘),
76 array(‘host‘=>‘192.168.95.11‘, ‘port‘=>‘11211‘),
77 array(‘host‘=>‘192.168.95.11‘, ‘port‘=>‘11212‘),
78 );
79 $mod=new GetModMemcache($arr);
80
81 /*
82 #存储数据
83 $a=$mod->setKey(‘key3‘, ‘key33333‘);
84 echo "<pre>";
85 print_r($a);
86 echo "</pre>";die;
87 */
88 /*
89 #获取数据
90 $b=$mod->getKey(‘key1‘);
91 echo "<pre>";
92 print_r($b);
93 echo "</pre>";die;
94 */
95 ?>
2)、进行相应测试
1、连续插入三个数据
#set(‘key1’,’value11111’); #node=1
#set(‘key2’,’value22222’); #node=1
#set(‘key3’,’value33333’;) #node=0
2、分别telnet连接192.168.95.11:(11210、11211、11212)
11210含有key3数据
11211含有key1、key2数据
11212不含数据
3、使用程序get数据
结果都能够将数据取出来
3)、优缺点
优点:
1、简单实用易理解
2、数据分布均匀
缺点:
1、宕了一台memcached服务器时不能自动调整群组去处理数据,使一部分数据不能使用缓存,一直持续从数据库中获取数据。
2、当需要扩容的时候,增加多台memcached服务器,那么原来已