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实现分布式:

我们PHP的PECL中的Memcache扩展能够有效的解决Memcache的分布式问题,主要的接口就是 addServer() 函数,具体关于addServer()函数的实现可以参考该扩展源代码。那么现在就存在第二个问题,就是说无法同步数据,可以理解为MySQL中Master/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

分布式系统的良性运行

在Memcache的实际使用中,遇到的最严重的问题,就是在增减服务器的时候,会导致大范围的缓存丢失,从而可能会引导数据库的性能瓶颈,为了避免出现这种情况,请先看Consistent hashing算法,中文的介绍可以参考memcached全面剖析, memcached的分布式算法,通过存取时选定服务器算法的改变,来实现。

memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。

修改PHP的Memcache扩展memcache.c的源代码中的

"memcache.hash_strategy" = standard

"memcache.hash_strategy" = consistent
重新编译,这时候就是使用Consistent hashing算法来寻×××器存取数据了。
有效测试数据表明,使用Consistent hashing可以极大的改善增删Memcache时缓存大范围丢失的情况。

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

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 -n 4096 -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:

wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar -xzvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr/local/libevent
make
make install

2、安装Memcached:

wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
tar -xzvf memcached-1.4.4.tar.gz 
cd memcached-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:

mkdir magent
cp magent-0.5.tar.gz magent
cd magent
tar -xzvf magent-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 -l 192.168.1.219 -p 11211
memcached -m 1 -u root -d -l 192.168.1.219 -p 11212
memcached -m 1 -u root -d -l 192.168.1.219 -p 11213

magent -u root -n 51200 -l 192.168.1.219 -p 12000 -s 192.168.1.219:11211 -s 192.168.1.219:11212 -b 192.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.219 12000
Trying 1192.168.1.219...
Connected to 192.168.1。219.
Escape character is '^]'.
stats
memcached agent v0.4
matrix 1 -> 192.168.1.219:11211, pool size 0
matrix 2 -> 192.168.1.219:11212, pool size 0
END
set key1 0 0 5
reesun
STORED
set key2 0 0 6
reesun1
STORED
quit
Connection closed by foreign host.

# telnet 192.168.1.219 11211
Trying 192.168.1.219...
Connected to 192.168.1.219.
Escape character is '^]'.
get key1
END
get key2
VALUE key2 0 6
reesun1
END
quit
Connection closed by foreign host.

# telnet 192.168.1.219 11212
Trying 192.168.1.219...
Connected to 1192.168.1.219.
Escape character is '^]'.
get key1
VALUE key1 0 5
reesun
END
get key2
END
quit
Connection closed by foreign host.

# telnet 192.168.1.219 11213
Trying 192.168.1.219...
Connected to 1192.168.1.219.
Escape character is '^]'.
get key1
VALUE key1 0 5
reesun
END
get key2
VALUE key2 0 6
reesun1
END
quit
Connection closed by foreign host.

本文出自http://lib.csdn.net/article/php/14777

转载于:https://blog.51cto.com/lookingdream/1941822

memcache分布式实现、memcache分布式的数据同步、memcache保存session数据的实现相关推荐

  1. 树莓派上做音频采集,采集pcm数据并直接保存pcm数据

    前言 看了很长时间关于alsa音频驱动的一些中英文资料,终于把这个程序给搞出来了.这个程序实现的是在树莓派上通过usb音频采集卡进行音频采集,并直接将pcm数据保存起来,通过c语言实现. 项目地址 a ...

  2. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  3. 服务器多个网站开启quarz,GitHub - WuLex/QuartzSynchroData: 多个不同站点服务器数据同步到总服务器(数据中心)...

    QuartzSynchroData 多个不同站点服务器sqlserver数据库 同步到总服务器上的数据库 (数据中心) 目前支持40多个数据库(在数据库配置表DBconfig配置了)的同步,每天每个服 ...

  4. Oracle数据同步接口,增量数据从ERP系统到本地临时表封装解决方案

    项目的许多基础数据需要从ERP系统中同步基础数据,例如:物料.客户.供应商.仓库等等. 之前做过一次比较死板的标准流程: 1.通过JDBC取ERP系统的增量数据; 2.解析; 3.然后用自己项目的DB ...

  5. excel服务器数据同步修改,excel表格数据同步修改-关于excel不同表格(不同工作簿)之间数据同步修改......

    EXCEL表格文档如何数据同步更新 excel中让两份表格实现数据同步的具体步骤如下: 首先打开计算机,在计算机桌面找到excel软件,鼠标左键双击excel的快捷方式以打开软件.然后打开需要进行数据 ...

  6. redis与mysql数据同步_Redis与MySQL数据同步解决方案

    数据库同步到Redis 我们大多倾向于使用这种方式,也就是将数据库中的变化同步到Redis,这种更加可靠.Redis在这里只是做缓存. 方案1 做缓存,就要遵循缓存的语义规定: 读:读缓存redis, ...

  7. android 同步list数据,android SharedPreferences保存list数据

    释放双眼,带上耳机,听听看~! 今天,简单讲讲如何使用SharedPreferences保存list数据. 网上找了很多资料,还是觉得这种比较简单.直接上代码: 保存: public static b ...

  8. excel mysql数据同步_将 Excel 数据导入 MySql

    能承受上万数据量,速度快,并且使用了事务,不会出现某条数据错误而导致部分数据插入(要是全部成功要是一条都不成功,测试过程中没出现失败),需要的朋友可以参考下 1.NPOI 2.MySql.Data 这 ...

  9. k8s mysql数据同步_K8s——MySQL实现数据持久化

    1.搭建nfs存储 [root@docker-k8s01 ~]# yum -y install nfs-utils [root@docker-k8s01 ~]# mkdir /nfsdata/mysq ...

最新文章

  1. 使用windbg查看PE结构
  2. [提示]普通用户使用sealos安装k8s集群的话,默认还是会装到root用户的home目录/root
  3. Jenkins 基本概念与简介
  4. EPSON 任务同步 改写
  5. 删除microsoft_如何从您的Microsoft帐户中删除设备
  6. 20170513 Python练习册0011过滤敏感词
  7. 嵌入式linux 零基础-实践起步 --- 002 --- 配置虚拟机的网络连接
  8. linux shell实现随机数多种方法(date,random,uuid)
  9. html表格输入框怎么左移动,当我向CSS中的文本框添加边框时,HTML表单输入会移动...
  10. Windows Internet Explorer 7 正式发布
  11. JBPM工作流(八)——流程实例(PI)Process Instance
  12. CSS样式表初始化杂谈
  13. c++ static静态变量、静态函数
  14. 电信中兴B860AV2.1-T_线刷固件包
  15. C++ string类常用方法
  16. 165个站长在线工具箱网站源码/野兔在线工具系统V2.2.7中文版
  17. aso关键词优化,我们该不该去做?
  18. 第14节 单臂路由工作原理及简单实验
  19. mySQL提取姓氏_MySQL 提取姓名大写首字母缩写
  20. 线程池详解:线程池的七大参数及运行流程

热门文章

  1. 摩拜单车项目05-Redis集群
  2. 中兴面试总结,华为。技术,市场
  3. 使用蒙塔卡罗方法计算定积分(Python)
  4. BUUCTF | [GXYCTF2019]BabySQli
  5. 贪吃蛇课设(C++)
  6. ffmpeg之-AVFrame解析(五)
  7. tensorflow中compute_gradients()、clip_by_value()与apply_gradients()
  8. ios 中使用DLNA搜索dms设备
  9. 清除、删除、重置AD账户、OU属性值往AD的OU属性添加值
  10. 得到最好的两个worlds-让Android应用程序运行在PC上