1 是什么
吹哨人巡查监控后台大master主数据库是否故障,如果故障了根据投票数自动某一个从数据库转换成为新主库,继续对外服务。
他的作用:
- 监控redis运行状态,包括master和slave
- 当master down机,能自动将slave切换成新的master
2 能干什么
-
主从监控 监控主从redis库运行是否正常
-
消息通知 哨兵可以将故障转移的结果发送给客户端
-
故障转移 如果Mater异常,则会进行主从切换,将其中一个Slave作为新Master
-
配置中心 客户端通过链接哨兵来获得当前Redis服务的主节点地址
3 如何使用
3.1 Redis Sentinel架构,前提说明
三个哨兵 自动监控和维护集群,不存放数据,只是吹哨人
一主二从 用于数据读取和存放
3.2 操作步骤
3.2.1 配置文件修改,配置参数说明
bind 服务器监听地址,用于客户端连接,默认本机的地址
daemonize 是否以后台daemon方式运行
protected-mode 是否开启安全模式
port 端口号
logfile 日志文件的路径
pidfile pid文件路径
dir 工作目录
sentinel monitor <master-name> <ip> <redis-port> <quorum> 设置要监控的master服务器,quorum表示最少有几个哨兵认可客观下线,统一故障迁移的法定票数
sentinel auth-pass <master-name> <password> master设置了密码,链接master服务的密码
sentinel down-after-milliseconds <master-name> <milliseconds>:
指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
sentinel parallel-syncs <master-name> <nums>:
表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
sentinel failover-timeout <master-name> <milliseconds>:
故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败
sentinel notification-script <master-name> <script-path> :
配置当某一事件发生时所需要执行的脚本
sentinel client-reconfig-script <master-name> <script-path>:
客户端重新配置主节点参数脚本
3.2.2 通用配置
bind 0.0.0.0
3.3 配置文件总结
配置文件中的内容,在运行期间会被sentinel动态进行修改
Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生变化,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
4 哨兵的运行流程和选举原理
当一个主从配置中的主数据库是小之后,sentinel可以选举出一个新的主数据库,用于自动接替原master的工作,主从配置中的其他redis服务器自动指向新的master同步数据,一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换
4.1 SDown主观下线
SDown主观下线(Subjectively Down):SDOWN(主管不可用)是单个sentinel自己的主观上检测到master的状态,从sentinel的角度看,如果发送了PING心跳后,在一定时间内没有收到合法的回复,就达到了SDOWN的条件;在sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度(如下图所示)
sentinel down-after-milliseconds <masterName> <timeout>
表示master被当前sentinel实例认定为失效的间隔时间,这个配置其实就是进行主观下线的一个依据
4.2 ODown客观下线
ODown客观下线(Objectively Down):ODOWN需要一定数量的sentinel,多个哨兵达成一致意见才能认为一个master客观上已经宕机(配置如下图)
quorum这个参数是进行客观下线的一个依据,法定人数/法定票数
意思是至少有quorum个sentinel认为这个master有故障才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因导致无法连接master,而此时master并没有出现故障,所以这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。
4.3 领导者哨兵的选举
当主节点被判断客观下线以后,哥哥烧饼节点会进行协商,选举出一个领导者哨兵节点,并由这个领导者节点进行failover(故障迁移)
哨兵领导者是根据Raft算法选举出来的:
监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:
即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者
4.4 故障迁移并选举出一个新的master
4.4.1 选举新的master
从下线的主服务的所有从服务中挑选一个从服务,将其转成主服务,选择条件依次为:
- 选择优先级靠前的
- 选择偏移量最大的
- 选择runid最小的从服务
4.4.2 原先的slave向新的master拜码头
挑选出新的主服务后,sentinel向原主服务的从服务发送 “slaveof 新主服务 ” 的命令,复制新master
4.4.3 旧主俯首
当已经下线的原主服务上线后,sentinel会向其发送 “slaveof 新主服务” 的命令,让其成为新主的从服务
优先级在redis.conf中slave-priority 100
偏移量是指获得原主数据最多的
每个redis实例启动后都会随机一个40位的runid