redis的哨兵配置

前沿:参考文章

Redis哨兵(Sentinel)模式

docker配置Redis哨兵Sentinel模式

Redis Sentinel Documentation

一、redis的一主二从三哨兵配置

总览:这里redis.conf中默认端口为6379,sentinel.conf中默认端口为26379,具体如下关系

服务类型 是否是主服务器 IP 端口
Redis 192.168.108.4 6379
Redis 192.168.108.5 6379
Redis 192.168.108.6 6379
Sentinel - 192.168.108.4 26379
Sentinel - 192.168.108.5 26379
Sentinel - 192.168.108.6 26379

要明白,哨兵(sentinel)也是会启动一个服务的,其实最后会有6个服务

1.1、 一主二配置

  • 配置一主 192.168.108.4(master)
    在redis.conf中修改配置文件如下
# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码 设置客户端连接服务端时需要填写密码
requirepass "123456"
# 主服务器(192.168.108.4)连接密码
masterauth 123456

这里既然(192.168.108.4)自己是master,为什么还要配置连接(master)的密码呢,因为如果master(192.168.108.4)出现了故障,此时哨兵(sentinel)就会执行故障转移,假如执行故障转移后master为192.168.108.5,如果此时的环境一直在运行,那么没有问题,但是一旦你把整个服务停止,再次启动,因为现在192.1368.108.5为master,所以192.168.108.4需要取连接192.168108.5,就需要密码了,所以为了方便,每个服务需要验证的密码一致,并且每个服务都配置了密码,这样无论谁是master,其它服务器的redis都可以通过密码登陆

  • 配置二从 192.168.108.5 (slave1),192.168.108.6 (slave2)
# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码 设置客户端连接服务端时需要填写密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.108.4 6379
# 主服务器(192.168.108.4)连接密码
masterauth 123456
  • requirepass 在主服务器中,为了设置身份验证密码,并确保实例将不处理对未经身份验证的客户端的请求。
  • masterauth 为了使副本能够与主服务器进行身份验证,以便正确地从副本中复制数据,请在副本中进行复制。

即使是slave,但也是服务端(这是备用的,所以也需要设置连接密码,密码需要一致),并且设置它们是从,指定主(master)的地址,因为从服务端需要同步数据,所以是需要知道连接主(master)的连接密码的

此时主从就已经配置好了,在master(192.168.108.4)中设置值,在从(192.168.108.5,192.168.108.6)中都可以查到

二、redis配置哨兵

配置3个哨兵,每个哨兵的配置都是一样的。在Redis安装目录下有一个sentinel.conf文件,copy一份进行修改,这里的配置文件可以参考官方文档,说的挺详细的 点击跳转

# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.108.4代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.108.4 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

为了在使用进行配置时,哨兵能够连接到Redis服务器实例requirepass,Sentinel配置必须包括 sentinel auth-pass指令,格式为:

sentinel auth-pass

配置项 参数类型 作用
sentinel down-after-milliseconds <服务名称><毫秒数(整数)> 指定哨兵在监控Redis服务时,当Redis服务在一个默认毫秒数内都无法回答时,单个哨兵认为的主观下线时间,默认为30000(30秒)
sentinel parallel-syncs <服务名称><服务器数(整数)> 指定可以有多少个Redis服务同步新的主机,一般而言,这个数字越小同步时间越长,而越大,则对网络资源要求越高
sentinel failover-timeout <服务名称><毫秒数(整数)> 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
sentinel notification-script <服务名称><脚本路径> 指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,比较常用
  • 启动
    请务必开启端口,或者关闭防火墙
    启动时,指定配置文件,使得我们刚刚配置的属性生效
# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf

启动时,首先启动三个节点的server 192.168.108.4 ,192.168.108.5,192.168.108.6
此时master(192.1368.108.4),如下
redis的哨兵配置_第1张图片
其余的副本节点(192.168.108.5以及192.168.108.6)
redis的哨兵配置_第2张图片

  • 再启动三个节点的sentinel 192.168.108.4 ,192.168.108.5,192.168.108.6
    启动三个Sentinel后,可以看到它们记录的一些消息,例如:

monitor master mymaster 127.0.0.1 6379 quorum 2

redis的哨兵配置_第3张图片

三、测试

向Sentinel询问主机状态,检查其监视的主服务器是否运行良好,但是此时使用客户端连接时,需要认证,否则无法使用命令
在这里插入图片描述
输入自己前面配置的密码

AUTH 123456

但是我们不用连接server,即6379的端口,我们连接26379(Sentinel默认配置中开启的端口)

/usr/local/bin/redis-cli -p 26379

向Sentinel询问主机状态,检查其监视的主服务器是否运行良好:

[root@localhost redis-5.0.7]# /usr/local/bin/redis-cli -h 192.168.108.4  -p 26379
192.168.108.4:26379>  sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.108.4"
 5) "port"
 6) "6379"
 7) "runid"
 8) "81510908fa2b5442fac3570ca7107bc7523966f5"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "155"
19) "last-ping-reply"
20) "155"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "1959"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "1096727"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> 

它会打印许多有关主(master)的信息。以下是我们特别感兴趣的一些:
num-other-sentinels是2,因此我们知道Sentinel已经为该主机检测到了另外两个Sentinels。如果查看日志,将看到+sentinel生成的事件。
flags就是master。如果主机掉线了,我们也可以在这里看到s_down或o_down标记。
num-slaves 正确设置为2,因此Sentinel也检测到我们的主有附加的副本。
为了进一步了解此实例,你也可能需要尝试以下两个命令:

SENTINEL slaves mymaster
SENTINEL sentinels mymaster

作用请自行百度

  • 获取当前主机的地址

正如我们已经指定的那样,Sentinel还充当要连接到一组主副本和副本副本的客户端的配置提供程序。由于可能的故障转移或重新配置,客户端不知道谁是给定实例集的当前活动主服务器,因此Sentinel有如下API来确定问题:

192.168.108.4:26379> SENTINEL get-master-addr-by-name mymaster
1) "192.168.108.4"
2) "6379"
  • 测试故障转移
    此时,我们的Sentinel部署已准备好进行测试。我们可以杀死主(192.168.108.4)服务器,然后检查配置是否发生了变化。为此,我们可以这样做:
[root@localhost ~]# /usr/local/bin/redis-cli -h 192.168.108.4 -p 6379
192.168.108.4:6379> auth 123456
OK
192.168.108.4:6379> DEBUG sleep 60

这个命令将使我们的master不再可用,睡眠60秒。出于某种原因,它基本上模拟了主悬挂。(需要等待60秒左右)

如果查看Sentinel日志,我们则应该可以看到很多操作:
redis的哨兵配置_第4张图片
sentinel down-after-milliseconds配置项只是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用(sdown)。对于其他哨兵而言,并不是这样认为。哨兵会记录这个消息,当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover,此时哨兵会重写Redis的哨兵配置文件,以适应新场景的需要(odown)

如果我们再次查看的当前主地址IP是什么(mymaster),最总结果变为192.168.108.5

192.168.108.4:26379> SENTINEL get-master-addr-by-name mymaster
1) "192.168.108.5"
2) "6379"

redis的哨兵配置_第5张图片

四、springboot配置哨兵

在application.yml或者application.properties文件中,配置哨兵,如下

spring:
  redis:
    host: 192.168.108.4
    port: 6379
    password: 123456
    sentinel:
      master: mymaster  # mymaster代表服务器的名称 之前配置的
      nodes: 192.168.108.4:26379,192.168.108.5:26379,192.168.108.6:26379  # 三个哨兵的地址

使用,和之前没有区别

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    @GetMapping(value = "/testSentinel/{id}")
    @ResponseBody
    public String testSentinel (@PathVariable Integer id){
        stringRedisTemplate.opsForValue().set("id",id+"");
        return "testSentinel";
    }

使用浏览器请求,那么就会在redis中设置id的值
redis的哨兵配置_第6张图片
随意登陆一个redis,查看如下
redis的哨兵配置_第7张图片
以上可以证明正常情况下没有问题,接下来测试如果测试挂掉,springboot项目会不会受到影响,按照之前的逻辑使用 ,DEBUG sleep 60 使当前的master(192.1368.108.5)睡眠,此时matser变为192.168.108.6
在这里插入图片描述
再次请求,设置id为80
redis的哨兵配置_第8张图片
查看redis,可以看到被设置为80,而且此时的主机为192.1368.25.6,也没有影响
redis的哨兵配置_第9张图片

呃呃呃,但是在redis的哨兵正在切换时,不知道会不会影响,这个还没有测过

关于redis集群与哨兵的区别,官网也给出了说明
Redis Sentinel和Redis Cluster自动分区。都是提供redis的高可用性,但是redis集群是分hash值的,并不是每一个主机的数据都是一样的,搭建的话,请参考,我觉得说的真的很详细了,(而且我个人觉得哨兵感觉比集群好些,哈哈!)

  • redis集群搭建(非常详细,适合新手)
  • 快速搭建redis5.0集群

你可能感兴趣的:(redis)