1:Session共享
为什么要实现共享,如果你的网站是存放在一个机器上,那么会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话
id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情
况,于是session的共享就成了一个问题。
2:Session一致性(共享)解决方案
1、session复制:tomcat 本身带有复制session的功能
2、共享session
– 需要专门管理session的软件memcached
– memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session
2.1:Linux安装memcached
1.Linux系统安装memcached,首先要先安装libevent库:yum install libevent libevent-deve
2.安装 Memcached:.yum -y install memcached
3.Memcached 启动运行:service memcached start
4.Memcached 测试连接:使用telnet 命令并指定主机ip和端口来连接 Memcached 服务。语法:telnet HOST PORT,HOST 和 PORT 为运行
Memcached 服务的 IP 和 端口
实例:演示如何连接到 Memcached 服务并执行简单的 set 和 get 命令
本实例的 Memcached 服务运行的主机为 127.0.0.1(本机) 、端口为 11211
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set foo 0 0 3 保存命令 3为长度 0为存活时间 bar 数据 STORED 结果 get foo 取得命令 VALUE foo 0 3 数据 bar 数据 END 结束行 quit 退出
2.2:Tomcat配置名称和session一致性配置(tomcat整合,让Tomcat从该缓从数据库中取session)
5.拷贝https://pan.baidu.com/s/1j8A5QbqZM7uZoCR0IHLRBQ中lib下的jar包到tomcat的lib下(分别是200和201web服务器连接Memcached的jar包)
6.修改Engine标签:tomcat的server.xml中配置jvmRoute属性(分别是200和201服务器)方便查看sessionid里面带有的Tomcat名字
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat200">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat201">
7.Tomcat首页面index.jsp配置:(分别是200和201服务器)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -----根据情况加,我加了报错了,去掉就好了 SessionID:<%=session.getId()%> <br/> SessionIP:<%=request.getServerName()%> <br/> <h1>tomcatxxx page</h1>
分别进行访问:http://192.168.232.201:8080/
http://192.168.232.200:8080/
8.修改Tomcat的context.xml文件,配置Manager
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.17.4:11211" #配置memcachedNodes属性:配置memcached数据库的IP和端口,默认11211,多个用空格隔开,目的让Tomcat从memcached缓从里面取放session sticky="false" lockingMode="auto" sessionBackupAsync="false" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />