主从模式下,slave能够很不便的进行伸缩,但master只有一个,依然存在单点故障问题。明天咱们来看redis的哨兵模式是如何来解决这个问题的。

哨兵职责

哨兵模式(sentinel)是redis官网提供的高可用集群解决方案。它是建设在主从模式的根底上,通过哨兵系统监控整个集群的健康状况,对master实例进行主动故障转移。哨兵零碎也是一个高可用的集群零碎,其性能蕴含以下几点

  • 监控(Monitor) 哨兵零碎会不间断(每秒一次的频率)的向监控的redis实例发送ping指令。被监控的redis服务会进行三种回复,PONG、LOADING和MASTERDOWN。如果redis在无效工夫内(down-after-milliseconds设置工夫的大小)进行了PONG的回复,则示意服务运行失常,若未回复,或者回复了其它两种则示意服务异样。
  • 告诉(Notification) 当被监控的某个 Redis 服务器呈现问题时, Sentinel 能够通过 API 向管理员或者其余应用程序发送告诉。
  • 主动故障迁徙(Automatic failover) sentinel监控到redis服务异样时,并且在指定的时间段内(master-down-after-milliseconds配置)始终是异常情况,sentinel会将该redis服务标记为主观下线(Subjectively Down)。当有足够多的sentinel(通常为一半以上数量的sentinel)都将该redis标记为主观下线时,此时达到了主观下线(Objectively Down)的条件,置为主观下线。sentinel此时会从集群中下掉该redis,同时通过选举选出新的master。应用 replica no one 将slave变为master,而后对其余slave执行 replicaof ip port指定追寻新的master。sentinel也会将本人监控的master配置信息更新掉。

哨兵集群

启动一个哨兵
一个哨兵实例也是一个redis实例,只是运行在非凡的模式下。哨兵默认应用的端口是26379。有两种形式能够启动一个哨兵实例

  • 启动redis-sentinel运行程序
  • 启动一个一般的redis程序

      redis-server /path/to/sentinel.conf --sentinel

配置文件
启动 Sentinel 实例必须指定相应的配置文件sentinel.conf, 零碎会应用配置文件来保留 Sentinel 的以后状态, 并在 Sentinel 重启时通过载入配置文件来进行状态还原。因而进行和重启哨兵是平安的,不会产生数据失落。

#监控一个master服务,起个名字叫mymaster,#监控的master的ip:127.0.0.1,端口6379#定义至多要有2个sentinel都批准才能够标记监控redis主观下线sentinel monitor mymaster 127.0.0.1 6379 2#60000毫秒以内监控的redis都没有反馈健康状况,则认为异样sentinel down-after-milliseconds mymaster 60000#主动故障转移的解决过期工夫sentinel failover-timeout mymaster 180000#故障转移实现时可并行同步的slave的实例个数sentinel parallel-syncs mymaster 1

哨兵间通信
在哨兵集群中,每个哨兵都不须要配置其余哨兵的服务地址,都能够相互交换信息,并监控彼此的可用性。这是借助redis的公布订阅来实现的

  • 哨兵中均指定了监控的master实例,在启动后会在master上开启一个公布订阅信道sentinel_hello
  • 所有的哨兵订阅sentinel_hello频道,并向其公布音讯,音讯内容中蕴含了哨兵本人的id、ip和端口
  • 哨兵在sentinel_hello中取得其余哨兵的地址信息,更新到本人的哨兵列表中
  • Sentinel 发送的信息中还包含残缺的主服务器以后配置(configuration)。 如果一个 Sentinel 蕴含的主服务器配置比另一个 Sentinel 发送的配置要旧, 那么这个 Sentinel 会立刻降级到新配置上。

当咱们开启一个客户端连贯上master redis实例时,能够订阅频道来获取哨兵公布的频道数据

PSUBSCRIBE *