Memcached集群

为了提供更好的性能,生产上不论是数据库还是应用服务器都会是多个。配置了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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值