1、介绍
哨兵 (sentinel) ,用于对主从结构中的每一台服务器进行监控,当主节点出现故障后通过投票机制来挑选新的主节点,并且将所有的从节点连接到新的主节点上。前面的主从是最基础的提升Redis服务器稳定性的一种实现方式,但我们可以看到master节点仍然是一台,若主节点宕机,所有从服务器都不会有新的数据进来,如何让主节点也实现高可用,当主节点宕机的时候自动从从节点中选举一台节点提升为主节点就是哨兵实现的功能。
- 监控:监控主从节点运行情况。
- 通知:当监控节点出现故障,哨兵之间进行通讯。
- 自动故障转移:当监控到主节点宕机后,断开与宕机主节点连接的所有从节点,然后再从节点中选取一个作为主节点,将其他的从节点连接到这个最新的主节点。最后通知客户端最新的服务器地址。
哨兵也是一台redis服务器,只是不对外提供任何服务,redis的bin目录下的redis-sentinel其实就是redis-server的软连接。
哨兵节点最少三台且必须为单数。这个与其它分布式框架如zookeeper类似,如果是双数,在选举的时候就会出现平票的情况,所以必须是三台及以上的单数。
2、原理
哨兵之间会有通讯,哨兵和主从节点之间也有监控,基于这些信息同步和状态监控实现Redis的故障转移:
- 哨兵和哨兵之间以哨兵和Redis主从节点之间每隔一秒发送ping监控它们的健康状态;
- 哨兵向Redis主从节点每隔10秒发送一次info保存节点信息;
- 哨兵向Redis主节点每隔2秒发送一次hello,直到哨兵报出sdown,代表主节点失联,然后通知其余哨兵尝试连接该主节点;
Redis主节点下线的情况分为主观下线和客观下线;
主观下线(sdown):单独一个哨兵发现master故障了。
客观下线(odown):半数哨兵都认为master节点故障就会触发故障转移。
4、哨兵Leader选举
- 哨兵A发现Redis主节点失联;
- 哨兵A报出sdown,并通知其它哨兵,发送指令sentinel-master-down-by-address-port给其余哨兵节点;
- 其余哨兵接收到哨兵A的指令后尝试连接Redis主节点,发现主节点确实失联;
- 哨兵返回信息给哨兵A,当超过半数的哨兵认为主节点下线后,状态会变成odown;
- 最先发现主节点下线的哨兵A会成为哨兵领导者负责这次的主从节点的切换工作;
5、故障转移
当哨兵发现主节点下线之后经过上面的哨兵选举机制,选举出本次故障转移工作的哨兵节点完成本次主从节点切换的工作:
- 哨兵Leader根据一定规则从各个从节点中选择出一个节点升级为主节点;
- 其余从接待你修改对应的主节点为新的主节点;
哨兵Leader选择新的主节点遵循下面几个规则:
健康度:从节点响应时间快:
完整性:从节点消费主节点的offset偏移量尽可能的高;
稳定性:若仍有多个从节点,则根据从节点创建时间选择最有资历的节点升级为主节点;
3、搭建
3.1节点规划
操作系统 |
IP地址 |
角色 | |
Redhat |
Redis 10.68.111.43:6379 Sentinel 10.68.156.43:26379 |
从节点 | |
Redhat |
Redis 10.68.111.44:6379 Sentinel 10.68.156.44:26379 |
从节点 | |
Redhat |
Redis 10.68.111.45:6379 Sentinel 10.68.156.45:26379 |
主节点 |
3.2下载并解压REDIS安装包
tar -zxvf redis-6.2.7.tar.gz /home/soft/redis-6.2.7
3.3编译安装REDIS
cd /home/soft/redis-6.2.7
mkdir build
make & make install
3.4修改redis和sentinel的配置文件
主节点redis.conf相关配置:
bind 0.0.0.0
requirepass "soFR@2020#07_"
masterauth "soFR@2020#07_"
daemonize yes
logfile "/app/soft/redis-6.2.7/logs/redis.log"
appendonly yes
appendfsync everysec
protected-mode no
port 6379
主节点sentinel.conf相关配置:
protected-mode no
daemonize yes
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.68.111.45 6379 2
sentinel down-after-milliseconds mymaster 1000
sentinel auth-pass mymaster soFR@2020#07_
port 26379
从节点redis.conf相关配置:
bind 0.0.0.0
slaveof 10.68.156.45 6379
requirepass "soFR@2020#07_"
masterauth "soFR@2020#07_"
appendonly yes
appendfsync everysec
daemonize yes
logfile "/app/soft/redis-6.2.7/logs/redis.log"
protected-mode no
从节点sentinel.conf相关配置:
protected-mode no
daemonize yes
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.68.111.45 6379 2
sentinel down-after-milliseconds mymaster 1000
sentinel auth-pass mymaster soFR@2020#07_
port 26379
3.5启动redis和sentinel
./redis-server ../../redis.conf
./redis-sentinel ../../sentinel.conf