服务端部署

第一个里程碑:安装依赖关系
Memcache用到了libevent这个库用于Socket的处理。

  1. [root@nfs01 ~]# yum install libevent libevent-devel nc -y

第二个里程碑:安装memcache

  1. [root@nfs01 ~]# yum install memcached -y
  2. [root@nfs01 ~]# which memcached
  3. /usr/bin/memcached

第三个里程碑:启动memcached服务

  1. 1 [root@nfs01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192
  2. 2 [root@nfs01 ~]# lsof -i :11211
  3. 3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  4. 4 memcached 10796 root 26u IPv4 85717 0t0 TCP *:memcache (LISTEN)
  5. 5 memcached 10796 root 27u IPv6 85718 0t0 TCP *:memcache (LISTEN)
  6. 6 memcached 10796 root 28u IPv4 85721 0t0 UDP *:memcache
  7. 7 memcached 10796 root 29u IPv6 85722 0t0 UDP *:memcache
  8. 8 [root@nfs01 ~]# netstat -lntup |grep memca
  9. 9 tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 10796/memcached
  10. 10 tcp 0 0 :::11211 :::* LISTEN 10796/memcached
  11. 11 udp 0 0 0.0.0.0:11211 0.0.0.0:* 10796/memcached
  12. 12 udp 0 0 :::11211 :::* 10796/memcached

注:memcached可以同时启动多个实例,端口不一致即可。

  1. [root@nfs01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192

参数说明:

参数 参数说明
-m max memory to use for items in megabytes (default: 64 MB)
-p TCP port number to listen on (default: 11211)
-d run as a daemon
-u assume identity of (only when run as root)
-c max simultaneous connections (default: 1024)

第四个里程碑:写入开机自启动

  1. echo 'memcached -m 16m -p 11211 -d -u root -c 8192' >>/etc/rc.local

客户端部署(web服务器)

第一个里程碑:安装PHP memcache 扩展插件
命令集如下:

  1. cd /server/tools
  2. wget http://pecl.php.net/get/memcache-2.2.7.tgz
  3. tar xf memcache-2.2.7.tgz
  4. cd memcache-2.2.7
  5. /application/php/bin/phpize
  6. ./configure -enable-memcache --with-php-config=/application/php/bin/php-config
  7. make && make install

完整操作过程:

  1. [root@web01 ~]# cd /server/tools/
  2. [root@web01 tools]# wget http://pecl.php.net/get/memcache-2.2.7.tgz
  3. [root@web01 tools]# tar xf memcache-2.2.7.tgz
  4. [root@web01 tools]# cd memcache-2.2.7
  5. [root@web01 memcache-2.2.7]# /application/php/bin/phpize
  6. Configuring for:
  7. PHP Api Version: 20121113
  8. Zend Module Api No: 20121212
  9. Zend Extension Api No: 220121212
  10. [root@web01 memcache-2.2.7]# ./configure -enable-memcache --with-php-config=/application/php/bin/php-config
  11. [root@web01 memcache-2.2.7]# make && make install

查看是否安装成功

  1. [root@web01 memcache-2.2.7]# ls -l /application/php/lib/php/extensions/no-debug-non-zts-20121212/
  2. total 252
  3. -rwxr-xr-x 1 root root 258048 Nov 7 10:03 memcache.so

memcache.so表示插件安装成功。
第二个里程碑:配置memcache客户端使其生效

  1. [root@web01 memcache-2.2.7]# cd /application/php/lib/
  2. [root@web01 lib]# vim php.ini
  3. ……
  4. [root@web01 lib]# tail -2 php.ini
  5. extension_dir = "/application/php/lib/php/extensions/no-debug-non-zts-20121212/"
  6. extension = memcache.so

第三个里程碑:检测语法,重启服务

  1. [root@web01 lib]# /application/php/sbin/php-fpm -t
  2. [07-Nov-2017 10:20:44] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful

重启服务

  1. killall php-fpm
  2. killall php-fpm
  3. /application/php/sbin/php-fpm

浏览器访问phpinfo页面出现memcache信息表示配置成功。
企业级memcached部署(session共享) - 图1
第四个里程碑:编写测试memcache文件

  1. [root@web01 blog]# cat test_memcache.php
  2. <?php
  3. $memcache = new Memcache;
  4. $memcache->connect('172.16.1.31', 11211) or die ("Could not connect NFS server");
  5. $memcache->set('key', 'Memcache connect OK');
  6. $get = $memcache->get('key');
  7. echo $get;
  8. ?>

测试出现Memcache connect OK 表示连接成功

  1. [root@web01 blog]# /application/php/bin/php test_memcache.php
  2. Memcache connect OK

第五个里程碑:修改php配置(设置session共享)

  1. [root@web01 ~]# vim /application/php/lib/php.ini

原配置

  1. session.save_handler = files
  2. session.save_path = "/tmp"

修改为:

  1. session.save_handler = memcache
  2. session.save_path = "tcp://172.16.1.31:11211"

⚠修改完成之后要重启php服务

  1. killall php-fpm
  2. killall php-fpm
  3. /application/php/sbin/php-fpm

修改之前phpinfo信息
企业级memcached部署(session共享) - 图2
修改之后phpinfo信息
企业级memcached部署(session共享) - 图3
到此企业级memcache(session共享)部署完毕

Memcached在集群中session共享存储的优缺点

优点:
1)读写速度上会比普通文件files速度快很多。
2)可以解决多个服务器共用session的难题。
缺点:
1)session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是问题。
2)一般是单台,如果部署多台,多台之间数据无法同步。通过hash算法分配依然有session丢失的问题。
替代方案:
1)可以用其他的持久化系统存储session,例如redis,ttserver来替代memcached.
2)高性能并发场景,cookies效率比session要好很多,因此,大网站都会用cookies解决会话共享的问题.
3)一些不好的方法:lvs-p,nginx ip_hash,不推荐使用.

DedeCMS使用memcache问题

  1. 问题:
  2. 上述文件进行修改后,DedeCMS发现无法访问后台 http://www.etiantia.org/dede

解决办法:
修改文件一:

  1. [root@web01 include]# pwd
  2. /application/nginx/html/www/include
  3. [root@web01 include]# vim common.inc.php
  4. 135 //Session保存路径
  5. 136 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10);
  6. 137 //$sessSavePath = DEDEDATA."/sessions_{$enkey}";
  7. 138 $sessSavePath = "tcp://172.16.1.31:11211";
  8. 139 if ( !is_dir($sessSavePath) ) mkdir($sessSavePath);

修改文件二:

  1. [root@web01 include]# vim vdimgck.php
  2. 24 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10);
  3. 25 //$sessSavePath = DEDEDATA."/sessions_{$enkey}";
  4. 26 $sessSavePath = "tcp://172.16.1.31:11211";
  5. 27 if ( !is_dir($sessSavePath) ) mkdir($sessSavePath);

让DedeCMS直接使用memcache的共享.解决问题.