Sentinel为Redis提供了高可用性架构,该部署架构可以在无需人工干预的情况下完成故障转移;同时也提供监控,通知等其他功能.
一. 架构
sentinel的主要架构如下: redis服务1主2从,用来数据备份和分流; 3个sentinel服务用来做系统监控,通知和故障转移.
二. 配置
为了sentinel能正确的进行监控和故障转移,首先了解下sentinel.conf配置
pidfile /var/run/redis-sentinel.pidlogfile ""daemonize yesport 26379dir /tmp# 集群监控配置# 定义master节点为127.0.0.1 6379的集群名称为mymaster# 哨兵票选时,至少需要2个哨兵认为节点down了,才认为真正down了sentinel monitor mymaster 127.0.0.1 6379 2# 指ping命令超时时间,超过后会变成主观下线状态,单位:毫秒sentinel down-after-milliseconds mymaster 30000# 发生故障转移时最多有多少个slave节点同时对新的master进行数据同步sentinel parallel-syncs mymaster 1# 指定故障转移超时,单位:毫秒sentinel failover-timeout mymaster 180000# 发生警告事件时调用的脚本,如主观下线和客观下线sentinel notification-script # 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息.以下参数将会在调用脚本时传给脚本:# #目前总是[failover], 是[leader]或者[observer]中的一个. 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的sentinel client-reconfig-script # 运行时不能更新notification-script和client-reconfig-script通知脚本sentinel deny-scripts-reconfig yes
三. 定时任务
为了维持各节点间的信息交互,以及系统能够及时故障转移,Sentinel提供了3个定时任务
1. 每10秒一次,向所有的master和slave节点发送info命令.
主要用于,发现slave节点信息和确认各节点主从关系;
2. 每2秒一次,利用了master的pub/sub机制,所有sentinel节点发布自己和master节点信息;同时订阅该channel,更新自己维护的节点列表信息.
pub/sub channel: __sentinel__:hello
3. 每1秒一次,每个sentinel节点向所有redis节点和其他sentinel节点发送PING命令,进行心跳检测.
回复:+PONG , -LOADING或者-MASTERDOWN
四. 故障转移
主要流程如下:
1.如果一个sentinel距最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,那么这个redis节点会被 sentinel 标记为主观下线(SDOWN).
2. 被标记为主观下线的master节点,sentinel 会以每秒一次的频率确认主服务器的确进入了主观下线(SDOWN)状态.
3. 当sentinel集群中有足够数量节点都认为是主观下线状态,这个master节点就会被标记为客观下线,同时会以每秒一次的频率向slave节点发送info命令;反之,没有足够数量时,会移除主观下线(ODOWN)状态.
4. 各sentinel节点,会根据raft协议选出主节点,协调执行故障转移.
5. sentinel主节点会优先选择优先级小,复制偏移量大,进程ID小的节点选为master并发送SLAVEOF NO ONE命令.
6. sentinel主节点通知其他slave节点的主节点变更为新master节点,并进行数据复制.
五. TILT 模式
redis sentinel 严重依赖计算机的时间功能: 比如说,为了判断一个实例是否可用, sentinel 会记录这个实例最后一次相应 PING 命令的时间,并将这个时间和当前时间进行对比, 从而知道这个实例有多长时间没有和sentinel进行任何成功通讯.
不过, 一旦计算机的时间功能出现故障, 或者计算机非常忙碌, 又或者进程因为某些原因而被阻塞时, sentinel 可能也会跟着出现故障.
TILT 模式是一种特殊的保护模式: 当 sentinel 发现系统有些不对劲时, sentinel 就会进入 TILT 模式.
因为 sentinel 的时间中断器默认每秒执行 10 次, 所以我们预期时间中断器的两次执行之间的间隔为 100 毫秒左右. sentinel 的做法是, 记录上一次时间中断器执行时的时间, 并将它和这一次时间中断器执行的时间进行对比:
如果两次调用时间之间的差距为负值,或者非常大(超过 2 秒钟), 那么 sentinel 进入 TILT 模式.
如果 sentinel 已经进入 TILT 模式, 那么 sentinel 延迟退出 TILT 模式的时间.
当 sentinel 进入 TILT 模式时, 它仍然会继续监视所有目标, 但是:
它不再执行任何操作,比如故障转移.
当有实例向这个 sentinel 发送 sentinel is-master-down-by-addr 命令时, sentinel 返回负值: 因为这个 sentinel 所进行的下线判断已经不再准确.
如果 TILT 可以正常维持 30 秒钟,那么 sentinel 退出 TILT 模式.
六. 常用命令
1. 获取指定master信息
sentinel master <master name>
2. 获取所有master信息
sentinel masters
3. 列出给定master的所有slave节点信息.
sentinel slaves <master name>
4. 获取指定master的sentinel信息
sentinel sentinels <master-name>
5. 询问指定sentinel节点redis master节点是否下线状态.
sentinel is-master-down-by-addr <ip> <port> <current-epoch> <runid>
6. 返回指定集群的ip和端口.
sentinel get-master-addr-by-name
7. 重置匹配的主服务器状态.
sentinel reset <pattern>
8. 当主服务器失效时,强制开始一次故障迁移.
sentinel failover <master name>
9. 检查当前的sentinel配置是否能够达到故障转移主机所需的仲裁,以及授权故障转移所需的大多数.在监视系统中应使用此命令来检查sentinel部署是否正常.
sentinel ckquorum<master name>
10. 设置sentinel开始设置监视具有指定名称,ip,端口和仲裁数量的主服务器
sentinel monitor <name> <ip> <port> <quorum>
11. 如果sentinel监控的主节点设置了密码,sentinel通过以上命令添加主节点的密码
sentinel auth-pass <master-name> <password>
12. 删除指定master集群,sentinel不再对该集群进行监控
sentinel remove
13. 设置指定集群对应sentinel属性
sentinel set <mastername> [<option> <value>]
关于sentinel操作命令点击阅读全文查看官方文档了解更多详细说明
七. Sentinel集群的不足
1. 集群较难支持横向扩容,且单节点的容量是有限的。
2. 从节点并不能分担主节点的压力,在没有故障发生时是很浪费资源的.
3. 系统高度依赖计算机时间,时间不一致时,容易造成系统不稳定,以及脑裂等事件.
综上,sentinel集群在数据量不是很大,并发也不是很高的情况是一种不错的选择.
推荐阅读
Redis pub/sub 发布订阅功能
Redis Pipeline 命令的批量操作
Redis 事务 批量命令的原子操作
Redis HyperLogLog UV等基数统计
Redis geo 轻松实现「附近的人」
Redis 三种数据持久化方式
Redis 过期策略
Redis 慢日志
Redis 主从同步
(长按二维码即可关注)