推荐:Nginx 会话黏着一致性解决
关于session共享有四种方案
1), tomcat广播, 对系统资源占用较大, 占用io流, 不推荐使用
2), 使用memcache
3), 使用redis, 安装第三方库,
4), 使用tengine的cookie一致性解决
5) 使用nginx的sticky cookie第三方开发包。
本文只讲后面四种方式。其中4) 和5)原理一样。
2, 使用memcached作为session管理
2.1) 安装memcached
yum -y install memcached
2.2) 测试memcached是否安装成功, 使用telnet, 没有的话yum安装
telnet localhost 11211
会显示:
然后:
set abc 0 0 5 12345
出现STORED表示memcached安装成功
2.3) tomcat下安装jar, 拷贝到 CATALINA_HOME/lib 目录下,
2.4) 更改tomcat配置
vim ./conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.208.102:11211" sticky="false" lockingMode="auto" sessionBackupAsync="false" sequestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
之后启动tomcat, 既可以看到sessionID已经不变了
3, 使用redis解决session一致性问题
配置和memcached基本类似
3.1) 安装redis
yum install redis
启动
service redis start
3.2) 修改reids.conf 中的 bind, 否则只能使用localhost访问
vim /etc/redis.conf bind 192.168.208.102
3.3), 在 CATALINA_HOME/conf/context.xml 中添加配置
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="192.168.208.102" port="6379" database="0" maxInactiveInterval="60" />
3.4) 将redis和tomcat的session-manager jar包导入
此时启动tomcat, 就可以完成session一致性问题了
4, 使用tengine的会话保持功能实现
tengine提供了cookie保持功能, 即客户端访问一台服务器后, 始终指向该台服务器, 相当于粘滞功能
此种情况, 分配的那台tomcat挂了以后, 就不能狗保持回话一致了, 因此并不为一种可靠的解决方案。
此外, 使用memcached或redis时, 如果不想安装插件, 可在代码中直接操作缓存来存储和取出数据, 相当于session, 为一种比较可靠的一致性解决方案。
使用淘宝的 tgenine 和使用nginx的sticky cookie第三方开发包原理一样。
关于使用nginx的sticky
cookie第三方开发包设置文章,请详见http://blog.****.net/bigtree_3721/article/details/78007744