多台服务器之间共享PHP的session数据

通过设置session_save_handle 为redis或者memcache,将session保存的位置进行修改。

php.ini里的配置:

《多台服务器之间共享PHP的session数据》 image.png

这个项目一开始就设计的“很大”,考虑了很多负载均衡方面的东西,比如采用[nginx]将[php]的请求分摊到若干个运行php fastcgi的独立服务器中。这样的设计除了在每个php fastcgi服务器中要保存一份程序的拷贝以外,还有一个亟待解决的问题。由于php fastcgi进程分别运行在不同的服务器上,默认的,php的session数据是在各个服务器上分别存放的,这样的话,如果在某一次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 fastcgi的配置其实可以偷懒,就是将之前编译好的memcache.so拷贝到需要配置的服务器中,然后修改php.ini可以加载这个扩展即可。

第三步,修改项目php源代码,使php的session存取使用memcached。
之前没有认真去读php的手册,先是自己写session的handler,然后又碰到一些奇怪的问题。最后在php官方的memcache说明中找到了最简单的办法,其实只要在调用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://$host1:$port1"; 
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

其中《多台服务器之间共享PHP的session数据》port是memcached监听的端口。使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2” 。

测试数据:

<?php 
session_start(); 
if (!isset($_SESSION['TEST'])) { 
$_SESSION['TEST'] = time(); 
} 
$_SESSION['TEST3'] = time(); 
print $_SESSION['TEST']; 
print "<br><br>"; 
print $_SESSION['TEST3']; 
print "<br><br>"; 
print session_id(); //19216821213c65cedec65b0883238c278eeb573e077 
?> 
可以直接用sessionid 去 memcached 里查询一下: 
telnet 172.16.236.220 11211 
get 19216821213c65cedec65b0883238c278eeb573e077 

得到 
TEST|i:1177556731;TEST3|i:1177556881; 
这样的结果,说明session 正常工作 

使用memcached的优缺点
1.用Memcached来存储 session 在读写速度上会比文件快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组Memcached服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题,如果要持久化数据,也可以使用新浪开发的MemcacheDB或日本人开发的Tokyo tyrant+Tokyo Cabinet。

单点故障问题的解决
2.另外,如何解决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中,值得研究。

    原文作者:金星show
    原文地址: https://www.jianshu.com/p/61175948d303
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞