主从模式下,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 *