在这里插入图片描述java
主从切换技术的方法是:当主服务器宕机后,须要手动把一台从服务器切换为主服务器,这就须要人工干预,费事费力,还会形成一段时间内服务不可用。这不是一种推荐的方式,更多时候,咱们优先考虑哨兵模式。redis
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,做为进程,它会独立运行。其原理是哨兵经过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。服务器
哨兵主要有两个做用网络
经过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。架构
当哨兵监测到master宕机,会自动将slave切换成master,而后经过发布订阅模式通知其余的从服务器,修改配置文件,让它们切换主机。ide
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,咱们可使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就造成了多哨兵模式。测试
故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会立刻进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,而且数量达到必定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操做。切换成功后,就会经过发布订阅模式,让各个哨兵把本身监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。spa
在这里插入图片描述代理
在这里插入图片描述code
启动命令:redis-server redis-7000.conf
配置
port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir "/opt/soft/redis/data/"
redis-server redis-7001.conf
redis-server redis-7002.conf
slave-1:
port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
slave-2:
port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
port ${port}
dir "/opt/soft/redis/data/"
logfile "${port}.log"
// 配置监听的主服务器,这里sentinel monitor表明监控,mymaster表明服务器的名称,能够自定义,192.168.11.128表明监控的主服务器,6379表明端口,2表明只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操做。
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-millseseconds mymaster 30000 //判断主节点时间
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
启动
redis-sentinel sentinel.conf
可使用 ps -ef|grep redis-sentinel 命令查看进程、
/**
* 测试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("127.0.0.1:26379","1127.0.0.1:26379","127.0.0.1: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);
}
}
若是咱们把主服务器停掉,在通过一段时间的报错后,redis集群会恢复
主观下线和客观下线
主观下线:当前sentintel节点认为某个redis节点不可用。
客观下线:全部sentinel节点认为某个redis节点不可用。
三个定时任务
每10秒每一个sentinel对master 和 slave执行info
- 发现slave节点
- 确认主从关系
每2秒每一个sentinel经过master节点对channel交换信息(发布订阅)
- 经过_sentinel_:hello频道交互
- 交互对节点的“见解”和自身信息
每1秒每一个sentinel 对其余sentinel和redis执行ping
领导者选举
只须要一个sentinel节点完成故障转移
经过sentinel is - master -down -by-addr 命令都但愿成为领导者
-1. 每一个主观下线都Sentitle 节点向其余Sentinel节点发送命令,要求将它设置为领导者
-2. 收到命令对Sentinel节点若是没有同一经过其余Sentinel节点发送的命令,那么就将同一该请求,不然拒绝
-3. 若是该Sentinel节点发现直接的票数已经超过Sentinel集合半数且超过quorum,那么它将成为领导者
-4. 若是此过程由多个Sentinel节点成为领导者,那么未来等待一段时间从新进行选举
在这里插入图片描述
故障转移(Sentinel领导者节点完成)
选择 “合适的” slave节点