当我们搭建一个主从复制时,master宕机之后我们需要选取一个新的master,用于解决这个问题的策略就是哨兵模式
哨兵(sentinel)是一个分布式文件系统,用于对主从结构中的每一台服务器进行监控,当出现故障时通过投票机制选出新的master并将所有slave连接到新的master
1.监控:①不断的检查master和slave是否正常运行
2.通知:当被监控的服务器出现了问题,向其它的哨兵和客户端发送通知
3.自动故障转移:断开slave和master的连接,投票选出一个新的master并将所有slave连接新的master,告知客户端新的服务器地址
注意:①哨兵在redis中也是一台服务器,只是不提供数据
②通常哨兵配置单数
1.配置一个1托2的主从结构
在从节点的配置文件中配置master的ip和port,并以配置文件的形式启动从节点服务器
2. 配置3个哨兵服务器的配置文件,除了端口号不同其它配置项一致(此配置文件在redis解压目录中存在即sentinel.conf,将其复制不修改源文件)
①查看一下setinel.conf中的配置项
setinel monitor <master名称(自定义)> host port 2 :配置master的服务名称、ip和端口号、2是指:哨兵的数量,当超过一般的哨兵认为master已经不能正常工作了就让它下线,这也是为什么哨兵数量一般设置为奇数的原因,偶数的话很容易投票打平。
setinel down-after-milliseconds <master名称(要与monitor的名称一致)> 30000:单位是毫秒,这里默认设置是30秒,用于判断master挂掉的默认时间周期,也是主从切换启动的条件之一
parrallel-syncs <master名称> 1:指定同时进行主从复制slave数量
failover-timeout <master名称> 180000:默认时间单位是毫秒,这里默认设置是3分钟,指定故障出现时故障切换的超大超时时间,超过这个时间就认定故障切换失败
②配置哨兵配置文件并且清空data中的文件
③启动哨兵服务
redis-sentinel conf/sentinel-6379.conf redis-sentinel conf/sentinel-6380.conf redis-sentinel conf/sentinel-6381.conf
从日志中可以看出,本身我们是设置6379为master但是由于网络或者其它原因,在规定时间内没有应答,就让它下线了并且推选出新的master为6381
可以看出确实是这样
三个阶段:①监控②通知③故障转移
阶段一:监控阶段
·用于同步各个节点的状态信息
·获取各个sentinel的状态
·获取master的信息
·master的属性
·runid
·role:master
·各个slave的详细信息
·获取所有slave的状态(根据master中的slave信息)
·slave属性
·runid
·role:slave
·master_host、mast_port
·offset
·......
阶段二:通知阶段
阶段三:故障转移阶段
1.发现故障
2.推选负责人(投票)
假如sentinel1和sentinel5要竞选故障处理的负责人,它两就同时向sentinel2发送选我的消息,谁的消息先到sentinel就投谁,其它以此类推,假如投票结果一样就比较竞选次数,假如竞选次数也一样就比较runid
3.优选新master
·服务器列表中挑选master
·在线的
·响应慢的
·与原master断开时间久的
·优先原则
·优先级
·offset
·runid
·发送指令(sentinel)
·向新的master发送slaveof no one
·向其他slave发送slaveof 新master的ip port
·原master故障恢复后作为slave连接master