Memcached常规应用与分布式部署方案

1、Memcached常规应用

$mc = new Memcache();
$mc->conncet(‘127.0.0.1‘, 11211);
$sql = sprintf("SELECT * FROM users WHERE uid = %d", $_GET[‘uid‘]);
$key = md5($sql);
//检测结果是否已经被缓存
if( ! $data = $mc->get($key)){
    //没有缓存则直接从数据库读取
    mysql_conncet(‘localhost‘, ‘test‘, ‘test‘);
    mysql_select_db(‘test‘);
    while($row = mysql_fetch_object(mysql_query($sql))){
        $data[] = $row;
    }
    //并将查询结果缓存
    $mc->add($key, $data);
}
var_dump($data);

说明:首先通过md5()将SQL语句转化成一个唯一的KEY,并用此KEY查询Memcached检测是否已经缓存,是的话在直接返回结果,否则先查询数据库再缓存,并返回结果。这样,下次使用此KEY就可以直接返回结果了。

2、Memcached分布式部署方案,对于多台Memcached服务器,怎么确定一个数据应该保存到哪台服务器呢?有两种方案,一是普通Hash分布,二是一致性Hash分布。下面详细说明。

方案一:简单的取模运算

<?php

//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;
}
//假设有2台Memcached服务器
$servers = array(
    array(‘host‘ => ‘192.168.1.1‘, ‘port‘ => 11211),
    array(‘host‘ => ‘192.168.1.1‘, ‘port‘ => 11211)
);
$key = ‘MyBlog‘;
$value = ‘http://www.cnblogs.com/gide‘;
$sc = $servers[mHash($key) % 2];
$memcached = new Memcached($sc);
$memcached->set($key, $value);

说明:首先通过MD5函数把KEY处理成32位字符串,然后截取前8位,再经过Hash算法处理成一个整数并返回。利用这个整数与Memcached服务器数量取模,决定当前KEY存储于哪台Memcached服务器,就完成了Memcached的分布式部署。可想而知,当要读取KEY的值时,依然是先要通过Hash算法判断存储于哪台服务器

方案二:一致性hash部署

<?php

class FlexiHash{
    //服务器列表
    private $serverList = array();
    //记录是否已经排序
    private $isSorted = FALSE;
    //添加一台服务器
    public function addServer($server){
        $hash = $this->mHash($server);
        if(!isset($this->serverList[$hash])){
            $this->serverList[$hash] = $server;
        }
        //需要重新排序
        $this->isSorted = FALSE;
        return TRUE;
    }
    //移除一台服务器
    public function removeServer($server){
        $hash = $this->mHash($server);
        if(isset($this->serverList[$hash])){
            unset($this->serverList[$hash]);
        }
        //需要重新排序
        $this->isSorted = FALSE;
        return TRUE;
    }
    //在当前服务器列表查找合适的服务器
    public function lookup($key){
        $hash = $this->mHash($key);
        //先进行倒序排序操作
        if(!$this->isSorted){
            krsort($this->serverList, SORT_NUMERIC);
            $this->isSorted = TRUE;
        }
        //圆环上顺时针方向查找当前KEY紧邻的一台服务器
        foreach($this->serverList as $pos => $server){
            if($hash >= $pos)    return $server;
        }
        //没有找到则返回顺时针方向最后一台服务器
        return $this->serverList[count($this->serverList) - 1];
    }
    //Hash函数
    private 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;
    }
}
?>

说明:一致性Hash分布算法分4个步骤:
步骤1:将一个32位整数[0 ~ (2^32-1)]想象成一个环,0 作为开头,(2^32-1) 作为结尾,当然这只是想象。
步骤2:通过Hash函数把KEY处理成整数。这样就可以在环上找到一个位置与之对应。
步骤3:把Memcached服务器群映射到环上,使用Hash函数处理服务器对应的IP地址即可。
步骤4:把数据映射到Memcached服务器上。查找一个KEY对应的Memcached服务器位置的方法如下:从当前KEY的位置,沿着圆环顺时针方向出发,查找位置离得最近的一台Memcached服务器,并将KEY对应的数据保存在此服务器上。

具体应用:

<?php
$hserver = new FlexiHash();
//初始5台服务器
$hserver->addServer("192.168.1.1");
$hserver->addServer("192.168.1.2");
$hserver->addServer("192.168.1.3");
$hserver->addServer("192.168.1.4");
$hserver->addServer("192.168.1.5");
echo "save key1 in server: ", $hserver->lookup(‘key1‘), "<br/>";
echo "save key2 in server: ", $hserver->lookup(‘key2‘), "<br/>";
echo ‘===============================================<br/>‘;
//移除1台服务器
$hserver->removeServer("192.168.1.4");
echo "save key1 in server: ", $hserver->lookup(‘key1‘), "<br/>";
echo "save key2 in server: ", $hserver->lookup(‘key2‘), "<br/>";
echo ‘===============================================<br/>‘;
//添加1台服务器
$hserver->addServer(‘192.168.1.6‘);
echo "save key1 in server: ", $hserver->lookup(‘key1‘), "<br/>";
echo "save key2 in server: ", $hserver->lookup(‘key2‘);
?>
//测试结果如下:
save key1 in server: 192.168.1.4
save key2 in server: 192.168.1.2
==================================
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.2
==================================
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.2

不过Memcached自带了addServer

Memcached::addServer — 向服务器池中增加一个服务器
public bool Memcached::addServer ( string $host , int $port [, int $weight = 0 ] )
host
memcached服务端主机名。如果主机名无效,相关的数据操作的返回代码将被设置为Memcached::RES_HOST_LOOKUP_FAILURE。

port
memcached服务端端口号,通常是11211。

weight
此服务器相对于服务器池中所有服务器的权重。此参数用来控制服务器在操作时被选种的概率。这个仅用于一致性 分布选项,并且这个值通常是由服务端分配的内存来设置的。

成功时返回 TRUE, 或者在失败时返回 FALSE。

<?php
$m = new Memcached();

$m->addServer(‘mem1.domain.com‘, 11211, 33);
$m->addServer(‘mem2.domain.com‘, 11211, 67);

完毕!

时间: 2024-10-09 21:06:50

Memcached常规应用与分布式部署方案的相关文章

异地分布式部署方案

应用环境 异地部署方案适合以下情况的企业: 1)公司有不同分支机构或较小的分散站点与公司总部的网络连接通常是低带宽.高滞后或不可靠的. 2)公司总部网络无法处理中心位置的服务流量. 3)分支机构有自己的服务器.企业网络.域控制器和系统管理员,包含数目不定的用户. 4)用户要求有更快的邮箱访问速度.更佳的用户体验和可用性. 在异地部署方案中,操作系统和邮件服务器都放在本地. 网络拓扑图 不同地区的服务器使用相同的域名,不同的服务器之间的用户名不允许相同.下图为三地的异地分布式部署图: 工作原理 1

Zabbix监控和分布式部署实施方案

最近在研究Zabbix监控,由于机房分布在多个城市,因此采用zabbix proxy做为监控方案,在每 个节点部署zabbix proxy,由zabbix proxy收集agentd数据,然后将采集到的数据主动推送给zabbix server,zabbix server将数据存入数据库,并在WEB前端显示. 1.Zabbix主要功能和优劣势说明 1.1 Zabbix主要功能: 1)Application monitoring 应用监控 数据库/SSH/Apache/Nginx等应用程序的监控.

可扩容分布式session方案

分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器io限制,不能满足高并发. 2. 基于关系数据库的session共享 这种方案普遍使用.使用关系数据库存储session数据,对于mysql数据库,建议使用heap引擎. 这种方案性能取决于数据库的性能,在高并发下容易造成表锁(虽然可以采用行锁的存储引擎,性能会下降),并且需要自己实现session过

ActiveMQ实现负载均衡+高可用部署方案

一.架构和技术介绍 1.简介 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现 2.activemq的特性 1. 多种语言和协议编写客户端.语言: Java, C, C++, C#, Ruby, Perl, Python, PHP.应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP 2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息

ActiveMQ实现负载均衡+高可用部署方案(转)

本文转自:http://www.open-open.com/lib/view/open1400126457817.html%20 一.架构和技术介绍 1.简介 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 2.activemq的特性 1. 多种语言和协议编写客户端.语言: Java, C, C++, C#, Ruby, Perl, Python, PHP.应用协议: OpenWire,Stomp

Apache Spark探秘:三种分布式部署方式比较

目前Apache Spark支持三种分布式部署方式,分别是standalone.spark on mesos和 spark on YARN,其中,第一种类似于MapReduce 1.0所采用的模式,内部实现了容错性和资源管理,后两种则是未来发展的趋势,部分容错性和资源管理交由统一的资源管理系统完成:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架,比如MapReduce,公用一个集群资源,最大的好处是降低运维成本和提高资源利用率(资源按需分配).本文将介绍这三种部署方式,并比

项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXin(开源的微信开发SDK)开发的一款微信应用类系统,主要业务是围绕当下流行的微信元素,如:微官网.微商城.微分销.营销活动.会员卡等. 关于RabbitHub详情请戳: .NET 平台下的插件化开发内核(Rabbit Kernel) RabbitHub开源情况及计划 关于Rabbit.WeiXin详

memcache分布式部署的原理分析

下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦. 今天在封装memcache操作类库过程中,意识到一直以来对memcache的使用都是局限在单台服务器的情况下,还没有使用到memcache的分布式部署.虽然知道memcache的分布式是怎么回事,但是为了更加深入的理解,还是通过谷歌搜索了这方面的相关资料. 下面是精摘于网络的一些关于 memcache分布式部署 的资料. memcache分布式部署是什么呢?下面通过一个例子

LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案

方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor=50 worker.tomcat.cachesize=10 worker.tomcat.cache_timeout=600 worker.tomcat.socket_keepalive=1 worker.tomcat.socket_timeout=300 Linux内核优化: vi /etc/sysctl.conf   # 编辑sysctl.conf文件添加以下内容net.