本手册整合单节点 Redis、3 节点 Redis 哨兵集群、3 节点 Redis Cluster 集群 三种部署方案,搭配 Redisson 实现 Tomcat Session 共享 + Nginx 负载均衡,所有配置可直接落地,适配redisson-all-3.20.0.jar+redisson-tomcat-9-3.20.0.jar,兼顾测试与生产场景。
一、核心架构与环境准备
1. 核心架构逻辑
| 组件 | 角色与作用 |
|---|---|
| Nginx | 前端反向代理,实现 Tomcat 集群负载均衡,转发客户端请求 |
| Tomcat 集群 | ≥2 个节点,提供相同 Web 服务,通过 Redisson 将 Session 存储到 Redis |
| Redisson | Tomcat 与 Redis 的中间件,支持单节点 / 集群 Redis,实现 Session 分布式共享 |
| Redis | 三种部署模式:单节点(测试)、3 节点哨兵(中小规模高可用)、3 节点 Cluster(大规模分片) |
2. 组件版本与依赖
| 组件 | 推荐版本 | 必备资源 |
|---|---|---|
| JDK | 1.8+ | 所有 Tomcat 节点版本一致 |
| Tomcat | 9.0/8.5 | Tomcat9 用redisson-tomcat-9,Tomcat8.5 用redisson-tomcat-8 |
| Nginx | 1.18+ | 无额外依赖 |
| Redis | 5.0+/6.0+ | 单节点 / 3 节点集群部署 |
| Redisson 包 | 3.20.0 | 1. redisson-all-3.20.0.jar:https://repo1.maven.org/maven2/org/redisson/redisson-all/3.20.0/redisson-all-3.20.0.jar2. redisson-tomcat-9-3.20.0.jar:https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-9/3.20.0/redisson-tomcat-9-3.20.0.jar |
3. 前置操作
- 将两个 Redisson 包放入所有 Tomcat 节点 的
{CATALINA_HOME}/lib目录,执行chmod 644 redisson-*.jar赋予可读权限; - 所有节点网络互通:Nginx 能访问 Tomcat,Tomcat 能访问 Redis。
二、Redis 部署方案(3 种,含 3 节点集群)
方案 1:Redis 单节点(测试环境)
1. 配置文件(/etc/redis/redis-6379.conf)
bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis-6379.log
dir /var/lib/redis/6379
# 安全与持久化
requirepass 123456
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
2. 启动与验证
# 创建数据目录
mkdir -p /var/lib/redis/6379 && chown -R redis:redis /var/lib/redis/
# 启动Redis
redis-server /etc/redis/redis-6379.conf
# 验证连接
redis-cli -p 6379 -a 123456 ping # 返回PONG即成功
方案 2:Redis 3 节点哨兵集群(1 主 2 从,中小规模高可用)
1. 节点规划(3 台 Redis,无额外哨兵节点,测试用简化版)
| 角色 | 端口 | 配置文件 | 数据目录 |
|---|---|---|---|
| 主节点 | 6379 | redis-6379.conf | /var/lib/redis/6379 |
| 从节点 1 | 6380 | redis-6380.conf | /var/lib/redis/6380 |
| 从节点 2 | 6381 | redis-6381.conf | /var/lib/redis/6381 |
2. 配置文件
主节点(redis-6379.conf):同单节点配置,无需修改
从节点 1(redis-6380.conf):新增主节点指向
# 其余配置同主节点,仅新增/修改以下内容
port 6380
pidfile /var/run/redis_6380.pid
logfile /var/log/redis/redis-6380.log
dir /var/lib/redis/6380
# 指向主节点
slaveof 127.0.0.1 6379
从节点 2(redis-6381.conf):同理修改
port 6381
pidfile /var/run/redis_6381.pid
logfile /var/log/redis/redis-6381.log
dir /var/lib/redis/6381
slaveof 127.0.0.1 6379
3. 启动与验证
# 创建数据目录
mkdir -p /var/lib/redis/6379 /var/lib/redis/6380 /var/lib/redis/6381 && chown -R redis:redis /var/lib/redis/
# 启动所有节点
redis-server /etc/redis/redis-6379.conf
redis-server /etc/redis/redis-6380.conf
redis-server /etc/redis/redis-6381.conf
# 验证主从同步
redis-cli -p 6379 -a 123456 info replication # 显示connected_slaves:2即成功
方案 3:Redis 3 节点 Cluster 集群(3 主无从,测试用简化版)
1. 节点规划
| 角色 | 端口 | 配置文件 | 数据目录 |
|---|---|---|---|
| 主节点 1 | 7000 | redis-7000.conf | /var/lib/redis/7000 |
| 主节点 2 | 7001 | redis-7001.conf | /var/lib/redis/7001 |
| 主节点 3 | 7002 | redis-7002.conf | /var/lib/redis/7002 |
2. 配置文件(以 7000 为例,其余仅改端口)
bind 0.0.0.0
protected-mode no
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/redis-7000.log
dir /var/lib/redis/7000
# 安全配置
requirepass 123456
masterauth 123456
# Cluster核心配置
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
cluster-require-full-coverage yes
# 持久化
appendonly yes
appendfilename "appendonly-7000.aof"
3. 启动与创建集群
# 创建数据目录
mkdir -p /var/lib/redis/7000 /var/lib/redis/7001 /var/lib/redis/7002 && chown -R redis:redis /var/lib/redis/
# 启动所有节点
redis-server /etc/redis/redis-7000.conf
redis-server /etc/redis/redis-7001.conf
redis-server /etc/redis/redis-7002.conf
# 创建3主Cluster集群
redis-cli -a 123456 --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0
# 验证集群状态
redis-cli -c -p 7000 -a 123456 cluster info # 显示cluster_state:ok即成功
三、Redisson 配置(适配所有 Redis 模式,2 种格式)
将配置文件放入所有 Tomcat 节点 的{CATALINA_HOME}/conf目录,根据 Redis 模式选择对应配置。
1. YAML 格式配置(推荐)
(1)适配 Redis 单节点:redisson-single.yaml
singleServerConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: "123456"
address: "redis://127.0.0.1:6379"
database: 0
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
(2)适配 Redis 3 节点哨兵集群:redisson-sentinel.yaml
sentinelServersConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: "123456"
sentinelAddresses:
- "redis://127.0.0.1:6379"
- "redis://127.0.0.1:6380"
- "redis://127.0.0.1:6381"
masterName: "mymaster"
database: 0
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
(3)适配 Redis 3 节点 Cluster 集群:redisson-cluster.yaml
clusterServersConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: "123456"
nodeAddresses:
- "redis://127.0.0.1:7000"
- "redis://127.0.0.1:7001"
- "redis://127.0.0.1:7002"
scanInterval: 1000
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
2. JSON 格式配置(与 YAML 等价)
(1)单节点:redisson-single.json
{
"singleServerConfig": {
"password": "123456",
"address": "redis://127.0.0.1:6379",
"database": 0
},
"threads": 16,
"nettyThreads": 32,
"codec": {"class":"org.redisson.codec.JsonJacksonCodec"}
}
(2)哨兵集群 / Cluster 集群:将 YAML 对应字段转为 JSON 结构即可,此处省略
四、Tomcat 集群配置(核心:Session 共享)
1. Tomcat 端口区分(2 节点为例,避免冲突)
修改{CATALINA_HOME}/conf/server.xml,调整 3 个核心端口:
| Tomcat 节点 | 关闭端口 | HTTP 端口 | AJP 端口 |
|---|---|---|---|
| Tomcat1 | 8005 | 8080 | 8009 |
| Tomcat2 | 8006 | 8081 | 8010 |
2. 启用 Redisson Session 共享(所有 Tomcat 节点一致)
编辑{CATALINA_HOME}/conf/context.xml,在<Context>标签内添加配置,根据 Redis 模式选择对应 configPath:
<Context>
<Manager className="org.redisson.tomcat.RedissonSessionManager"
<!-- 单节点 -->
configPath="${catalina.base}/conf/redisson-single.yaml"
<!-- 哨兵集群 -->
<!-- configPath="${catalina.base}/conf/redisson-sentinel.yaml" -->
<!-- Cluster集群 -->
<!-- configPath="${catalina.base}/conf/redisson-cluster.yaml" -->
readMode="REDIS"
updateMode="AFTER_REQUEST"
/>
</Context>
3. 统一 Session 超时时间
编辑{CATALINA_HOME}/conf/web.xml,设置与 Redisson 一致的超时时间:
<session-config>
<session-timeout>30</session-timeout> <!-- 30分钟 -->
</session-config>
4. 启动 Tomcat 并验证
# 启动Tomcat节点
cd /usr/local/tomcat8080/bin && ./startup.sh
cd /usr/local/tomcat8081/bin && ./startup.sh
# 查看日志,确认无Redis连接错误
tail -f /usr/local/tomcat8080/logs/catalina.out
五、Nginx 负载均衡配置
1. 核心配置(/usr/local/nginx/conf/nginx.conf)
http {
# Tomcat集群上游配置
upstream tomcat_cluster {
server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
2. 启动与验证
# 检查配置
/usr/local/nginx/sbin/nginx -t
# 启动/重启
/usr/local/nginx/sbin/nginx -s reload
六、整体功能验证(通用步骤)
1. 制作测试页面
在所有 Tomcat 的webapps/ROOT目录下创建test-session.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.net.InetAddress" %>
<html>
<body>
<h1>Nginx+Tomcat+Redis Session共享测试</h1>
<p>【SessionID】:<%= session.getId() %></p>
<p>【当前Tomcat】:<%= InetAddress.getLocalHost().getHostAddress() + ":" + request.getServerPort() %></p>
<p>【是否新Session】:<%= session.isNew() ? "是" : "否(共享成功)" %></p>
</body>
</html>
2. 验证标准
- 浏览器访问
http://Nginx_IP/test-session.jsp; - 刷新页面:SessionID 始终不变,Tomcat 节点在 8080/8081 间切换 → Session 共享成功;
- Redis 端验证:执行
keys redisson:session:*,能查到与页面一致的 Session 键 → 存储成功; - 高可用验证(集群模式):停掉 Redis 主节点,等待 5 秒后刷新页面,SessionID 仍不变 → 故障转移生效。
七、全局避坑指南(必看)
- Redisson 包版本匹配 :Tomcat9 必须用
redisson-tomcat-9,版本不匹配会导致 Tomcat 启动失败; - Redis 密码一致性:所有 Redis 节点、Redisson 配置的密码必须相同,否则连接拒绝;
- 配置文件路径 :Redisson 配置文件需放在 Tomcat 的
conf目录,configPath用${catalina.base}/conf/xxx.yaml; - 防火墙开放端口:生产需开放 Nginx80、Tomcat8080/8081、Redis 对应端口(6379/6380/6381 或 7000-7002);
- Session 对象序列化 :自定义对象存入 Session 需实现
java.io.Serializable接口,否则序列化失败; - Redis 持久化:所有模式均需开启 AOF+RDB,防止 Redis 重启丢失 Session 数据。