设为首页 收藏本站
查看: 1827|回复: 0

[经验分享] memcache分布式实现数据同步保存session

[复制链接]

尚未签到

发表于 2015-12-24 10:31:03 | 显示全部楼层 |阅读模式
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实现分布式:
  我们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:
  
  从memcache中取回session数据
  
  会有看到
  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 ."
";
  
  //替换数据
  $mem->replace('key1', 'This is replace value', 0,60);
  $val = $mem->get('key1');
  echo "Get key1 value: " . $val ."
";
  
  //保存数组
  $arr = array('aaa', 'bbb', 'ccc', 'ddd');
  $mem->set('key2', $arr, 0, 60);
  $val2 = $mem->get('key2');
  echo "Get key2 value: ";
  print_r($val2);
  echo "
";
  
  //删除数据
  $mem->delete('key1');
  $val = $mem->get('key1');
  echo "Get key1 value: " . $val ."
";
  
  //清除所有数据
  $mem->flush();
  $val2 = $mem->get('key2');
  echo "Get key2 value: ";
  print_r($val2);
  echo "
";
  
  //关闭连接
  $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
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.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-155609-1-1.html 上篇帖子: Memcache 相关资料 下篇帖子: zabbix动态监控memcached
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表