Memcached集群

来源:互联网 发布:淘宝网落地晒衣架 编辑:程序博客网 时间:2024/05/22 01:45

为了提供更好的性能,生产上不论是数据库还是应用服务器都会是多个。配置了Memcached的服务器称为Memcached服务器因此也可能是多个:形成集群。

有趣的是,集群内的Memcached服务器之间是互不通信的,每个Memcached服务器并不知道其他Memcached服务器的存在,是客户端将他们在逻辑上组成了一个集群,因此向集群中新增加一台Memcached服务器也仅需要在客户端程序上(如php脚本)添加(配置)新增服务器的信息即可。

集群服务器在客户端被维护成一个列表,客户端轮询访问,如果查找某个key不在第一个服务器,就向第二个服务器发起请求,如果有则返回,如果没有则向第三个发起….直到列表中的最后一个服务器。若在集群中所有服务器上均没搜索到相关信息,则再查找数据获取相关信息,这样就大大降低了数据库的负载。

上述访问机制使得Memcached服务器间的共享了内存,集群内的机器的内存相当于拼接到了一起,数据库中常被访问的热点信息(被高频查询的信息)就可以均匀的分布到集群内的服务器上。

做个实验,集群中有三台服务器,分别执行三个逻辑:

  1. 服务器1:如果key=weather的数据存在则展示,不存在则查询数据库后(代码中省略数据库操作)存入Memcached
  2. 服务器2:如果key=fruit的数据存在则展示,不存在则查询数据库后(代码中省略数据库操作)存入Memcached
  3. 服务器2:如果key=animal的数据存在则展示,不存在则查询数据库后(代码中省略数据库操作)存入Memcached

三个服务器脚本均接受GET参数作为key值查询,如果没有GET参数,则分别以上面定义的weather、fruit、animal查询。
服务器上的脚本仅仅是默认的key和value不同,分别为weather/Sunny、fruit/Banana、animal/Monkey,下面仅给出服务器1上的脚本。

<?php$memcached = new Memcached;$hosts = array(    array('192.168.109.129',11211),    array('192.168.109.131',11211),    array('192.168.109.133',11211));$memcached->addServers($hosts);$defaultKey = 'weather';if(isset($_GET['key'])){        $key = $_GET['key'];}else{    $key = $defaultKey;}if(($value = $memcached->get($key))!=FALSE){        echo "Value of $key is ".$value.', Now is: '.date('Y-m-d H:m:s');}else{    echo 'No value with key "'.$key.'" is found by Memcached!<br/>';    if(!isset($_GET['key'])||$_GET['key']==$defaultKey)    {        echo 'Write it to Memcached!<br/>';            $value = 'Sunny';            $result = $memcached->set($key,$value,120);        if($result == TRUE)        {            echo 'Value with key "'.$key.'" is Stored!<br/>';            echo 'Now is: '.date('Y-m-d H:m:s');        }           else        {            echo 'Failed to store with error code:'.$memcached->getResultCode().'!';        }    }}?>

初始时,由于Memcached没有被任何脚本放入key是weather、fruit和animal的数据,因此都是找不到的。当服务器1和2上的脚本均被执行后,集群的内存中就加入weather和fruit,在1或2上均可以访问到weather和fruit的值,但是访问不到animal的值。当服务器3的脚本被执行后,annimal的值就可以被三台服务器中的任意一台访问到了。

服务器1上找不到key是weather的数据:
服务器1上找不到key是weather的数据
服务器2上找不到key是fruit的数据:
服务器2上找不到key是fruit的数据
服务器1上可以找到key是fruit的数据,这个数据实际是在服务器2上的:
服务器1上可以找到key是fruit的数据
服务器2上可以找到key是fruit的数据:
服务器2上可以找到key是fruit的数据
服务器1上找不到key是animal的数据:
服务器1上找不到key是animal的数据
服务器2上也找不到key是animal的数据:
服务器2上也找不到key是animal的数据
服务器3上也找不到key是animal的数据,但马上写入:
服务器3上也找不到key是animal的数据,但马上写入
服务器1上可以找到key是animal的数据:
服务器1上可以找到key是animal的数据
服务器2上可以找到key是animal的数据:
服务器2上可以找到key是animal的数据

1 0
原创粉丝点击