步骤 2 : 解决办法一: ip_hash 步骤 3 : 解决办法二: redis+tomcat-sessoin-manager 步骤 4 : 接下来进行具体操作 步骤 5 : 启动redis 步骤 6 : jar包 步骤 7 : 修改context.xml 步骤 8 : 重启tomcat 步骤 9 : 测试访问tomcat8111 步骤 10 : 测试访问tomcat8222 步骤 11 : 下载已经配置好了的tomcat
通过负载均衡课程,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力,但是这里存在一个问题: 当同一个用户第一次访问tomcat_8111 并且登录成功, 而第二次访问却被分配到了tomcat_8222, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡 session问题了. 处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。 不过这种方案并不完美,当如下几种情况发生时就有问题: 1. 大量请求来之某个局域网,那么相当于就没有负载均衡了 2. 如果tomcat_8111 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。
既然第一种解决办法有问题,那么就采用第二种解决办法:用Redis来存取session.
Redis是什么呢?说简单点就是个独立的Hashmap,用来存放键值对的。 这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。 那么考虑这个情景: 1. 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。 2. 当用户第二次访问的时候,被分配到了tomcat8222上 3. 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。 这样就规避了解决办法一: ip_hash里会出现的两种问题了。 注: 对 redis 不熟悉的同学,请先了解下 redis教程
接下来进行具体操作,分几个步骤
1. 启动redis 2. 给两个tomcat使用jar包 3. 配置两个tomcat 4. 重启两个tomcat 5. 测试
下载右上角的redis-2.4.5-win32-win64.zip,解压后运行对应(32位或者64位)的redis-server.exe程序
Tomcat需要链接 redis,所以需要专门的jar包,这些包都放在了右上角的tomcat-redis.rar里。 一共有3个jar包:
jedis-2.5.2.jar, commons-pool2-2.0.jar, tomcat-redis-session-manager1.2.jar。 下载解压后,放在tomat8111的lib目录下。注:不要放在webapp里面去了哦 下载解压后,放在tomat8222的lib目录下。注:不要放在webapp里面去了哦 两个tomcat都要放
然后修改tomcat/conf/context.xml ,增加下面这坨东西
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="127.0.0.1" port="6379" database="0" maxInactiveInterval="60" /> 两个tomcat都要改 <?xml version='1.0' encoding='utf-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />
</Context>
两个tomcat都要重启
Redis session共享机制和nginx其实无关,是发生在nginx之后的事情,所以直接访问login.jsp,然后登陆,并观察到已登陆状态
http://127.0.0.1:8111/login.jsp
然后直接访问tomcat8222
http://127.0.0.1:8222/login.jsp 虽然没有在tomcat8222上登陆,但是可以观察到已经呈现为登陆状态了
如果对上述tomcat配置办法吃不准,请直接使用右上角的已经配置好了的:tomcat-redis-8111-8222.rar
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2021-09-02
退出登陆的话,redis数据还在吗
3 个答案
写bug的程序猿 跳转到问题位置 答案时间:2023-03-22 看你代码咋写了,你要是设置的-1,代码中还没删除,就会一直存在
市长 跳转到问题位置 答案时间:2023-03-03 退出登录的接口,在后台Java代码把对应的Redis中的key清掉,这样redis中的数据不就没有了吗
王二小 跳转到问题位置 答案时间:2021-09-20 redis可以做持久化操作滴
RDB 持久化: 生成某个时间点的快照文件
AOF 持久化(append only file): 日志追加模式(Redis协议格式保存)
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-10-07
可能页面会出现redis连接超时的异常
2020-09-25
请教127.0.0.1和localhost的区别
2020-04-05
站长,如果是springboot项目中,打包成jar包,如何添加缓冲实现session共享了
2020-02-14
其中一个tomcat登出,另一个刷新并没有登出
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 15 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|