Redis 2.8版开始正式提供名为Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:html
1. 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运做正常。
2. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 能够经过 API 向管理员或者其余应用程序发送通知。
3. 自动故障迁移(Automatic failover): 当一个主服务器不能正常工做时, Sentinel 会开始一次自动故障迁移操做, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其余从服务器改成复制新的主服务器; 当客户端试图链接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可使用新主服务器代替失效服务器。redis
Redis Sentinel 是一个分布式系统, 你能够在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪一个从服务器做为新的主服务器。shell
使用--sentinel参数启动,并必须指定一个对应的配置文件,系统会使用配置文件来保存 Sentinel 的当前状态, 并在 Sentinel 重启时经过载入配置文件来进行状态还原。服务器
redis-server /path/to/sentinel.conf --sentinel架构
使用TCP端口26379,可使用redis-cli或其余任何客户端与其通信。分布式
若是启动 Sentinel 时没有指定相应的配置文件, 或者指定的配置文件不可写(not writable), 那么 Sentinel 会拒绝启动。spa
如下是一段配置文件的示例:server
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1htm
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5进程
第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少须要 2 个 Sentinel 赞成 (只要赞成 Sentinel 的数量不达标,自动故障迁移就不会执行)。
不过须要注意的是,不管你设置要多少个 Sentinel 赞成才能判断一个服务器失效,一个 Sentinel 都须要得到系统中多数(majority) Sentinel 的支持,才能发起一次自动故障迁移,并预留一个给定的配置纪元 (Configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。也就是说,若是只有少数(minority)Sentinel 进程正常运做的状况下,是不能执行自动故障迁移的。
down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数(断定为主观下线SDOWN)。
parallel-syncs 选项指定了在执行故障转移时, 最多能够有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的从服务器由于复制而不可用。能够经过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。
1. 主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器作出的下线判断。
2. 客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器作出 SDOWN 判断, 而且经过 SENTINEL is-master-down-by-addr 命令互相交流以后, 得出的服务器下线判断。
客观下线条件只适用于主服务器: 对于任何其余类型的 Redis 实例, Sentinel 在将它们判断为下线前不须要进行协商, 因此从服务器或者其余 Sentinel 永远不会达到客观下线条件。
只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其余 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操做。
1. 每一个 Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其余 Sentinel 实例发送一个 PING 命令。
2. 若是一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 一个有效回复能够是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
3. 若是一个主服务器被标记为主观下线, 那么正在监视这个主服务器的全部 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
4. 若是一个主服务器被标记为主观下线, 而且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内赞成这一判断, 那么这个主服务器被标记为客观下线。
5. 在通常状况下, 每一个 Sentinel 会以每 10 秒一次的频率向它已知的全部主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的全部从服务器发送 INFO 命令的频率会从 10 秒一次改成每秒一次。
6. 当没有足够数量的 Sentinel 赞成主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器从新向 Sentinel 的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。
有两种方式能够与Sentinel进行通信:指令、发布与订阅。
PING :返回 PONG 。
SENTINEL masters :列出全部被监视的主服务器,以及这些主服务器的当前状态;
SENTINEL slaves <master name> :列出给定主服务器的全部从服务器,以及这些从服务器的当前状态;
SENTINEL get-master-addr-by-name <master name> : 返回给定名字的主服务器的 IP 地址和端口号。 若是这个主服务器正在执行故障转移操做, 或者针对这个主服务器的故障转移操做已经完成, 那么这个 命令返回新的主服务器的 IP 地址和端口号;
SENTINEL reset <pattern> : 重置全部名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操做清楚主服务器目前的全部状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的全部从服务器和 Sentinel ;
SENTINEL failover <master name> : 当主服务器失效时, 在不询问其余 Sentinel 意见的状况下, 强制开始一次自动故障迁移。
客户端能够经过SENTINEL get-master-addr-by-name <master name>获取当前的主服务器IP地址和端口号,以及SENTINEL slaves <master name>获取全部的Slaves信息
客户端能够将 Sentinel 看做是一个只提供了订阅功能的 Redis 服务器: 你不可使用 PUBLISH 命令向这个服务器发送信息, 但你能够用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 经过订阅给定的频道来获取相应的事件提醒。
一个频道可以接收和这个频道的名字相同的事件。 好比说, 名为 +sdown 的频道就能够接收全部实例进入主观下线(SDOWN)状态的事件。
经过执行 PSUBSCRIBE * 命令能够接收全部事件信息。
+switch-master <master name> <oldip> <oldport> <newip> <newport> :配置变动,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
能够看出,咱们使用Sentinel命令和发布订阅两种机制就能很好的实现和客户端的集成整合:
使用get-master-addr-by-name和slaves指令能够获取当前的Master和Slaves的地址和信息;而当发生故障转移时,即Master发生切换,能够经过订阅的+switch-master事件得到最新的Master信息。
*PS:更多Sentinel的可订阅事件参见官方文档。
在sentinel.conf中能够配置多个sentinel notification-script <master name> <shell script-path>, 如sentinel notification-script mymaster ./check.sh
这个是在群集failover时会触发执行指定的脚本。脚本的执行结果若为1,即稍后重试(最大重试次数为10);若为2,则执行结束。而且脚本最大执行时间为60秒,超时会被终止执行。
PS:目前会存在该脚本被执行屡次的问题,查找资料有人解释是: 脚本分为两个级别, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者仅由领头 Sentinel 执行(一个 Sentinel),然后者由监视同一个 master 的全部 Sentinel 执行(多个 Sentinel)。