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  
<think>好的,用户想在Spring Boot整合Redis哨兵模式。我需要先回顾一下相关的知识,确保步骤正确。首先,记得Redis哨兵模式是用来实现高可用性的,当主节点故障时,哨兵会自动选举新的主节点。 首先,用户需要添加Redis的依赖。Spring Boot通常使用spring-boot-starter-data-redis,这个依赖包含了Lettuce和Jedis客户端。不过现在默认是Lettuce,如果需要用Jedis的话,可能需要排除Lettuce引入Jedis的依赖。这点需要确认,但用户的问题可能不需要具体到客户端选择,所以先提基本的依赖。 接下来是配置文件。在application.yml或application.properties中配置Redis哨兵的相关信息。关键的配置项包括哨兵节点的地址、主节点的名称,以及可能的密码和数据库编号。例如,spring.redis.sentinel.master设置主节点名称,spring.redis.sentinel.nodes列出所有哨兵的地址和端口。 然后,可能需要配置Redis连接工厂,比如使用JedisConnectionFactory或者LettuceConnectionFactory,具体取决于使用的客户端。不过Spring Boot可能已经自动配置了这些,用户只需要正确设置属性即可。如果用户需要自定义配置,比如连接池参数,这时候可能需要手动创建配置类。 另外,用户可能需要了解如何测试哨兵配置是否生效。例如,可以编写一个测试用例,尝试连接Redis执行一些操作,然后模拟主节点故障,看看应用是否能自动切换到新的主节点。不过这可能超出基础整合的范围,属于进阶内容。 还要考虑密码的情况。如果Redis设置了密码,需要在配置中添加spring.redis.password属性。同时,哨兵本身可能有独立的密码,这时候可能需要额外的配置,比如在spring.redis.sentinel.password中设置。这点需要根据Redis的版本和Spring Boot的支持情况来确认,不同版本可能有不同的配置方式。 用户可能还关心如何验证配置是否正确。可以启动应用,查看日志是否有连接哨兵的记录,或者通过健康检查端点/actuator/health查看Redis的状态。另外,使用RedisTemplate进行操作时,如果能够成功读写,说明配置正确。 另外,记得在配置哨兵节点时,每个节点的格式是host:port,多个节点用逗号分隔。例如,spring.redis.sentinel.nodes=sentinel1:26379,sentinel2:26380,sentinel3:26381。 最后,可能还需要提示用户关于版本兼容性的问题,不同版本的Spring BootRedis的支持可能有差异,建议查看官方文档或者参考引用的教程视频,比如提到的雷丰阳的课程,确保配置方法与当前使用的Spring Boot版本兼容。 总结步骤应该是:添加依赖→配置哨兵信息→测试连接。过程中要注意配置项的正确性,以及可能需要的客户端选择。如果有高级需求,比如连接池设置或异常处理,可能需要进一步配置。</think>以下是在Spring Boot整合Redis哨兵模式的实现步骤: ### 1. 添加依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 推荐使用Spring Boot 2.7.x及以上版本,支持更完善的哨兵配置[^2]。 ### 2. 配置哨兵信息 ```yaml spring: redis: password: your-redis-password sentinel: master: mymaster # 主节点名称 nodes: - sentinel1:26379 - sentinel2:26380 - sentinel3:26381 password: sentinel-password # 哨兵服务密码(可选) ``` ### 3. 配置连接工厂 ```java @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory( RedisSentinelConfiguration sentinelConfig) { return new JedisConnectionFactory(sentinelConfig); } } ``` ### 4. 使用RedisTemplate ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void setValue(String key, Object value) { redisTemplate.opsForValue().set(key, value); } ``` ### 关键特性说明: 1. **自动故障转移**:当主节点不可用时,哨兵会自动选举新主节点 2. **读写分离**:通过`@ReadOnly`注解实现只读操作路由到从节点 3. **拓扑刷新**:默认每10秒自动更新节点状态信息[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值