前边我有尝试在Springboot2.6框架中集成redis哨兵集群。但是呢,Springboot3中部署redis的配置和Springboot2中的配置完全不同。
我这里再来记录一下Springboot3中配置redis的全部代码。
上次我的redis是在centos服务器上直接安装的,这次在Springboot3的配置中,我的redis使用docker来部署。
一:docker部署redis和redis哨兵
安装docker这部分我就不介绍了,具体请移步《docker(一)linux安装docker》
安装redis就不需要使用dockerfile了,太麻烦了。这里直接使用docker命令来创建docker容器。
1:redis配置文件
(1)主机配置文件:
# 开启密码验证(可选)
requirepass xxxxx
# 允许Redis外部连接,需要注释掉绑定的IP
bind 0.0.0.0 -::1
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成daemonize no。因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败
daemonize no
# 开启Redis数据持久化(可选)
appendonly yes
# 开放端口
port 6379
我这里的配置比较简单,能用的上的就是这些。其余的配置如果需要请自行添加。
(2)从机配置文件
# 开启密码验证(可选)
requirepass xxxxx
# 允许Redis外部连接,需要注释掉绑定的IP
bind 0.0.0.0 -::1
# 关闭保护模式(可选)
protected-mode no
# 注释掉daemonize yes,或者配置成daemonize no。因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败
daemonize no
# 开启Redis数据持久化(可选)
appendonly yes
# 开放端口
port 6380
# 配置主机
replicaof 你的ip 6379
# 配置主机密码
masterauth xxxxx
这里需要注意两个注意点:
(1):daemonize 需要配置为no。因为该配置和docker run中的-d参数冲突,会导致容器一直启动失败
(2):从节点的配置文件有点坑,最好是不要使用同一个端口,比如master使用了6379,slave容器就需要使用其他端口(6380)。尽管容器是互相隔离的,但网络通信这一块,会有问题。
我开始都使用了6379,映射宿主机的不同端口上,主从同步时是没有问题的,但是当主节点下线,或者重新加入节点时,哨兵节点会无法区分各个容器的。
虽然各个容器分配的ip不同,但sentinel通信时都使用了容器内部的回环地址172.17.0.1,这里可能是个bug。容器内直接使用不同端口,可以规避这个问题。我这里直接使用6379,6380,6381
2:创建docker容器命令:
1) docker run -d -p 6379:6379 --name redis-master -v /opt/docker/redis/data/79:/data -v /opt/docker/redis/conf/redis79.conf:/etc/redis/redis.conf --privileged -d redis:7.4.0 redis-server /etc/redis/redis.conf
2) docker run -d -p 6380:6380 --name redis-slave-one -v /opt/docker/redis/data/80:/data -v /opt/docker/redis/conf/redis80.conf:/etc/redis/redis.conf --privileged -d redis:7.4.0 redis-server /etc/redis/redis.conf
3) docker run -d -p 6381:6381 --name redis-slave-two -v /opt/docker/redis/data/81:/data -v /opt/docker/redis/conf/redis81.conf:/etc/redis/redis.conf --privileged -d redis:7.4.0 redis-server /etc/redis/redis.conf
3:配置redis-sentinel容器
# 允许ip和端口
bind 0.0.0.0
port 26379
# 哨兵监听的ip和端口
sentinel announce-ip 127.0.0.1
# 后面的2 表示有2个哨兵认为主库挂了就是客观下线
# 主节点挂了 就会开始选举
sentinel monitor mymaster 127.0.0.1 6379 2
# 密码
sentinel auth-pass mymaster xxxxx
# 5000 表示每5秒钟检测一次主库是否挂掉
sentinel failover-timeout mymaster 5000
# linux中 解除redis保护 允许外部连接
protected-mode no
# 后台访问 这个参数 yes 会和docker run 命令冲突 导致redis 启动失败
daemonize no
# 主节点或副本在指定时间内没有回复PING,便认为该节点为主观下线 S_DOWN 状态。 默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 安全
# 避免脚本重置,默认值yes
# 默认情况下,SENTINEL SET将无法在运行时更改notification-script和client-reconfig-script。
# 这避免了一个简单的安全问题,客户端可以将脚本设置为任何内容并触发故障转移以便执行程序。
sentinel deny-scripts-reconfig yes
4:创建docker-sentinel容器命令:
1) docker run -d -p 26379:26379 --name redis-sentinel-one -v /opt/docker/redis/conf/sentinel26379.conf:/etc/redis/sentinel.conf -v /opt/docker/redis/sentinel/26379:/data -d redis:7.4.0 redis-sentinel /etc/redis/sentinel.conf
2) docker run -d -p 26380:26380 --name redis-sentinel-two -v /opt/docker/redis/conf/sentinel26380.conf:/etc/redis/sentinel.conf -v /opt/docker/redis/sentinel/26380:/data -d redis:7.4.0 redis-sentinel /etc/redis/sentinel.conf
3) docker run -d -p 26381:26381 --name redis-sentinel-three -v /opt/docker/redis/conf/sentinel26381.conf:/etc/redis/sentinel.conf -v /opt/docker/redis/sentinel/26381:/data -d redis:7.4.0 redis-sentinel /etc/redis/sentinel.conf
我这里创建三个哨兵,redis高可用,redis-sentinel也要高可用。
5:测试一下哨兵是否好用
配置了6379端口是主机。6379的配置文件中就不需要配置主机信息:
# 配置主机
replicaof 127.0.0.1 6379
# 配置主机密码
masterauth xxxxxx
但是,现在将6379关机,哨兵会自动选取新的主机,这个时候,再将6379开机,就需要手动修改一下6379的配置文件,主机信息加入到配置文件中:
# 配置主机(假设哨兵选举的新主机是6381)
replicaof 127.0.0.1 6381
# 配置主机密码
masterauth xxxxx
二:Springboot3集成redis-sentinel
1:添加pom依赖
<!-- springboot redis start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!-- Spring集成Redis组件 -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
</dependency><!-- redis链接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2:application.yml配置
spring:
data:
redis:
# 超时时间
timeout: 10000
# 使用的数据库索引,默认是0
database: 0
#host: 127.0.0.1
#port: 6379
# 密码
password: 密码
###################以下为red1s哨兵增加的配置###########################
sentinel:
master: mymaster # 哨兵主节点名称,自定义
nodes: ip:port, ip:port, ip:port
password: 密码
##################以下为]ettuce连接池增加的配置###########################
lettuce:
pool:
max-active: 100