使用Memcached实现Session共享

转载 2011年11月26日 16:57:14

使用Memcached实现Session共享

由于Cookie是保存的用户客户端的,安全性存在问题,为保证用户数据的安全性,我们必须使用Session机制来保存用户登录后的一些信息。 
如果我们使用LVS对Apache实现负载均衡,就无法保证用户每次都能被分配到同一台Apache Server上,以取到自己的Session,虽然LVS可以加-p参数来保证客户端每次都被分配到同一台Apache Server上,但这种方式存在一些弊端,比如必须设置一个保持时间,如果时间太长了,LVS就需要缓存大量信息,时间太短了,又不能保证用户每次被分配到同一台Server上,而且这种方式也不易实现Session的冗余备份。 
因此,我们需要Session共享,也就是说每台Apache都可以访问到所有的Session,这样用户被分配到哪台Server就不重要了。 
Session共享主要有多种实现方式: 
 Session复制。Apache可以实现把Session同步到其他Server上去,但这种技术太复杂,而且影响性能,占用内存,所以不推荐使用。 
 Session集中存储。存储介质可以是NFS文件系统、数据库、Memcached,从性能上考虑,当然是Memcached最好,推荐使用。
1.3 实现 
1.3.1 安装Memcached 
Memcached是基于libevent实现的,所以要首先确保已经安装libevent。 
安装libevent 
tar zxvf libevent-1.4.13-stable.tar.gz 
cd libevent-1.4.13-stable 
./configure --prefix=/usr 
make && make install 
安装Memcached 
tar zxvf memcached-1.4.4.tar.gz 
cd memcached-1.4.4 
./configure --prefix=/usr/local/memcached --with-libevent=/usr 
make && make install 
启动Memcached 

/usr/local/memcached/bin/memcached -d -m 10 -u root -l 192.168.0.9 -p 11211 -c 256 -P /tmp/memcached.pid 
1.3.2 安装PHP扩展pecl::memcache 
pecl install memcache 
或源码安装 
tar zxvf memcache-2.2.5.tgz 
cd memcache-2.2.5 
phpize 
./configure 
make && make install 

将 php.ini 中 extension=memcache.so 打开,重启一下 apache,查看 phpinfo 中的 "Registered save handlers" 会有"files user memcache" 这3个可用。 

另外,基于libmemached的php扩展在pecl发布了,叫pecl::memcached,性能上可能会更好。 
1.3.3 配置Memcached保存Session 
修改配置文件,在 php.ini 中全局设置 
session.save_handler = memcache 
session.save_path = "tcp://192.168.0.9:11211" 
或者某个目录下的 .htaccess : 
php_value session.save_handler "memcache" 
php_value session.save_path "tcp://192.168.0.9:11211" 
再或者在某个一个应用中: 
ini_set("session.save_handler", "memcache"); 
ini_set("session.save_path", "tcp://192.168.0.9:11211"); 
使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。 
1.3.4 测试 
<?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(); 
?> 

可以直接用sessionid 去 memcached 里查询一下: 
telnet 192.168.0.9 11211 
get 19216821213c65cedec65b0883238c278eeb573e077 
得到 
TEST|i:1177556731;TEST3|i:1177556881; 
这样的结果,说明session 正常工作 

用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是日本最大的社交类网站http://mixi.jp开发的开源应用,并已成功应用在mixi.jp中,值得研究。

java中的高速缓存和连接池对访问数据库性能的影响

一.初识高速缓存和连接池   设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好 了。通常,一杯水的产生包括从水源(井水、河水或江水、甚至海水等)抽取,通过管 道传输和设备净...
  • xxcc
  • xxcc
  • 2002-01-02 15:07:00
  • 2076

lvs中session共享配置.txt

  • 2009年05月18日 11:40
  • 826B
  • 下载

memcached-session-manager 教程实现session共享

1简介     1.1决定用什么序列化策略。     1.2配置tomcat         1.2.1添加 memcached-session-manager jar 包到tomcat中。     ...
  • leihelloworld
  • leihelloworld
  • 2014-05-10 18:34:23
  • 2144

Memcached-Session-Manager多tomcat实现session跨域共享配置jar包以及文档

  • 2017年08月23日 11:51
  • 4.48MB
  • 下载

Memcached-Session-Manager多tomcat实现session跨域共享配置

Memcached-Session-Manager多tomcat实现session跨域共享配置 当高并发出现的时候,我们通常想到的是使用nginx配置负载均衡来实现对多个服务器(tomcat部署应用)...
  • sanshipianyezi
  • sanshipianyezi
  • 2016-11-13 01:28:07
  • 1466

使用memcached实现tomcat集群中Session共享业务场景

业务场景描述: 有这样的业务架构,一台nginx将客户端请求分发到2台tomcat中,现在的问题是当tomcat1挂掉之后,nginx将请求转发到tomcat2中,此时tomcat2会要求用户重新登入...
  • chengyun19830206
  • chengyun19830206
  • 2016-06-23 21:57:55
  • 1044

采用Memcached实现分布式Session

memcached-session-manager是一个开源的高可用的Tomcat session共享解决方案,它支持Sticky模式和Non-Sticky模式。Sticky模式表示每次请求都会被映射...
  • u013256816
  • u013256816
  • 2016-04-06 19:29:37
  • 9361

使用Memcache实现Session共享(单点登录)的原理

使用Memcache实现Session共享(单点登录)的原理
  • u013905744
  • u013905744
  • 2016-10-11 14:22:21
  • 3001

tomcat使用memcached完成集群(session共享实现方式)

一.安装memcached 1.windows下安装memcached 需要到一个网站下载memcached的for win 32版本.在memcached的官方网站我是找不到的.我看了下,提...
  • wlg_442677903
  • wlg_442677903
  • 2016-11-03 17:39:24
  • 1424

Nginx+Memcached+Tomcat session会话共享实战

服务器说明:192.168.1.8 tomcat1 memcached(虚拟机1)192.168.1.9 tomcat2(虚拟机2)192.168.1.200 nginx (本机)对于tomcat+n...
  • hejingyuan6
  • hejingyuan6
  • 2016-03-12 21:19:55
  • 8312
收藏助手
不良信息举报
您举报文章:使用Memcached实现Session共享
举报原因:
原因补充:

(最多只允许输入30个字)