目录
Sentinel
由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求
当server1的下线时长超过用户设定的下线时长上线时,Sentinel系统就会对服务器执行故障转移操作:
- 首先,Sentinel系统会挑选server1属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器
- 之后,Sentinel系统会向server1属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕
- 另外,Sentinel还会继续监视已下线的server1,并在它重新上线时,将它设置为新的主服务器的从服务器
启动并初始化Sentinel
当一个Sentinel启动时,它需要执行以下步骤:
- 初始化服务器
- 将普通Redis服务器使用的代码替换成Sentinel专用代码
- 初始化Sentinel状态
- 根据给定的配置文件,初始化Sentinel的监视主服务器列表
- 创建连向主服务器的网络连接
获取主服务器信息
Sentinel默认会以每十秒一次的频率,通过命令连接向被监视到的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息
主服务器实例结构和从服务器实例结构之间的区别:
- 主服务器实例结构的flags属性的值为SRI_MASTER,而从服务器实例结构的flags属性的值为SRI_SLAVE
- 主服务器实例结构的name属性的值是用户使用Sentinel配置文件设置的,而从服务器实例结构的name属性的值则是Sentinel根据从服务器的IP地址和端口号自动设置的
获取从服务器信息
根据INFO命令的回复,Sentinel会提取出以下信息:
- 从服务器的运行ID run_id
- 从服务器的角色role
- 主服务器的IP地址master_host,以及主服务器的端口号master_port
- 主从服务器的连接状态master_link_status
- 从服务器的优先级slave_priority
- 从服务器的复制偏移量slave_repl_offset
根据这些信息,Sentinel会对从服务器的实例结构进行更新
检测主观下线状态
有效恢复:实力返回+PONG、-LOADING、-MASTERDOWN三种回复中的一种
无效回复:返回除以上三种之外的其他回复
如果一个实例在down-after-milliseconds毫秒内,连续向Sentinel返回无效回复,那么Sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开SRI_S_DOWN标识,以此来表示这个实例已经进入主观下线状态
检查客观下线状态
当Sentinel从其它Sentinel那里接受到足够数量的下线判断之后,Sentinel就会将从服务器判定为客观下线
选举领头Sentinel
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,最先向目标Sentinel发送设置要求的源Sentinel将成为目标Sentinel的局部领头Sentinel,而之后接受到的所有设置要求都会被拒绝,如果由某个Sentinel被半数以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel成为领头Sentinel,并由这个Sentinel对下线主服务器执行故障转移操作。
故障转移
- 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器
- 让已下线主服务器属下的所有从服务器改为复制新的主服务器
- 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器