企业级Memcached部署(session共享)
服务端部署
第一个里程碑:安装依赖关系
Memcache用到了libevent这个库用于Socket的处理。
[root@nfs01 ~]
# yum install libevent libevent-devel nc -y
第二个里程碑:安装memcache
[root@nfs01 ~]
# yum install memcached -y
[root@nfs01 ~]
# which memcached
/usr/bin/memcached
第三个里程碑:启动memcached服务
[root@nfs01 ~]
# memcached -m 16m -p 11211 -d -u root -c 8192
[root@nfs01 ~]
# lsof -i :11211
COMMAND PID USER FD TYPE DEVICE SIZE
/OFF
NODE NAME
memcached 10796 root 26u IPv4 85717 0t0 TCP *:memcache (LISTEN)
memcached 10796 root 27u IPv6 85718 0t0 TCP *:memcache (LISTEN)
memcached 10796 root 28u IPv4 85721 0t0 UDP *:memcache
memcached 10796 root 29u IPv6 85722 0t0 UDP *:memcache
[root@nfs01 ~]
# netstat -lntup |grep memca
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 10796
/memcached
tcp 0 0 :::11211 :::* LISTEN 10796
/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 10796
/memcached
udp 0 0 :::11211 :::* 10796
/memcached
注:memcached可以同时启动多个实例,端口不一致即可。
[root@nfs01 ~]
# memcached -m 16m -p 11212 -d -u root -c 8192
第四个里程碑:写入开机自启动
echo
'memcached -m 16m -p 11211 -d -u root -c 8192'
>>
/etc/rc
.
local
客户端部署(web服务器)
第一个里程碑:安装PHP memcache 扩展插件
命令集如下:
cd
/server/tools
wget http:
//pecl
.php.net
/get/memcache-2
.2.7.tgz
tar
xf memcache-2.2.7.tgz
cd
memcache-2.2.7
/application/php/bin/phpize
.
/configure
-
enable
-memcache --with-php-config=
/application/php/bin/php-config
make
&&
make
install
完整操作过程:
[root@web01 ~]
# cd /server/tools/
[root@web01 tools]
# wget http://pecl.php.net/get/memcache-2.2.7.tgz
[root@web01 tools]
# tar xf memcache-2.2.7.tgz
[root@web01 tools]
# cd memcache-2.2.7
[root@web01 memcache-2.2.7]
# /application/php/bin/phpize
Configuring
for
:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
[root@web01 memcache-2.2.7]
# ./configure -enable-memcache --with-php-config=/application/php/bin/php-config
[root@web01 memcache-2.2.7]
# make && make install
查看是否安装成功
[root@web01 memcache-2.2.7]
# ls -l /application/php/lib/php/extensions/no-debug-non-zts-20121212/
total 252
-rwxr-xr-x 1 root root 258048 Nov 7 10:03 memcache.so
memcache.so表示插件安装成功。
第二个里程碑:配置memcache客户端使其生效
[root@web01 memcache-2.2.7]
# cd /application/php/lib/
[root@web01 lib]
# vim php.ini
……
[root@web01 lib]
# tail -2 php.ini
extension_dir =
"/application/php/lib/php/extensions/no-debug-non-zts-20121212/"
extension = memcache.so
第三个里程碑:检测语法,重启服务
[root@web01 lib]
# /application/php/sbin/php-fpm -t
[07-Nov-2017 10:20:44] NOTICE: configuration
file
/application/php-5
.5.32
/etc/php-fpm
.conf
test
is successful
#重启服务
killall php-fpm
killall php-fpm
/application/php/sbin/php-fpm
浏览器访问phpinfo页面出现memcache信息表示配置成功。
第四个里程碑:编写测试memcache文件
[root@web01 blog]
# cat test_memcache.php
<?php
$memcache = new Memcache;
$memcache->connect(
'172.16.1.31'
, 11211) or die (
"Could not connect NFS server"
);
$memcache->
set
(
'key'
,
'Memcache connect OK'
);
$get = $memcache->get(
'key'
);
echo
$get;
?>
测试出现Memcache connect OK 表示连接成功
[root@web01 blog]
# /application/php/bin/php test_memcache.php
Memcache connect OK
第五个里程碑:修改php配置(设置session共享)
[root@web01 ~]
# vim /application/php/lib/php.ini
原配置
session.save_handler = files
session.save_path =
"/tmp"
修改为:
session.save_handler = memcache
session.save_path =
"tcp://172.16.1.31:11211"
⚠修改完成之后要重启php服务
killall php-fpm
killall php-fpm
/application/php/sbin/php-fpm
修改之前phpinfo信息
修改之后phpinfo信息
到此企业级memcache(session共享)部署完毕
1.1.1 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问题
问题:
上述文件进行修改后,DedeCMS发现无法访问后台 http:
//www
.linuxidc.com
/dede
解决办法:
修改文件一:
[root@web01 include]
# pwd
/application/nginx/html/www/include
[root@web01 include]
# vim common.inc.php
135
//Session
保存路径
136 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10);
137
//
$sessSavePath = DEDEDATA.
"/sessions_{$enkey}"
;
138 $sessSavePath =
"tcp://172.16.1.31:11211"
;
139
if
( !is_dir($sessSavePath) )
mkdir
($sessSavePath);
修改文件二:
[root@web01 include]
# vim vdimgck.php
24 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10);
25
//
$sessSavePath = DEDEDATA.
"/sessions_{$enkey}"
;
26 $sessSavePath =
"tcp://172.16.1.31:11211"
;
27
if
( !is_dir($sessSavePath) )
mkdir
($sessSavePath);
让DedeCMS直接使用memcache的共享.解决问题.