在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种不同的方法来解决这个问题: 
一、利用数据库同步session 
在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法: 
1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。 
2,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。 
说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担 
二、利用cookie同步session 
session是文件的形势存放在服务器端的,cookie是文件的形势存在客户端的,怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session把它放到cookie里面了,你访问被分配到web服务器B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。 
说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。 
三、利用memcache同步session 
memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个"内存池",不管是哪个服务器产生的sessoin都可以放到这个"内存池"中,其他的都可以使用。 
优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。 
缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。 
四、总结 
上面三种方法都是可行的 
第一种方法,最影响系统速度的那种,不推荐使用; 
第二种方法,效果不错,不过安全隐患一样的存在; 
第三种方法,个人觉得第三种方法是最好的,推荐大家使用

================================================================

原理:多个服务器间想共享session,就相当于共享取多台主机上的一个变量,所以共享的思路就是让大家都能读取变量,实现的方法可以通过将session保存到专门的一个服务器上,所有服务器都去请求数据,也memcache实现session共享将这些服务器都配置成使用同一组Memcached服务器就可以,

一、提出问题:

为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够继续使用客户的Session?

二、解决方案:

1. 写客户端Cookie的方式

当用户登陆成功以后,把网站域名、用户名、密码、token、 session有效时间全部采用cookie的形式写入到客户端的cookie里面,如果用户从一台Web服务器跨越到另一台服务器的时候,我们的程序主动去检测客户端的cookie信息,进行判断,然后提供对应的服务,当然,如果cookie过期,或者无效,自然就不让用户继续服务了。当然,这种方法的弊端就不言而喻了,比如客户端禁用了cookie或者cookie被黑客窃取了呢?这些都可以解决,目前淘宝session框架就是基于client cookie做开发,不见得他们就出了很大的问题?也许是最可行的方式,可以配合memcached来实现。

2. 服务器之间Session数据同步的方式

假设Web服务器A是所有用户登陆的服务器,那么当用户验证登陆一下,session数据就会写到A服务器里,那么就可以自己写脚本或者守护进程来自动把session数据同步到其他Web服务器,那么当用户跳转到其他服务器的时候,那么session数据是一致的,自然就能够直接进行服务无须再次登陆了。缺点是,可能会速度慢,不稳定,如果是单向同步的话,登陆服务器出现问题,那么其他服务器也无法服务,当然也可以考虑双向同步的问题。这个方案都可以解决,目前zookeeper可以实现。

3. 利用NFS共享Session数据的方式

其实这个方案和下面的Mysql方案类似,只是存储方式不一 样。大致就是有一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台 NFS服务器上的,不论用户访问哪台Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。缺点是依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。这个方案都可以解决,目前zookeeper可以实现,当然memcached也可以实现session共享。

4. 利用Mysql数据库共享Session数据的方式

这个方式与NFS的方式类似,也是采用一台Mysql服务器做共享服务器,把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session 数据。缺点也是依赖性太强,Mysql无法工作了影响所有的Web服务器,当然,可以考虑多太Mysql数据库来共享session,使用同步Mysql 数据的方式。这种方式跟方式3类似,同样可以采用memcached来做,nosql也可以实现,这些都不是问题。

5. 使用硬件设备

这个算是比较成熟的解决方案了,使用类似BIG-IP的负载设备来实现资源共享,那么就能够又稳定又合理的的共享Session了。目前很多门户网站采用这种方式。缺点很明显了,就是要收费了,硬件设备肯定需要购买成本的,不过对于专业或者大型应用来讲,是比较合理并且值得的,这种方式可以放到最后面考虑。

使用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中,值得研究。

http://www.jb51.net/article/48744.htm

http://www.cnblogs.com/imhaiyang/articles/4949459.html

欢迎关注公众号:

【Session】多服务器节点间session共享相关推荐

  1. 基于Memcached的Nginx服务器集群session共享

    原料:jdk1.8,tomcat7,nginx1.16,memcached-1.2.6,Mem-Tomcat需要的jar包,基于windows7.所有的点击以下链接可下载 链接:https://pan ...

  2. session多服务器共享的方案梳理

    默认情况下,php的session文件是保存在磁盘文件中.在php.ini配置文件中的配置项如下: session.save_handler = files session.save_path = & ...

  3. web服务器集群(多台web服务器)后session如何同步和共享

    2019独角兽企业重金招聘Python工程师标准>>> 在访问量上去以后,很多人会采用web集群的方式在满足逐渐增长的用户量.这时候就不得不面对一个问题,那就是在多个服务器下,每次请 ...

  4. java多域名共享session_同一服务器不同域名session共享

    Tomcat下,不同的二级域名之间或根域与子域之间,Session默认是不共享的,因为Cookie名称为JSESSIONID的Cookie根域是默认是没设置 的,访问不同的二级域名,其Cookie就重 ...

  5. flask 不同应用间 session 共享,统一认证

    环境准备: python 2.7.11 redis==2.10.6 Flask==0.10.1 Flask-Session==0.3.1 redis-server 192.168.1.107 : 63 ...

  6. 微服务服务器集群Session管理演进史

    点击上方"JavaEdge",关注公众号 设为"星标",好文章不错过! 应用服务器的高可用设计主要基于服务无状态这一特性,但事实上,业务总 是有状态: 在电商网 ...

  7. tomcat实现session集群及tomcat+memcached共享session存储(四)

    接博客nginx或httpd实现负载均衡tomcat(三) tomcat实现会话管理原理及实现: tomcat管理会话使用的专用的会话管理组件,tomcat的会话管理器有4种: 1.标准会话管理器(S ...

  8. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  9. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  10. 完美解决WebSocket 服务器 The WebSocket session [0] has been closed and no method...异常信息

    最近项目需要web客户端与服务器保持长链接的场景并需要服务器向所有链接的客户端推送消息,于是自然使用了WebSocket技术,自然要考虑到服务器于多个客户端线程安全的问题.于是乎,想当然的在WebSo ...

最新文章

  1. 用netty实现zcool_Netty 如何玩转内存使用
  2. 网页素材大宝库:50套非常精美的图标素材
  3. 【MATLAB】基本绘图 ( 图形属性 | 绘图对象 | 图形属性界面 | 坐标轴属性 | 线属性 | 文本属性 | 图形属性设置策略 )
  4. [register]-ARM64重要寄存器介绍
  5. VTK:Shaders之ColorByNormal
  6. cef谷歌内核浏览器获取cookie值并保存
  7. SSH基本原理和免密码登录
  8. ECCV 2020 oral | 基于语义流的快速而准确的场景解析,在Cityscapes上达到80.4%mIoU,26 FPS...
  9. shell脚本--判断输入的ip是否正确
  10. 数据结构与算法-java笔记一 更新中
  11. Elasticsearch笔记三之版本控制和插件
  12. Java 实现word 中写入文字图片的解决方案
  13. VNX VMX and delete luns
  14. 用python写1加到100怎么写_python计算1到100的和
  15. openvpn下的路由和桥接模式
  16. 年产2000t搅拌型发酵酸奶车间工艺设计
  17. 一只喵的西行记-11 与大叔小萝莉的不打不相识
  18. 别让所谓的“富人思维”毁了你
  19. 数据仓库1-数仓的意义
  20. Eden和Survivor

热门文章

  1. 计算机电子设计论文,计算机毕业设计电子信息毕业设计电子信息毕业论文
  2. window10c语言软件下载,win10中文语言包下载
  3. Linux 中软件使用及常见问题 QA
  4. STM32F103C8T6单片机简介
  5. PDFLib库的使用c++
  6. python语言程序设计实验教程答案实验三_20194220 实验三《Python程序设计》实验报告...
  7. office visio 替代_5款替代微软Visio的开源免费软件
  8. R语言绘图大小及图例问题
  9. windows 消息
  10. BIM族库下载——Revit人物族