文章目录
Redis学习(四)
当主库宕机之后,还是需要手动选择一个从库,升级为主库,然后把其他从库的主库切换为新的主库。
哨兵则是自动进行上述操作,无需人工干预
哨兵
作用
- 监控主、从Redis是否正常
- 当主库出现故障时,自动将从数据库转为主数据库
- 哨兵不仅监控主从,多个哨兵之间也会相互监控
- 子节点的自动发现
配置sentinel.conf
格式为: sentinel monitor ,quorum为最低通过票数和判断客观下线的哨兵数
sentinel monitor mymaster 127.0.0.1 6379 1
格式为:sentinel down-after-milliseconds
当主库15秒之内没有响应,则哨兵认为该主库主观下线
sentinel down-after-milliseconds mymaster 15000
启动主从数据库
Master:127.0.0.1:6379
Slave1: 127.0.0.1:16379
Slave2: 127.0.0.1:26379(哨兵默认启动端口为26379,由于被占用了,更换为36379,修改端口在sentinel.conf中)
启动哨兵
# 制定哨兵的配置文件即可
redis-sentinel ./redis/redis-5.0.3/sentinel.conf
信息解读
-
哨兵启动时,拿到了刚才的配置,开始监视主库
-
在监视过程中,哨兵每10秒会向主库发送INFO命令,INFO命令会拿到当前监视的Redis的实例的运行ID、复制信息、子节点信息。依靠这一点,哨兵实现了子节点的自动发现
-
哨兵每隔1秒会向主、从Redis实例发送PING命令,来确保监视的主从Redis是否正常。如果在down-after-milliseconds 时间之后,还未收到回复,则当前哨兵,认为mymaster主观下线。
-
哨兵启动之后,还会使用另一个连接去订阅主从的_sentinel_:hello 频道,订阅之后,会每隔2秒向频道发送自己的信息,所以,当有新的哨兵加入时,其他哨兵会根据其共同订阅的频道,很快的发现新加入的哨兵。
为什么要使用另外一条连接去订阅频道?
因为订阅频道之后,就不能执行其他命令了。
-
杀死6379主库
-
sdown(subjectively down)-主观下线。哨兵认为6379主库主观下线
-
odown(objectively down)-客观下线。大于等于quorum个数的哨兵都认为6379主库下线时,则认为主库客观下线
-
try-failover,开始进行故障恢复
-
selected-slave 开始在slave中选举
-
failover-end 故障恢复完毕
-
switch-master mymaster 127.0.0.1 6379 127.0.0.1 16379。将主库从6379转移到16379上
-
如果在新的master产生之后,6379又恢复了正常,则6379会被当做新master的从库。
-
-sdown代表6379又恢复正常了
-
convert-to-slave,将6379转为16379的从库
-
多个哨兵时如何选举出领头哨兵?
为什么要选择领头哨兵?
需要领头哨兵选举出新的主库。因此,第一步,必须先选出领头哨兵。
如果不能保证有一个领头哨兵会发生什么?
极端情况下,每个哨兵都作为领头哨兵进行选举,有可能每个哨兵此时拿到的整体主从Redis实例信息不一致,导致,选出多个主数据库。多个主数据库之间会互相通知其他数据库作为从库。引起混乱。
-
发现主库下线的哨兵向其他哨兵发送命令,希望其他哨兵选举它为领头哨兵
-
如果其他哨兵没选过其他人,则同意
-
如果由超过quorum票数的哨兵都同意将A设置为领头哨兵。则A成为领头哨兵
-
当出现了多个哨兵都在竞选领头哨兵,会出现没有任何哨兵当选的可能。此时需要等待一个随机时间后,重新发起选举,直到选出一个领头哨兵。
哨兵如何在多个从库之间挑选出最适合作为主库的?
在所有从库中选择优先级最高的。从库优先级配置见,配置文件:
配置从库的优先级,数字越小,优先级越高
replica-priority 100
如果优先级一样,则哪个从库的复制的偏移量大,选哪个。因为,偏移量大的代表复制原来主库的数据越完整
如果偏移量一样大,则选择运行ID最小的
找到合适的从库之后,如何恢复?
使用SLAVEOF NO ONE,将选择的从库提升为主库
向其他从库发送SLAVEOF命令。
这两步其实就是手动恢复故障时的命令
如何部署合适的哨兵?
一个哨兵会存在很大的风险,一旦哨兵挂了,没有人工干预的情况下,整个Redis的主从也不会恢复过来。
因此,哨兵之间也要互相监控
建议
- 无论主从,为每个节点都部署一个哨兵。好处是可以全方位监控。坏处是,大量的哨兵会产生大量的请求连接。
- 设置投票数qunorm为N/2+1