前沿:参考文章
Redis哨兵(Sentinel)模式
docker配置Redis哨兵Sentinel模式
Redis Sentinel Documentation
总览:这里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个服务
# 使得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都可以通过密码登陆
# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码 设置客户端连接服务端时需要填写密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.108.4 6379
# 主服务器(192.168.108.4)连接密码
masterauth 123456
即使是slave,但也是服务端(这是备用的,所以也需要设置连接密码,密码需要一致),并且设置它们是从,指定主(master)的地址,因为从服务端需要同步数据,所以是需要知道连接主(master)的连接密码的
此时主从就已经配置好了,在master(192.168.108.4)中设置值,在从(192.168.108.5,192.168.108.6)中都可以查到
配置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),如下
其余的副本节点(192.168.108.5以及192.168.108.6)
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"
[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"
在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值的,并不是每一个主机的数据都是一样的,搭建的话,请参考,我觉得说的真的很详细了,(而且我个人觉得哨兵感觉比集群好些,哈哈!)