redis的哨兵配置

前沿:参考文章

Redis哨兵(Sentinel)模式

docker配置Redis哨兵Sentinel模式

Redis Sentinel Documentation

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

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

服务类型是否是主服务器IP端口
Redis192.168.108.46379
Redis192.168.108.56379
Redis192.168.108.66379
Sentinel-192.168.108.426379
Sentinel-192.168.108.526379
Sentinel-192.168.108.626379

要明白,哨兵(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 <master-group-name> <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),如下
在这里插入图片描述
其余的副本节点(192.168.108.5以及192.168.108.6)
在这里插入图片描述

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

monitor master mymaster 127.0.0.1 6379 quorum 2

在这里插入图片描述

三、测试

向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日志,我们则应该可以看到很多操作:
在这里插入图片描述
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"

在这里插入图片描述

四、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,查看如下
在这里插入图片描述
以上可以证明正常情况下没有问题,接下来测试如果测试挂掉,springboot项目会不会受到影响,按照之前的逻辑使用 ,DEBUG sleep 60 使当前的master(192.1368.108.5)睡眠,此时matser变为192.168.108.6
在这里插入图片描述
再次请求,设置id为80
在这里插入图片描述
查看redis,可以看到被设置为80,而且此时的主机为192.1368.25.6,也没有影响
在这里插入图片描述

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

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

Redis Sentinel(哨兵)是Redis官方提供的高可用性解决方案,它可以自动检测主节点的故障,并将其转移为新的主节点,以保证Redis集群的高可用性。 以下是Redis Sentinel(哨兵)的配置步骤: 1. 在redis的安装目录下创建sentinel.conf文件,并编辑该文件,添加以下内容: ``` sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 ``` - `sentinel monitor mymaster 127.0.0.1 6379 2`:监控名为mymasterRedis主节点,IP地址为127.0.0.1,端口号为6379,2表示当有2个哨兵认为主节点不可用时,主节点才被判断为不可用。 - `sentinel down-after-milliseconds mymaster 5000`:当主节点在5秒内没有响应时,哨兵会将其判断为不可用。 - `sentinel failover-timeout mymaster 60000`:当主节点不可用时,哨兵进行故障转移的超时时间为60秒。 - `sentinel parallel-syncs mymaster 1`:进行故障转移时,每个从节点最多同时同步1个主节点。 2. 启动Redis Sentinel(哨兵): ``` redis-sentinel /path/to/sentinel.conf ``` 3. 在其他Redis节点上,也需要配置相同的sentinel.conf文件,并启动Redis Sentinel(哨兵)。 4. 在客户端连接Redis时,需要连接到哨兵而不是直接连接到主节点。可以使用以下命令连接到Redis Sentinel(哨兵): ``` redis-cli -h sentinel_ip -p sentinel_port ``` 其中,sentinel_ip为Redis Sentinel(哨兵)的IP地址,sentinel_port为Redis Sentinel(哨兵)的端口号(默认为26379)。 5. 当主节点不可用时,哨兵会自动将从节点升级为主节点,并重新选举从节点。客户端会自动连接到新的主节点,无需手动干预。 以上就是Redis Sentinel(哨兵)的配置步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值