`
jiagou
  • 浏览: 2534814 次
文章分类
社区版块
存档分类
最新评论

memcache分布式实现、memcache分布式的数据同步、memcache保存session数据的实现

 
阅读更多

Memcache的分布式介绍

memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端仅包括内存存储功能,其实现非常简单。至于memcached的分布式,则是完全由客户端程序库实现的。这种分布式是memcached的最大特点。

Memcached的分布式是什么意思?

这里多次使用了“分布式”这个词,但并未做详细解释。现在开始简单地介绍一下其原理,各个客户端的实现基本相同。

下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma”的数据。

1 分布式简介:准备

首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。

2 分布式简介:添加时

同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

3 分布式简介:获取时

这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

Php+memcache实现分布式

我们PHPPECL中的Memcache扩展能够有效的解决Memcache的分布式问题,主要的接口就是 addServer() 函数,具体关于addServer()函数的实现可以参考该扩展源代码。那么现在就存在第二个问题,就是说无法同步数据,可以理解为MySQLMaster/Slave的机制,就是说如果我们有多台的Memcache服务器,使用addServer函数的话,每个服务器存储的数据都是唯一的,也就是说每个memcached服务器上存储的数据不是统一的,而是各自保存了不通的数据。

配置使用memcache存储session数据

session.save_handler = memcache

session.save_path ="tcp://127.0.0.1:11211"

或者某个目录下的 .htaccess

php_value session.save_handler"memcache"

php_value session.save_path "tcp://127.0.0.1:11211"

再或者在某个一个应用中:

ini_set("session.save_handler","memcache");

ini_set("session.save_path","tcp://127.0.0.1:11211");

使用多个 memcached server 时用逗号","隔开,并且和Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent""weight""timeout""retry_interval"等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2"

session

<?php

session_start();

if (!isset($_SESSION['TEST'])) {

$_SESSION['TEST'] = time();

}

$_SESSION['TEST3'] = time();

print $_SESSION['TEST'];

print "<br><br>";

print $_SESSION['TEST3'];

print "<br><br>";

print session_id();

?>

memcache中取回session数据

<?php

$memcache = memcache_connect('localhost',11211);

var_dump($memcache->get('19216821213c65cedec65b0883238c278eeb573e077'));

?>

会有看到

string(37)"TEST|i:1177556731;TEST3|i:1177556881;"

这样的输出,证明 session 正常工作

memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。

另外,WS Memcached Session Handler for PHP 提供一种用session_set_save_handler 来利用 memcached 的方法。。

Linux下的Memcache安装

1.如果通过下载源码进行安装,则需要下载最新版本http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz

如果通过apt-get方式安装,则无需下载。

2.进行memcache的安装:

1).下载源码,进行编译安装

Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz,如果你的系统已经安装了libevent,则不需要安装。

# cd /tmp

# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz

# wgethttp://www.monkey.org/~provos/libevent-1.2.tar.gz

2.先安装libevent:

# tar zxvf libevent-1.2.tar.gz

# cd libevent-1.2

# ./configure --prefix=/usr

# make

# make install

测试libevent是否已经安装。

# ls -al /usr/lib | grep libevent

lrwxrwxrwx 1 root root 21 11?? 12 17:38libevent-1.2.so.1 -> libevent-1.2.so.1.0.3

-rwxr-xr-x 1 root root 263546 11?? 12 17:38libevent-1.2.so.1.0.3

-rw-r--r-- 1 root root 454156 11?? 12 17:38 libevent.a

-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la

lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so-> libevent-1.2.so.1.0.3

安装memcache

安装memcached,同时需要安装中指定libevent的安装位置:

# cd /tmp

# tar zxvf memcached-1.2.0.tar.gz

# cd memcached-1.2.0

# ./configure --with-libevent=/usr

# make

# make install

如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。

安装完成后会把memcached放到 /usr/local/bin/memcached 。

测试是否成功安装memcached:

# ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root root 137986 11?? 12 17:39/usr/local/bin/memcached

-rwxr-xr-x 1 rootroot 140179 11?? 12 17:39 /usr/local/bin/memcached-debug

2)通过apt-get进行安装:

sudo apt-get install memcached,推荐通过该方式进行安装,比较简单,不容易出现错误。

启动memcache服务器:

memcached -d -m 50 -p 11211 -uroot

memcached常用启动参数描述:

 -d:启动一个守护进程,

-m:分配给Memcache使用的内存数量,单位是MB,默认是64MB,

-u:运行Memcache的用户

-l:监听的服务器IP地址

-p:设置Memcache监听的端口,默认是11211注:-p(p为小写)

-c:设置最大并发连接数,默认是1024

-P:设置保存Memcache的pid文件注:-P(P为大写)

-h 显示帮助

安装Memcache的PHP扩展

通过地址http://pecl.php.net/get/memcache-2.2.6.tgz下载memcache最新的稳定版本。

安装php的memcache扩展有两种方式:

linux下安装memcache扩展

可以使用php自带的pecl安装程序
# pecl install memcache

或apt-get安装php的memcache扩展

sudo apt-get installphp5-memcache

也可以从源码安装

# tar zxf memcache-2.2.3.tgz

# cd memcache-2.2.3

# /usr/local/servers/php5/bin/phpize

#./configure --enable-memcache=/usr/local/servers/memcached--with-php-config=/usr/local/servers/php5/bin/php-config--with-apxs2=/usr/sbin/apxs

# make && make inst

安装完后会有类似这样的提示:

Installing shared extensions:/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/

把这个记住,然后修改php.ini,把

extension_dir ="./"

修改为

extension_dir ="/usr/local/servers/php5/lib/php/extensions/"

并添加一行

extension="no-debug-non-zts-20060922/memcache.so"

在windows下安装memcache扩展

下载时要弄清楚自己的php版本,下载相对应的memcache扩展的版本,我用的是php5.2.6,下载地址为http://museum.php.net/php5/pecl-5.2.6-Win32.zip,解压后找到它的php_memcache.dll文件,放在php目录下的extension目录下,并在php.ini 加入一行 ‘extension=php_memcache.dll’。phpinfo下,看是否安装成功。

Php的memcache

使用实例:

< ?php

//连接

$mem = new Memcache;

$mem->connect("192.168.0.200", 12000);

//保存数据

$mem->set('key1', 'This is first value', 0, 60);

$val = $mem->get('key1');

echo "Get key1 value: " . $val ."<br/>";

//替换数据

$mem->replace('key1', 'This is replace value', 0,60);

$val = $mem->get('key1');

echo "Get key1 value: " . $val ."<br />";

//保存数组

$arr = array('aaa', 'bbb', 'ccc', 'ddd');

$mem->set('key2', $arr, 0, 60);

$val2 = $mem->get('key2');

echo "Get key2 value: ";

print_r($val2);

echo "<br />";

//删除数据

$mem->delete('key1');

$val = $mem->get('key1');

echo "Get key1 value: " . $val ."<br />";

//清除所有数据

$mem->flush();

$val2 = $mem->get('key2');

echo "Get key2 value: ";

print_r($val2);

echo "<br />";

//关闭连接

$mem->close();

?>

Memcached集群

Magent软件介绍

magent是一款开源的memcached代理服务器软件

地址: http://code.google.com/p/memagent/

安装magent到/usr/local/下

cd /usr/local

mkdir magent

cd magent/

wgethttp://memagent.googlecode.com/files/magent-0.5.tar.gz

tar zxvf magent-0.5.tar.gz

/sbin/ldconfig

sed -i "s/LIBS = -levent/LIBS =-levent -lm/g" Makefile

make

magent命令参数:
-hthis message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcpsupport)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip andport
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don't go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. defaultis off
-i number, max keep alive connections for onememcached server, default is 20
-v verbose

启动magent服务
magent -u root -n4096 -l 127.0.0.1 -p12000 -s127.0.0.1:8086-s 127.0.0.2:8086-b 127.0.0.1:11213

magent的hash算法

magent采用的是:Consistent Hashing原理,Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。

利用magent实现对memecache的分布式管理,搭建一套memcache集群服务

1、前端php对magent的访问跟对memcache访问相同,不需要做任何更改,对于插入的key,magent会把值散列到各个memcache服务上,只操作magent,不用关心后端处理

2、公司项目应用:南北各10台前端,南北各部署一套magent服务,主要是考虑电信网通的跨网访问.以北方为例,每个前端安装memcached服务(大内存机器可以启动多个服务),每个前端都安装magent服务,后端挂载全部机器的 memcached服务,启动参数:

magent-p 12000 -s 127.0.0.1:8086 -s 127.0.0.2:8086 -s 127.0.0.3:8086.......-s127.0.0.10:8086

,所有前端配置都是相同的,任何一个前端只需访问本地端口的magent,这样的memcache集群对应用带来很大便利.

比如项目的基本配置信息,早期策略只能在中控机生成配置文件,同步到各个前端,没有办法把配置信息放到缓存中,因为各个前端的memcache是不共享 的,一台机器缓存更新,其它机器是不更新的,用程序去控制更新,还是存在不稳定因素,而且随着服务增多,也不便于管理,部署了magent后,就可以解决 这个问题,任何一个前端更新数据=全局更新
这种部署还可以解决的应用:session共享

Magent使用举例

启动两个memcached进程,端口分别为11211和11212:

memcached -m 1 -u root -d -l 127.0.0.1 -p 11211

memcached -m 1 -u root -d -l 127.0.0.1 -p 11212

启动两个magent进程,端口分别为10000和11000:

magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s127.0.0.1:11211 -b 127.0.0.1:11212

magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s127.0.0.1:11212 -b 127.0.0.1:11211

-s 为要写入的memcached, -b 为备份用的memcached。

说明:测试环境用magent和memached的不同端口来实现,在生产环境中可以将magent和memached作为一组放到两台服务器上。

也就是说通过magent能够写入两个memcached。

magent使用

1、安装libevent:

wgethttp://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar-xzvflibevent-1.4.13-stable.tar.gz
cdlibevent-1.4.13-stable
./configure--prefix=/usr/local/libevent
make
make install

2、安装Memcached:

wgethttp://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
tar-xzvfmemcached-1.4.4.tar.gz
cdmemcached-1.4.4
./configure--prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make
make install
ln-s/usr/local/libevent/lib/libevent-1.4.so.2 /usr/lib/

3、编译安装magent:

mkdirmagent
cpmagent-0.5.tar.gz magent
cdmagent
tar-xzvfmagent-0.5.tar.gz
/sbin/ldconfig
sed-i"s#LIBS = -levent#LIBS = -levent -lm#g"Makefile
vi magent.c 添加
#include<limits.h>
make

一、使用实例:

memcached-m 1-u root-d-l192.168.1.219-p 11211
memcached-m 1-u root-d-l192.168.1.219-p 11212
memcached-m 1-u root-d-l192.168.1.219-p 11213


magent-u root-n 51200-l192.168.1.219-p 12000-s192.168.1.219:11211-s192.168.1.219:11212-b192.168.1.219:11213

1、分别在11211、11212、11213端口启动3个Memcached进程,在12000端口开启magent代理程序;

2、11211、11212端口为主Memcached,11213端口为备份Memcached;

  3、连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11212和11213端口的Memcached;

4、当11211、11212端口的Memcached死掉,连接到12000端口的magent取数据,数据会从11213端口的Memcached取出。

三、整个测试流程:

# telnet 192.168.1.21912000
Trying 1192.168.1.219...
Connected to 192.168.1。219.
Escapecharacter is'^]'.
stats
memcached agent v0.4
matrix 1->192.168.1.219:11211,poolsize0
matrix 2->192.168.1.219:11212,poolsize0
END
set key1 0 0 5
reesun
STORED
set key2 0 0 6
reesun1
STORED
quit
Connection closed by foreign host.


#telnet192.168.1.21911211
Trying192.168.1.219...
Connected to192.168.1.219.
Escapecharacter is'^]'.
get key1
END
get key2
VALUE key2 0 6
reesun1
END
quit
Connection closed by foreign host.


#telnet192.168.1.21911212
Trying192.168.1.219...
Connected to 1192.168.1.219.
Escapecharacter is'^]'.
get key1
VALUE key1 0 5
reesun
END
get key2
END
quit
Connection closed by foreign host.


#telnet192.168.1.21911213
Trying192.168.1.219...
Connected to 1192.168.1.219.
Escapecharacter is'^]'.
get key1
VALUE key1 0 5
reesun
END
get key2
VALUE key2 0 6
reesun1
END
quit
Connection closed by foreign host.

分享到:
评论

相关推荐

    PHP实现分布式memcache设置web集群session同步的方法

    主要介绍了PHP实现分布式memcache设置web集群session同步的方法,结合实例形式分析了php设置与使用memcache实现web集群session同步的相关操作技巧与注意事项,需要的朋友可以参考下

    tomcat8_memcache_session共享jar.zip

    分布式、集群所需 tomcat8_memcache_session共享jar.zip

    Fourinone分布式计算框架

    它由开发者自己实现,开发者可以自由控制调度过程,比如按照“农民工”的数量将源数据切分成多少份,然后远程分配给“农民工”节点进行计算处理,它处理完的中间结果数据不限制保存在hdfs里,而可以自由控制保存在...

    Fourinone分布式并行计算四合一框架

    它由开发者自己实现,开发者可以自由控制调度过程,比如按照“农民工”的数量将源数据切分成多少份,然后远程分配给“农民工”节点进行计算处理,它处理完的中间结果数据不限制保存在hdfs里,而可以自由控制保存在...

    大型分布式网站架构与实践

     2.1.3 分布式session 69  2.2 持久化存储 71  2.2.1 MySQL扩展 72  2.2.2 HBase 80  2.2.3 Redis 91  2.3 消息系统 95  2.3.1 ActiveMQ & JMS 96  2.4 垂直化搜索引擎 104  2.4.1 Lucene简介 105  2.4.2 ...

    MVC使用Memcache+Cookie解决分布式系统共享登录状态学习笔记6

    当我们将网站程序分部到多台服务器上后,由于Session受实现原理的局限,无法跨服务器同步更新Session,使得登录状态难以通过Session共享。  我们使用MemCache+Cookie方案来解决分布式系统共享登录状态的问题。  ...

    PHP中使用memcache存储session的三种配置方法

    下面简单说下PHP项目分布式部署中,SESSION的同步方案中的一种,使用Memcache来存储SESSION。并总结了三种配置方式,需要的朋友可以参考下

    性能调优 海量并发 系统架构

    Apache+Tomcat+Session+Memcache 高性能群集搭建 J2EE性能调优 Jboss的优化配置 Memcached分布式缓存 Nginx+Tomcat 动静分离 Nginx+tomcat集群Memcached+Session复制 高性能高并发服务器架构 基于nginx的tomcat负载...

    Nginx+Tomcat7+Memcached集群Session共享

    Nginx+Tomcat7+Memcached集群Session共享 ...主要是利用memcached-session-manager(下面简称msm)开源tomcat插件改变tomcat原始的session存储机制,将session的存储放到分布式缓存memcache中,从而实现对session的共享

    一种基于memcache或redis缓存架构的验证码

    最近项目中自己研发的一款适用于分布式服务器的非session实现的验证码框架。文章链接:http://blog.csdn.net/chaijunkun/article/details/8996794,共同学习。

    php_memcache

    Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

    一种基于memcache或redis缓存架构的验证码(Redis版)

    最近项目中自己研发的一款适用于分布式服务器的非session实现的验证码框架。文章链接:http://blog.csdn.net/chaijunkun/article/details/8996794,共同学习。

    fourinone-3.04.25

    它由开发者自己实现,开发者可以自由控制调度过程,比如按照“农民工”的数量将源数据切分成多少份,然后远程分配给“农民工”节点进行计算处理,它处理完的中间结果数据不限制保存在hdfs里,而可以自由控制保存在...

    ThinkPHP 3.2.3 核心版.zip

    ThinkPHP是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用...增加memcacheSession驱动;改进session函数的数组操作;修正一系列存在的问题;

    MF00001-JAVA多用户B2B2C商城源码.zip

    JAVA多用户B2B2C商城系统源码 开发语言 : JAVA ...系统支持多服务器分布式部署,互通机制,也可以修改系统相关功能进行session缓存共享处理,轻松完成分布式部署,为大数据、大访问量的运营商提供可靠的功能保证。

    leetcode跳跃-CS-Notes:备战秋招笔记

    分布式锁、分布式事务、CAP、BASE、Paxos、Raft 负载均衡、Session 管理 XSS、CSRF、SQL 注入、DDoS 缓存特征、缓存位置、缓存问题、数据分布、一致性哈希、LRU、CDN 消息处理模型、使用场景、可靠性 :hammer: 工具 ...

    php开源框架 CmlPHP.zip

    CmlPHP V2.x 支持Session分布式存储 CmlPHP V2.x 支持守护工作进程 CmlPHP V2.x 提供了命令运行支持 v2.6.x 从v2.6.0 正式引入MongoDB的支持 代码托管 框架已发布到https://packagist.org。可直接用...

Global site tag (gtag.js) - Google Analytics