若是master异常,则会进行master-slave切换,将其中一个slave做为master,将以前的master做为slave。redis
哨兵做用哨兵是Redis集群架构中很是重要的一个组件,主要功能以下:服务器
集群监控:负责监控redis master和slave进程是否正常网络
消息通知:若是某个redis实例有故障,那么哨兵负责发送消息做为报警通知给管理员架构
故障转移:若是master节点挂掉了,会自动转移到slave节点上分布式
配置中心:若是故障转移发生了,通知client客户端新的master地址ide
故障转移时,判断一个master节点是否宕机了,须要大部分的哨兵都赞成才行,涉及到了分布式选举的问题测试
哨兵至少须要3个实例,来保证本身的健壮性ui
哨兵+redis主从的部署架构,是不会保证数据零丢失的,只能保证redis集群的高可用性server
sdown和odown两种失败的状态blog
sdown是主观宕机,就一个哨兵若是本身以为一个master宕机了,那么就是主观宕机
odown是客观宕机,若是quorum数量的哨兵都以为一个master宕机了,那么就是客观宕机
sdown达成的条件:若是一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数以后,就认为master宕机
odown达成条件:若是一个哨兵在指定的时间内,收到了quorum指定数量的其余哨兵也认为那个master是宕机了,那么就认为是odown了,客观认为master宕机了
quorum:确认odown的最少哨兵数量
majority:受权进行主从切换的最少哨兵数量
每个哨兵要作主备切换,首先须要quorum数量的哨兵认为odown,而后选举出一个哨兵来作切换,这个哨兵还得获得majority哨兵的特权,才能进行切换。
若是quorum<majority,好比5个哨兵,majority就是3,quorum·设置为2,那么3个哨兵受权能够执行切换,可是若是quorum>majority,那么必须quorum数量的哨兵都受权,好比5个哨兵,quorum是5,那么必须5个哨兵都赞成受权才能执行。(谁多听谁的)
哨兵集群必须部署两个以上节点。若是哨兵集群仅仅部署了2个哨兵实例,那么它的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),若是其中一个哨兵宕机了,就没法知足majority>=2这个条件,那么master发生故障时也就没法进行主从切换了。
工做原理每一个Sentienl以每秒钟一次的频率向他所知的Master,Slave以及其余的Sentinel实例发送一个ping命令
若是一个实例距离最后一次有效回复ping命令的时间超过了down-after-milliseconds选项所指的值,则这个实例会被Sentinel标记为主观宕机
若是一个master被标记为主观宕机,则正在监视这个master的全部sentinel要以每一秒一次的频率确认Master的确进入了主观宕机状态
当有足够数量的Sentinel(大于等于配置文件所指的值)在指定的时间范围内确认master的确进入了主观宕机状态,则master会被标记为客观状态
在通常状况下,每一个Sentinel会以1次/10秒的频率向他一致的全部master,slave发送INFO命令
当master被Sentinel标记为客观宕机是,Sentinel向下线的master的全部slave发送INFO命令的频率会从1次/10秒改成1次/秒
若没有足够数量的Sentinel赞成master已经下线,master的客观宕机状态就会被移除;若master从新想Sentinel的ping命令返回有效回复,master的主观宕机状态就会被移除。
首先配置redis的主从服务器,修改redis.conf文件以下
# 使得Redis服务器能够跨网络访问
bind 0.0.0.0
# 设置密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不须要配置
slaveof 192.168.11.128 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不须要配置
masterauth 123456
上述内容主要是配置Redis服务器,从服务器比主服务器多了一个slaveof的配置和密码
配置3个哨兵,每一个哨兵都是同样的。在Redis安装目录下有一个sentinel.conf文件,copy一份进行修改
# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor表明监控,mymaster表明服务器的名称,能够自定义,192.168.11.128表明监控的主服务器,6379表明端口,2表明只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操做。
sentinel monitor mymaster 192.168.11.128 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
启动服务器和哨兵,进入Redis安装目录的src目录
# 启动Redis服务器进程注意启动顺序:首先是主机(192.168.11.128)的Redis服务进程,而后启动丛机的服务进程,最后启动3个哨兵的服务进程Java中使用哨兵模式
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf
/** * 测试Redis哨兵模式 * @author liu */public class TestSentinels { @SuppressWarnings("resource") @Test public void testSentinel() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(10); jedisPoolConfig.setMaxIdle(5); jedisPoolConfig.setMinIdle(5); // 哨兵信息 Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.11.128:26379", "192.168.11.129:26379","192.168.11.130:26379")); // 建立链接池 JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456"); // 获取客户端 Jedis jedis = pool.getResource(); // 执行两个命令 jedis.set("mykey", "myvalue"); String value = jedis.get("mykey"); System.out.println(value); }}