一、哨兵模式作用
1.主从状态检测
2.如果 Master 异常,则会进行 Master-Slave 切换,将其中一个 Slave 作为 Master,将之前的 Master 作为 Slave。
二、工作原理
1.每个 Sentinel 以每秒钟一次的频率向它所知的 Master,Slave 以及其他 Sentinel 实例发送一个 PING 命令;
2.如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被Sentinel标记为主观下线;
3.如果一个 Master 被标记为主观下线,则正在监视这个 Master 的所有 Sentinel 要以每秒一次的频率确认Master 的确进入了主观下线状态;
4.当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master 的确进入了主观下线状态,则 Master 会被标记为客观下线 ;
5.在一般情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令
6.当 Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 ;
7.若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的主观下线状态就会被移除;若Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的客观下线状态就会被移除;
三、配置和检验
1.环境3master和3slave
192.168.0.9:6382> cluster nodes
dbc30ef2574f11b8c7ffe9fad9de39fefbc62659 192.168.0.9:6381 master - 0 1583327351101 2 connected 5461-10922
efe2c2c197eceec0864c3d09e4878c9d2264b990 192.168.0.9:6382 myself,master - 0 0 3 connected 10923-16383
40bada33e11e058ade5b7523315aee866acd21dd 192.168.0.9:6385 slave efe2c2c197eceec0864c3d09e4878c9d2264b990 0 1583327350082 6 connected
c972db1e5df4e1ffe495e42c03fc8d27ca99d15b 192.168.0.9:6380 master - 0 1583327352113 1 connected 0-5460
586c9d258380b71d5ec8a7301ba3c79cd27d143b 192.168.0.9:6383 slave c972db1e5df4e1ffe495e42c03fc8d27ca99d15b 0 1583327349058 4 connected
ea9b8edb48b9f657380f785d91f5eca66335953b 192.168.0.9:6384 slave dbc30ef2574f11b8c7ffe9fad9de39fefbc62659 0 1583327345998 5 connected
关系示意图
2.修改哨兵的配置文件,配置三个哨兵监听master :192.168.0.9:6381
sentinel_26379.conf,sentinel_26380.conf和sentinel_26381.conf
// Sentinel节点的端口,三个哨兵分别为26379,26380,26381
port 26379
// 当前Sentinel节点监控 192.168.0.9:6381 这个主节点
// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
// mymaster是主节点的别名
sentinel monitor mymaster 192.168.0.9 6381 2
//每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster 30000
//当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs mymaster 1
//故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster 180000
监控关系示意图
3.启动
因为不是后台启动,所以需要三个客户端
客户端1
redis-sentinel /opt/modules/redis-3.2.0/mycluster/sentinel_26379.conf
客户端2
redis-sentinel /opt/modules/redis-3.2.0/mycluster/sentinel_26380.conf
客户端3
redis-sentinel /opt/modules/redis-3.2.0/mycluster/sentinel_26381.conf
查看哨兵进程
[root@bigdata ~]# ps -aux | grep redis
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 33891 0.0 0.3 137656 9804 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6380 [cluster]
root 33895 0.0 0.3 137656 9784 ? Ssl 12:31 0:27 redis-server 192.168.0.9:6381 [cluster]
root 33899 0.0 0.3 137656 9796 ? Ssl 12:31 0:27 redis-server 192.168.0.9:6382 [cluster]
root 33904 0.0 0.2 137656 7760 ? Ssl 12:31 0:25 redis-server 192.168.0.9:6383 [cluster]
root 33909 0.0 0.2 137656 7740 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6384 [cluster]
root 33913 0.0 0.2 137656 7760 ? Ssl 12:31 0:25 redis-server 192.168.0.9:6385 [cluster]
root 33955 0.0 0.1 13340 3084 pts/1 S+ 12:35 0:00 redis-cli -h 192.168.0.9 -c -p 6385
root 34869 0.1 0.2 133560 7964 pts/7 Sl+ 21:23 0:02 redis-sentinel *:26379 [sentinel]
root 34958 0.1 0.2 133560 7968 pts/2 Sl+ 22:00 0:00 redis-sentinel *:26380 [sentinel]
root 34987 0.2 0.2 133560 7964 pts/4 Sl+ 22:00 0:00 redis-sentinel *:26381 [sentinel]
root 35014 0.0 0.0 103268 892 pts/5 S+ 22:00 0:00 grep redis
4. 重新查看哨兵配置文件sentinel_26379.conf,发现多了1个slave从节点,和2个sentinel节点
[root@bigdata mycluster]# vi sentinel_26379.conf
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 192.168.0.9 6384 //从节点
sentinel known-sentinel mymaster 192.168.0.9 26381 0505ef5fef583c9bcdbf3e29fba88e0bf40a901c //其他两个哨兵之一
sentinel known-sentinel mymaster 192.168.0.9 26380 b373a6e1c45296cfe25f9608188f291cfb38207e //其他两个哨兵之一
sentinel current-epoch 0
5.测试故障转移
(1)关闭监听的6381端口的redis主节点(master)
[root@bigdata mycluster]# ps -aux | grep redis
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 33891 0.0 0.3 137656 9804 ? Ssl 12:31 0:27 redis-server 192.168.0.9:6380 [cluster]
root 33895 0.0 0.3 137656 9784 ? Rsl 12:31 0:28 redis-server 192.168.0.9:6381 [cluster]
root 33899 0.0 0.3 137656 9796 ? Ssl 12:31 0:27 redis-server 192.168.0.9:6382 [cluster]
root 33904 0.0 0.2 137656 7760 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6383 [cluster]
root 33909 0.0 0.2 137656 7740 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6384 [cluster]
root 33913 0.0 0.2 137656 7760 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6385 [cluster]
root 33955 0.0 0.1 13340 3084 pts/1 S+ 12:35 0:00 redis-cli -h 192.168.0.9 -c -p 6385
root 34869 0.1 0.2 133560 7964 pts/7 Sl+ 21:23 0:02 redis-sentinel *:26379 [sentinel]
root 34958 0.1 0.2 133560 7972 pts/2 Sl+ 22:00 0:00 redis-sentinel *:26380 [sentinel]
root 34987 0.1 0.2 133560 7968 pts/4 Rl+ 22:00 0:00 redis-sentinel *:26381 [sentinel]
root 35028 0.0 0.0 103268 872 pts/5 R+ 22:06 0:00 grep redis
[root@bigdata mycluster]# kill -9 33895
[root@bigdata mycluster]# ps -aux | grep redis
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 33891 0.0 0.3 137656 9804 ? Ssl 12:31 0:27 redis-server 192.168.0.9:6380 [cluster]
root 33899 0.0 0.3 137656 9796 ? Ssl 12:31 0:27 redis-server 192.168.0.9:6382 [cluster]
root 33904 0.0 0.2 137656 7760 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6383 [cluster]
root 33909 0.0 0.2 137656 7740 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6384 [cluster]
root 33913 0.0 0.2 137656 7760 ? Ssl 12:31 0:26 redis-server 192.168.0.9:6385 [cluster]
root 33955 0.0 0.1 13340 3084 pts/1 S+ 12:35 0:00 redis-cli -h 192.168.0.9 -c -p 6385
root 34869 0.1 0.2 133560 7964 pts/7 Sl+ 21:23 0:02 redis-sentinel *:26379 [sentinel]
root 34958 0.1 0.2 133560 7972 pts/2 Sl+ 22:00 0:00 redis-sentinel *:26380 [sentinel]
root 34987 0.1 0.2 133560 7968 pts/4 Sl+ 22:00 0:00 redis-sentinel *:26381 [sentinel]
root 35030 0.0 0.0 103268 892 pts/5 S+ 22:07 0:00 grep redis
(2)观察master已经转移到6384端口的redis服务器
-》关闭6381前,6381是主,从是6384
192.168.0.9:6382> cluster nodes
dbc30ef2574f11b8c7ffe9fad9de39fefbc62659 192.168.0.9:6381 master - 0 1583314735242 2 connected 5461-10922
efe2c2c197eceec0864c3d09e4878c9d2264b990 192.168.0.9:6382 myself,master - 0 0 3 connected 10923-16383
40bada33e11e058ade5b7523315aee866acd21dd 192.168.0.9:6385 slave efe2c2c197eceec0864c3d09e4878c9d2264b990 0 1583314739314 6 connected
c972db1e5df4e1ffe495e42c03fc8d27ca99d15b 192.168.0.9:6380 master - 0 1583314738299 1 connected 0-5460
586c9d258380b71d5ec8a7301ba3c79cd27d143b 192.168.0.9:6383 slave c972db1e5df4e1ffe495e42c03fc8d27ca99d15b 0 1583314737279 4 connected
ea9b8edb48b9f657380f785d91f5eca66335953b 192.168.0.9:6384 slave dbc30ef2574f11b8c7ffe9fad9de39fefbc62659 0 1583314741356 5 connected
-》关闭6381后,主是6384
192.168.0.9:6382> cluster nodes
dbc30ef2574f11b8c7ffe9fad9de39fefbc62659 192.168.0.9:6381 master,fail - 1583330828283 1583330825351 2 disconnected
efe2c2c197eceec0864c3d09e4878c9d2264b990 192.168.0.9:6382 myself,master - 0 0 3 connected 10923-16383
40bada33e11e058ade5b7523315aee866acd21dd 192.168.0.9:6385 slave efe2c2c197eceec0864c3d09e4878c9d2264b990 0 1583331031876 6 connected
c972db1e5df4e1ffe495e42c03fc8d27ca99d15b 192.168.0.9:6380 master - 0 1583331029835 1 connected 0-5460
586c9d258380b71d5ec8a7301ba3c79cd27d143b 192.168.0.9:6383 slave c972db1e5df4e1ffe495e42c03fc8d27ca99d15b 0 1583331030853 4 connected
ea9b8edb48b9f657380f785d91f5eca66335953b 192.168.0.9:6384 master - 0 1583331028823 7 connected 5461-10922
(3)sential哨兵控制台打印信息
[root@bigdata mycluster]# redis-sentinel sentinel_26380.conf
34958:X 04 Mar 22:00:09.757 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.0 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26380
| `-._ `._ / _.-' | PID: 34958
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
34958:X 04 Mar 22:00:09.760 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
34958:X 04 Mar 22:00:09.771 # Sentinel ID is b373a6e1c45296cfe25f9608188f291cfb38207e
34958:X 04 Mar 22:00:09.771 # +monitor master mymaster 192.168.0.9 6381 quorum 2
34958:X 04 Mar 22:00:09.772 * +slave slave 192.168.0.9:6384 192.168.0.9 6384 @ mymaster 192.168.0.9 6381
34958:X 04 Mar 22:00:10.223 * +sentinel sentinel 62a11b8815a1bd2b64226bb3abaa320c48812d75 192.168.0.9 26379 @ mymaster 192.168.0.9 6381
34958:X 04 Mar 22:00:40.291 # +sdown sentinel 62a11b8815a1bd2b64226bb3abaa320c48812d75 192.168.0.9 26379 @ mymaster 192.168.0.9 6381
34958:X 04 Mar 22:00:48.419 * +sentinel sentinel 0505ef5fef583c9bcdbf3e29fba88e0bf40a901c 192.168.0.9 26381 @ mymaster 192.168.0.9 6381
34958:X 04 Mar 22:01:18.511 # +sdown sentinel 0505ef5fef583c9bcdbf3e29fba88e0bf40a901c 192.168.0.9 26381 @ mymaster 192.168.0.9 6381
34958:X 04 Mar 22:07:38.340 # +sdown master mymaster 192.168.0.9 6381
四、Java连接
1.代码
/**
* 7.哨兵模式
*/
public static void Sentinel() {
Set<String> set=new HashSet<>();
// set中放的是哨兵的Ip和端口
set.add("192.168.0.9:26379");
set.add("192.168.0.9:26380");
set.add("192.168.0.9:26381");
GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig();
JedisSentinelPool jedisSentinelPool=new JedisSentinelPool("mymaster",set,poolConfig,60000);
Jedis jedis=jedisSentinelPool.getResource();
String val=jedis.get("k1");
jedis.set("Jedis","jedis1");
System.out.println(val);
}
2.报错
警告: Cannot get master address from sentinel running @ 192.168.0.9:26381. Reason: redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled,
解决办法:
(1)参考:
(2)参考:
五、参考
1. Redis 学习笔记(十三)Redis Sentinel 介绍与部署
https://blog.csdn.net/men_wen/article/details/72724406?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2.redis经典三节点高可用哨兵模式集群搭建
https://blog.csdn.net/zhangcongyi420/article/details/84191873