负载均衡采用[nginx]将[php]的请求分摊到若干个运行php fastcgi的独立服务器中。在一次php请求过后,nginx将php请求发送到了另外集群中的另外一台php fastcgi服务器,那么就会导致session的丢失。采用一台独立memcached服务器来存储整个项目的php session数据,再通过改写php的session处理函数来对memcached服务器进行数据读写,然后解决各个php fastcgi中session不同步的问题。
具体的配置:
1、nginx服务器一台,IP地址:172.16.236.208
2、php fastcgi服务器两台,IP分别为:172.16.236.210,172.16.236.211
3、memcached服务器一台,IP为:172.16.236.220
首先,修改nginx虚拟主机配置,将php的请求分发到各个php fastcgi服务器去,
第二步,为php fastcgi服务器安装php-memcache扩展
第三步,修改项目php源代码,使php的session存取使用memcached。
在调用session_start()之前执行如下代码:
$host = '172.16.236.220' ;
$port = '11211' ;
$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, ,tcp://$host:$port";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);
其中$host是memcached服务器的ip地址,$port是memcached监听的端口。使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
测试数据:
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "
";
print $_SESSION['TEST3'];
print "
";
print session_id(); //19216821213c65cedec65b0883238c278eeb573e077
?>
可以直接用sessionid 去 memcached 里查询一下:
telnet 172.16.236.220 11211
get 19216821213c65cedec65b0883238c278eeb573e077
得到
TEST|i:1177556731;TEST3|i:1177556881;
这样的结果,说明session 正常工作
使用memcached的优缺点
用Memcached来存储 session 在读写速度上会比文件快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组Memcached服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题,如果要持久化数据,也可以使用新浪开发的MemcacheDB或日本人开发的Tokyo tyrant+Tokyo Cabinet。
单点故障问题的解决
解决Memcached的单点故障问题,有以下几个方案:
①使用上面提到的Memcache::addServer增加多台Memcached,但这样只能达到一台出故障之后,另外一台可以使用,但每台Memcached的数据是独立的,如果不共享不复制,出故障的数据就丢失了。
②使用Memcached的一个补丁应用repcached,可以实现multi master replication和asynchronous data repliacation等故障转移的功能,并且支持原来Memcached的所有命令。不过这个应用只支持Memcached1.2.x版本。
③使用Tokyo tyrant+Tokyo Cabinet(简称TT+TC)。TT兼容Memcached协议,可以直接替换使用,TT支持replication,可以实现故障转移,TC则为TT提供持久化。
TT+TC是日本最大的社交类网站mixi.jp开发的开源应用,并已成功应用在mixi.jp中。
评论列表(0条)