我的配置环境为:
Linux版本:CentOS 5.6
PHP版本:PHP 5.2.17
Memcached版本:1.4.9
Memcache版本:2.2.6
Memcached需要libevent支持,所以需要先检查libevent是否已经安装。
下面是Memcached的安装过程:
# tar zvxf memcached-1.4.9.tar.gz
# cd memcached-1.4.9
# ./configure --prefix=/usr/local/memcached
# make
# make install
启动Memcached:
# /usr/local/memcached/bin/memcached -d -m 128 -l 127.0.0.1 -p 11211 -u root
参数128指定了内存使用量
接下来是为PHP安装memcache扩展:
# gzip -d memcache-2.2.6.tgz
# tar xvf memcache-2.2.6.tar
# cd memcache-2.2.6
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
# make
# make install
最后将如下配置信息添加到php.ini文件中:
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
extension=memcache.so
备注:/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/这个路径可能会有不同,以您机器中的为准。
管理Memcached的Service脚本
如Memcached已在Linux中安装完毕,且被部署到/usr/local/memcached这个路径下,接下来我们来开始为其安装用于启动和停止的服务管理脚本。
首先,通过vi在/etc/rc.d/init.d路径下新建一个名为memcached的脚本文件,命令如下:
vi /etc/rc.d/init.d/memcached
然后,向其中写入Shell脚本如下:
#!/bin/sh
#
# chkconfig: 2345 90 50
# description: Memcached Service Daemon
#
# processname: Memcached
#
# Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
#[ ${NETWORKING} = "no" ] && exit 0
#[ -r /etc/sysconfig/dund ] || exit 0
#. /etc/sysconfig/dund
#[ -z "$DUNDARGS" ] && exit 0
MEMCACHED="/usr/local/memcached/bin/memcached"
start()
{
echo -n $"Starting Memcached: "
daemon $MEMCACHED -u daemon -d -m 32 -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid
echo
}
stop()
{
echo -n $"Shutting down Memcached: "
killproc memcached
echo
}
[ -f $MEMCACHED ] || exit 1
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 3
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
保存退出vi后,执行下面的命令来安装这个脚本
chmod 777 /etc/rc.d/init.d/memcached
chkconfig --add memcached
chkconfig --level 235 memcached on
然后可以通过下面的命令来检查是否安装成功
hkconfig --list | grep memcached
service memcached start
service memcached stop
service memcached restart
Memcached连接超时故障排除
在一次例行检查日志的时候,发现Nginx日志中出现了大量的PHP连接Memcached超时的报错信息,如下:
PHP Warning: Memcache::connect(): Can't connect to 127.0.0.1:11211, Connection timed out (110) in ...
连上服务器检查Memcached进程运行正常,然后我用一段测试代码检查Memcached是否能够正常连接,结果也很正常。
于是又仔细分析日志,发现那段报错信息是间隔出现的,说明是有一定几率的。这时我回想起上周因为架构问题刚刚把PHP的Session存储路径指向到了Memcached里,可能是因为这个配置增加了Memcached的负载,从而导致在并发量较高时,Memcached出现连接超时的现象。
找到原因就容易解决了。重新调整Memcached的启动参数,增加-c参数来提高连接数量。默认为1024,可以逐步增加以找到最佳数值。我设置为2048。
启动命令为:
memcached -d -m 256 -c 2048 -l 127.0.0.1 -p 11211 -u root
如果服务器充裕,可以考虑分布式的memcached集群,以降低单个节点上的压力