Redis Sentinel可以通过心跳检测的方式监视多个主服务器以及它们属下的所有从服务器,并在某个主服务器下线时自动对其实施故障转移。
1 启动Sentinel
一个Sentinel配置文件至少需要包含以下选项,用于指定Sentinel要监视的主服务器:
sentinel monitor <master-name> <ip> <port> <quorum>
选项中的master-name参数用于指定主服务器的名字,这个名字在执行各种Sentinel操作的时候会经常用到;ip参数和port参数用于指定主服务器的IP地址和端口号;而quorum参数则用于指定判断这个主服务器下线所需的Sentinel数量。
Sentinel开始监视一个主服务器之后,就会去获取被监视主服务器的从服务器名单,并根据名单对各个从服务器实施监视,整个过程是完全自动的,所以用户只需要输入待监视主服务器的地址就可以了,并不需要输入从服务器的地址。除此之外,Sentinel还会对每个被监视的主从服务器实施心跳检测,并记录各个服务器的在线状态、响应速度等信息,当Sentinel发现被监视的主服务器进入下线状态时,它就会开始对下线的主服务器实施故障转移。
1.1 处理重新上线的旧主服务器
**Sentinel可以同时监视多个主服务器;**Sentinel在对下线的主服务器实施故障转移之后,仍然会继续对它进行心跳检测,当这个服务器重新上线的时候,Sentinel将把它转换为当前主服务器的从服务器。
1.2 设置从服务器优先级
用户可以通过replica-priority配置选项来设置各个从服务器的优先级,优先级较高的从服务器在Sentinel选择新主服务器的时候会优先被选择。replica-priority的默认值为100,这个值越小,从服务器的优先级就越高。举个例子,如果现在有3个从服务器,它们的优先级分别为100、50和10,那么Sentinel将优先选用优先级为10的从服务器作为新的主服务器。replica-priority值为0的从服务器永远不会被选为主服务器,用户可以通过这一设置将不适合用作主服务器的从服务器排除在新主服务器的候选名单之外。
1.3 新主服务器的挑选规则
当Sentinel需要在多个从服务器中选择一个作为新的主服务器时,首先会根据以下规则从候选名单中剔除不符合条件的从服务器:1)否决所有已经下线以及长时间没有回复心跳检测的疑似已下线从服务器。2)否决所有长时间没有与主服务器通信,数据状态过时的从服务器。3)否决所有优先级为0的从服务器。
然后根据以下规则,在剩余的候选从服务器中选出新的主服务器:1)优先级最高的从服务器获胜。2)如果优先级最高的从服务器有两个或以上,那么复制偏移量最大的那个从服务器获胜。3)如果符合上述两个条件的从服务器有两个或以上,那么选出它们当中运行ID(运行ID是服务器启动时自动生成的随机ID,这条规则可以确保条件完全相同的多个从服务器最终得到一个有序的比较结果)最小的那一个。
2 Sentinel网络
只使用单个Sentinel监视主服务器和它属下的从服务器,容易造成单点故障。为了避免单点故障,可以使用多个Sentinel组建一个分布式Sentinel网络。对主服务器的状态进行投票,决定是否进行故障转移,因此至少需要使用3个Sentinel才能构建一个可信的Sentinel网络。
2.1 组建Sentinel网络
需要启动多个Sentinel,并使用sentinel monitor配置选项指定Sentinel要监视的主服务器,那些监视相同主服务器的Sentinel就会自动发现对方,并组成相应的Sentinel网络。
将Sentinel和被监视的Redis服务器放到不同的机器上运行,并且各个Sentinel也应该放到不同的机器上运行,这样Sentinel网络才能够更准确、有效地判断出服务器的实际状态。
3 Sentinel管理命令
3.1 SENTINEL masters:获取所有被监视主服务器的信息
向Sentinel发送以下命令
SENTINEL masters
3.2 SENTINEL master:获取指定被监视主服务器的信息
SENTINEL master <master-name>
3.3 SENTINEL slaves:获取被监视主服务器的从服务器信息
SENTINEL slaves <master-name>
3.4 SENTINEL sentinels:获取其他Sentinel的相关信息
SENTINEL sentinels <master-name>
3.5 SENTINEL get-master-addr-by-name:获取给定主服务器的IP地址和端口号
SENTINEL get-master-addr-by-name <master-name>
3.6 SENTINEL reset:重置主服务器状态
SENTINEL reset <pattern>
//重置名称为website_db的主服务器
SENTINEL reset website_db
//重置名称为website_为前缀的主服务器
SENTINEL reset website_*
SENTINEL reset命令可以让Sentinel忘掉主服务器之前的记录,并重新开始对主服务器进行监视,所以它通常只会在Sentinel网络或者被监视主从服务器的结构出现重大变化时使用。
3.7 SENTINEL failover:强制执行故障转移
SENTINEL failover <master-name>
3.8 SENTINEL ckquorum:检查可用Sentinel的数量
检查Sentinel网络当前可用的Sentinel数量是否达到了判断主服务器客观下线并实施故障转移所需的数量:
SENTINEL ckquorum <master-name>
SENTINEL ckquorum命令一般用于检查Sentinel网络的部署是否成功。
3.9 SENTINEL flushconfig:强制写入配置文件
通过向Sentinel发送以下命令,让Sentinel将它的配置文件重新写入硬盘中:
SENTINEL flushconfig
Sentinel在被监视服务器的状态发生变化时就会自动重写配置文件,所以这个命令的作用就是在配置文件基于某些原因或错误而丢失时,立即生成一个新的配置文件。此外,当Sentinel的配置选项发生变化时,Sentinel内部也会使用这个命令创建新的配置文件来替换原有的配置文件。
4 在线配置Sentinel
4.1 SENTINEL monitor:监视给定主服务器
通过执行以下命令,用户可以让Sentinel开始监视一个新的主服务器:
SENTINEL monitor <master-name> <ip> <port> <quorum>
4.2 SENTINEL remove:取消对给定主服务器的监视
当用户想要在线取消Sentinel对某个主服务器的监视时,可以使用以下命令:
SENTINEL remove <masters-name>
4.3 SENTINEL set:修改Sentinel配置选项的值
通过使用以下命令,用户可以在线修改Sentinel配置文件中与主服务器相关的配置选项值:
SENTINEL set <master-name> <option> <value>
//修改投票个数
SENTINEL set website_db quorum 3