Master如果发送宕机
需要做下面这些事情:
- 将宕机的master下线
- 找一个slave作为master
- 通知所有的slave连接新的master
- 启动新的master与slave
- 全量复制*N+部分复制 *N
什么是redis sentinel
哨兵(sentinel)在redis集群架构中是一个非常重要的组件,其主要功能有下面这些:
-
监控
不断的检查master和slave是否正常运行
master存活检测、master与slave运行情况检测 -
通知(提醒)
当被监控的服务器出现问题时,向其他(哨兵间、客户端)发送通知 -
自动故障转移
断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的master的地址。
注意: 哨兵也是一台redis服务器,只是不提供数据服务,通常哨兵配置数量为单数。
如何配置哨兵
通过配置文件配置,配置后使用命令启动。
配置文件:
[root@localhost redis-4.0.6]# cat sentinel.conf | grep -v "#" | grep -v "^$"
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
----------------------------------------------------------------------------
以上分别为:
端口号
路径
监控的master 地址 端口号 哨兵认定数量
连接未响应时长
重设master后同时同步数量
认定下线时间(毫秒)
启动哨兵指令:
redis-sentinel 配置文件.conf
连接命令:
redis-cli -p 端口号
工作原理
监控阶段
工作内容:
- 第一个sentinel与master进行连接后,发送info指令
- 建立长期cmd连接,sentinal同时保存所有哨兵状态,master中记录redis实例信息
- 通过master中的slave信息与其中的slave进行连接并发送info指令
- 第二个sentinel进入,与master连接发送info指令,发现master端的sentinels
有信息 - 与第一个sentinel建立连接并同步信息,互相发送ping命令保证对方在线,并于master建立cmd连接
通知阶段
工作内容:由其中一个sentinel通过建立的cmd连接获取主从机的工作状态,获取到信息并且与相互连接的其他sentinel之间进行信息同步。
故障转移阶段
故障转移阶段引起原因:其中一台sentinel多次获取master状态失败。
发现master宕机
这个哨兵将master中标记为SRI_S_DOWN(主观下线),消息在sentinel之间传播,表示发现master掉线。
其他sentinel连接master,连接失败的sentinel在sentinel之间表示发现master掉线,当连接失败的sentinel占sentinel总数超过一半时,将master标记为SRI_O_DOWN(客观下线),确定master掉线。
选出sentinel担任处置工作:
所有的sentinel同时对其余的sentinel发送一条指令(SENTINEL is-master-down-by…),其中包含:下线的ip、下线的端口、竞选次数、runid
通过循环的投票机制,选出一台sentinel担任处置工作。
投票机制:每个sentinel均是投票者也是参选者,例如:当前有五台sentinel,其中4台sentinel会同时向剩余的一台sentinel发送自己的信息,剩余这台的sentinel会将自己的票投给信息最先到达的sentinel,最后通过所有投票情况选出获得票数最多的sentinel。
通过投票机制产生的sentinel从服务器列表中选择出备选的master
担任master的选择条件:
- 在线的
- 响应速度快的
- 与原master断开时间短的
- 优先原则:
- 优先级
- offset
- runid
发送指令
向新的master发送slaveof no one,表示与master断开连接
向其他slave发送slaveof 新master的IP 端口,使其他slave与新master产生主从关系
当原来的master重新启动后,会变成看slave节点。