SpringBoot集成Redis哨兵模式

小编在我的其它博客文章中讲解了 Redis 主从复制,Redis哨兵模式,其实 Redis 主从复制有一个很大的缺点就是没有办法对 master 进行动态选举(当 master 挂掉后,会通过一定的机制,从 slave 中选举出一个新的 master)。然而Redis哨兵模式完美解决了这个缺点,实现集群高可用。

一、Redis哨兵模式

在这里插入图片描述 哨兵的作用:

1、通过发送命令,让Redis服务器返回其监控的运行状态,包括主服务器和从服务器。

2、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们自动选举切换为主服务器。

二、哨兵模式配置

小编这里配置了三台Redis,其中具体配置过程,请移步至小编的这两篇文章:

Redis主从复制配置(原理剖析)

Redis哨兵模式(原理剖析)

注明:最近小编,因为公司需要Redis配置哨兵集群,所以呢,我就回头看了之前的笔记,就是上面这两篇文章,其中,第一篇主从复制集群搭建,只要你仔细看,按照步骤搭建是完全没问题,有一些遗漏的问题,在这篇文章,我也会把详细的配置再配置一遍,包括第二篇哨兵配置需要注意的地方,下面也会再配置一遍。

下面是小编搭建好的三台服务器:

IP 类型 端口
192.168.31.6 主节点 6381
192.168.31.6 从节点 6382
192.168.31.6 从节点 6383

三、配置主从复制集群

下面小编就以我目前搭建好的Redis为列子,再配置一次:

1、拷贝三份配置文件,并修改名称:

在redis的安装目录bin目录下:(默认是 /usr/local/bin/目录下)创建dtconfig:

将默认的配置redis.conf 拷贝在这个目录下,分别备份三份:

cp redis.cnf redis81.conf
cp redis.cnf redis82.conf
cp redis.cnf redis83.conf

2、配置redis81.conf (其余82、83和这个配置一样)

主要配置:

#修改端口号
port 6381
#修改后台运行进程文件
pidfile "/var/run/redis_6381.pid"
#修改日志文件
logfile "6381.log"
#修改RDB持久化二进制文件名称
dbfilename "dump6381.rdb"
#设置默认后台启动
rdbchecksum yes
#修改Redis服务保护模式
protected-mode no
#设置IP(如果不设置,SpringBoot客户端哨兵模式无法连接,需要手动修改哨兵配置文件里面的主节点IP)
bind  192.168.31.6

注意: 最好设置IP,如果不设置,SpringBoot客户端哨兵模式无法连接,需要手动修改哨兵配置文件里面的主节点IP,如果服务宕机,主节点ip会自动切换为127.0.0.1,也就是本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。在之前小编配置,直接把bind 127.0.0.1注释了,导致SpringBoot配置哨兵模式,无法连接到主节点,也就是无法连接到127.0.0.1:主节点端口 这个地址,手动把主节点一个个改了回来。

另外其余两台也是一样的配置,这里小编就不多说了。

3、启动好三台机器

redis-server dtconfig/redis81.conf
redis-server dtconfig/redis82.conf
redis-server dtconfig/redis83.conf

3.1 选举Leader

分别在6382和6383上面执行手动选举,我们先先选举一个Leader.

SLAVEOF 192.168.31.6 6381

四、配置哨兵模式

4.1 新建sentinel.conf

也是在dtconfig新建sentinel.conf文件如下:

# 默认端口
port 26379
# sentinel monitor 被监控的名称 host port 1
sentinel monitor mymaster 192.168.31.6 6381 1
// 当前Sentinel节点监控 192.168.31.6:6381 这个主节点
// 1代表判断主节点失败至少需要1个Sentinel节点节点同意
// mymaster是主节点的别名

这里小编就只配置一台哨兵,作为开发测试。

4.2 启动哨兵

cd 到Redis的安装目录bin目录下执行如下命令:

redis-sentinel dtconfig/sentinel.conf

在这里插入图片描述

4.3 查看进程是否都正常

在这里插入图片描述

4.4 自动选举Leader

手动使得6381主节点宕机:

redis-cli -p 6381
SHUTDOWN
exit

查看监控信息:

在这里插入图片描述 自动选举6382为主节点,查看信息:

INFO replication

在这里插入图片描述 然后重启6381节点:

在这里插入图片描述

五、SpringBoot集成Redis哨兵

5.1 导入依赖包

<!--redis依赖包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
</dependency>

5.2 application.yml

spring:
  redis:
    ###################以下为redis单机模式配置###########################
    #host: 192.168.31.6 # Redis服务器地址
    #port: 6382         # Redis服务器连接端口
    database: 0        # Redis数据库索引(默认为0)
    password:          # Redis服务器连接密码(默认为空)
    timeout: 3000      # 连接超时时间(毫秒)
    ###################以下为redis哨兵增加的配置###########################
    sentinel:
      nodes: 192.168.31.6:26379
      master: mymaster
    lettuce:            # Redis的Java驱动包,使用lettuce连接池
      pool:
        max-active: 200 # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1    # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 10    # 连接池中的最大空闲连接 (默认为8)
        min-idle: 0     # 连接池中的最小空闲连接

注意:sentinel.nodes: 192.168.31.6:26379 这里小编只要一个哨兵,如果是多个哨兵,后面配置以逗号分隔即可。

5.3 测试类

 @Autowired
 private StringRedisTemplate stringRedisTemplate;

/**
 * set值测试
 */
@Test
public void testSetKey(){
    stringRedisTemplate.opsForValue().set("dt1","1");
    System.out.println(redisUtil.get("dt1"));
}

5.4 查看结果

在这里插入图片描述 在这里插入图片描述

5.5 问题抛出说明

当我们把主节点宕机之后,哨兵会自动选举,超过一定的投票数量,会选举出新的Leader。所以我们使用SpringBoot操作Redis哨兵模式,只需要Redis Sentinel 的基本参数配置:

 sentinel:
      nodes: 192.168.31.6:26379
      master: mymaster

即可自动切换主节点,进行信息写入,这个过程,用户是无感知的。这里抛出一个面试题。

在使用SpringBoot集成Redis哨兵模式,是怎么识别主节点ip,进行数据写入的?

后面的篇章我们会仔细讲解(欢迎小伙伴们下方评论)。

另外:比如一个从节点宕机了,此时主节点正在写数据,下次从节点上线之后,还能收到之前主节点的写入的信息吗?

答案:是的,当从节点复活以后,主节点会把信息同步给它。

总结

主节点master可读可写,从节点slave只能读;主节点将读的操作交给了从节点,变向的提高了自己写的能力。哨兵模式提高了Redis的高可用,还有很多很多的实现值得我们去深究,基于哨兵模式,后面小编将会写关于Redission分布式锁的实现,以及消息发布订阅,分布式事务实现等等,期待!!!

完结!!!


作者:DT辰白
链接:企业级开发SpringBoot集成Redis哨兵模式(全网最新) - 掘金