Redis Sentinel介绍
Redis Sentinel是Redis的官方高可用性解决方案
Redis Sentinel为Redis提供高可用性。实际上,这意味着使用Sentinel可以创建一个Redis部署,可以在没有人为干预的情况下抵御某些类型的故障。
Redis Sentinel还提供其他附属任务,如监控,通知,并充当客户端的配置提供程序。
这是宏观级别的Sentinel功能的完整列表(即大图):
- 监控。Sentinel会不断检查主实例和从属实例是否按预期工作。
- 通知。Sentinel可以通过API通知系统管理员,另一台计算机程序,其中一个受监控的Redis实例出现问题。
- 自动故障转移。如果主服务器未按预期工作,Sentinel可以启动故障转移过程,其中从服务器升级为主服务器,其他其他服务器重新配置为使用新主服务器,并且使用Redis服务器的应用程序通知有关新服务器的地址。连接。
- 配置提供商。Sentinel充当客户端服务发现的权限来源:客户端连接到Sentinels,以便询问负责给定服务的当前Redis主服务器的地址。如果发生故障转移,Sentinels将报告新地址
Redis Sentinel搭建
本例在同一台机器上搭建,实际搭建,可以分三台机器进行搭建

| 服务类型 | 角色 | IP地址 | 端口 |
|---|---|---|---|
| Redis | master | 127.0.0.1 | 17007 |
| Redis | slave | 127.0.0.1 | 17008 |
| Redis | slave | 127.0.0.1 | 17009 |
| Sentinel | 127.0.0.1 | 17107 | |
| Sentinel | 127.0.0.1 | 17108 | |
| Sentinel | 127.0.0.1 | 17109 |
1、搭建3个节点的主从模式redis,参考:【Redis】Redis 主从模式搭建
目录如下:

2、搭建Sentinel节点,17107节点配置文件如下:
1 # bind注释掉,需要在外网访问,将protected-model改为no 2 protected-mode no 3 4 # 端口 5 port 17107 6 7 # 后台运行 8 daemonize yes 9 10 # pid文件 11 pidfile sentinel_17107.pid 12 13 # 日志文件 14 logfile "/data/log/redis-sentinel-log/sentinel-17107-log/sentinel-17107.log" 15 16 # 目录 17 dir /data/soft/redis-sentinel/sentinel-17107/ 18 19 # sentinel monitor <master-name> <ip> <redis-port> <quorum> 20 # 配置sentinel监控的master 21 # sentinel监控的master的名字叫做mymaster,地址为127.0.0.1:6379 22 # sentinel在集群式时,需要多个sentinel互相沟通来确认某个master是否真的死了; 23 # 数字2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。 24 sentinel monitor mymaster 127.0.0.1 17007 2 25 26 # sentinel auth-pass <master-name> <password> 27 # sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码 28 sentinel auth-pass mymaster redis123456 29 30 # sentinel down-after-milliseconds <master-name> <milliseconds> 31 # sentinel会向master发送心跳PING来确认master是否存活 32 # 如果master在“一定时间范围”内不回应PONG或者是回复了一个错误消息 33 # 那么这个sentinel会主观地认为这个master已经不可用了(SDOWN) 34 # 而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。 35 sentinel down-after-milliseconds mymaster 30000 36 37 # sentinel parallel-syncs <master-name> <numreplicas> 38 # 在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步 39 # 这个数字越小,完成failover所需的时间就越长 40 # 但是如果这个数字越大,就意味着越多的slave因为replication而不可用。 41 # 可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。 42 sentinel parallel-syncs mymaster 1 43 44 # sentinel failover-timeout <master-name> <milliseconds> 45 # 实现主从切换,完成故障转移的所需要的最大时间值。 46 # 若Sentinel进程在该配置值内未能完成故障转移的操作,则认为本次故障转移操作失败。 47 sentinel failover-timeout mymaster 180000 48 49 # 指定Sentinel进程检测到Master-Name所指定的“Master主服务器”的实例异常的时候,所要调用的报警脚本。 50 # sentinel notification-script mymaster <script-path> 51 52 # 安全 53 # 避免脚本重置,默认值yes 54 # 默认情况下,SENTINEL SET将无法在运行时更改notification-script和client-reconfig-script。 55 # 这避免了一个简单的安全问题,客户端可以将脚本设置为任何内容并触发故障转移以便执行程序。 56 sentinel deny-scripts-reconfig yes
3、启动Redis Sentinel
注意启动的顺序。首先是redis主节点的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。
启动Sentinel方式
方式1:redis-sentinel redis-sentinel.conf
方式2:redis-server sentinel.conf --sentinel
本例编辑了一个脚本(start-all.sh)进行启动,内容如下:
1 #!/bin/bash 2 3 # 启动 Redis-Server 4 echo "Star Redis-Server ..." 5 6 cd /data/soft/redis-sentinel 7 redis-5.0.5/src/redis-server redis-17007/redis-17007.conf 8 9 # sleep 1 睡眠1秒 10 # sleep 1s 睡眠1秒 11 # sleep 1m 睡眠1分 12 # sleep 1h 睡眠1小时 13 sleep 3 14 15 redis-5.0.5/src/redis-server redis-17008/redis-17008.conf 16 redis-5.0.5/src/redis-server redis-17009/redis-17009.conf 17 18 # 启动 Redis-Sentinel 19 echo "Star Redis-Sentinel ..." 20 21 redis-5.0.5/src/redis-sentinel sentinel-17107/sentinel-17107.conf 22 redis-5.0.5/src/redis-sentinel sentinel-17108/sentinel-17108.conf 23 redis-5.0.5/src/redis-sentinel sentinel-17109/sentinel-17109.conf
关闭脚本(start-all.sh)
1 #!/bin/bash 2 3 # 停止 Redis-Server 4 echo "Shutdown Redis-Sentinel ..." 5 6 cd /data/soft/redis-sentinel 7 8 redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17107 shutdown 9 redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17108 shutdown 10 redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17109 shutdown 11 12 # 停止 Redis-Server 13 echo "Shutdown Redis-Server ..." 14 15 redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17007 -a redis123456 shutdown 16 redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17008 -a redis123456 shutdown 17 redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17009 -a redis123456 shutdown
4、测试,使用命令:redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 17007 -a 123456
Redis Sentinel Java连接
使用Jedis连接Redis,测试类如下:
1 package com.test.jedis;
2
3 import java.util.Arrays;
4 import java.util.HashSet;
5 import java.util.Set;
6
7 import org.junit.Test;
8
9 import redis.clients.jedis.Jedis;
10 import redis.clients.jedis.JedisPoolConfig;
11 import redis.clients.jedis.JedisSentinelPool;
12
13 public class TestSentinels {
14
15 @Test
16 public void testSentinel() {
17 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
18 jedisPoolConfig.setMaxTotal(10);
19 jedisPoolConfig.setMaxIdle(5);
20 jedisPoolConfig.setMinIdle(5);
21 // 哨兵信息
22 Set<String> sentinels = new HashSet<String>(Arrays.asList("127.0.0.1:17107", "127.0.0.1:17108","127.0.0.1:17109"));
23 // 创建连接池
24 JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,"123456");
25 // 获取客户端
26 Jedis jedis = pool.getResource();
27 // 执行两个命令
28 jedis.set("mykey", "myvalue");
29 String value = jedis.get("mykey");
30 System.out.println(value);
31 }
32 }