欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > Springboot(四十六)SpringBoot3整合redis并配置哨兵模式

Springboot(四十六)SpringBoot3整合redis并配置哨兵模式

2025/2/5 20:22:33 来源:https://blog.csdn.net/qq_39708228/article/details/144126475  浏览:    关键词:Springboot(四十六)SpringBoot3整合redis并配置哨兵模式

前边我有尝试在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  

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com