By default Sentinel runs using TCP port 26379 (note that 6379 is the normal Redis port). Sentinels accept commands using the Redis protocol, so you can use redis-cli
or any other unmodified Redis client in order to talk with Sentinel.
for example:
有两种方式可以与Sentinel进行通讯:指令、发布与订阅。
PING :返回 PONG 。
SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态;
SENTINEL slaves
SENTINEL get-master-addr-by-name
SENTINEL reset
SENTINEL failover
客户端可以通过SENTINEL get-master-addr-by-name
客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。
+switch-master
可以看出,我们使用Sentinel命令和发布订阅两种机制就能很好的实现和客户端的集成整合:
使用get-master-addr-by-name和slaves指令可以获取当前的Master和Slaves的地址和信息;
当发生故障转移时,即Master发生切换,可以通过订阅的 "+switch-master" 事件获得最新的Master信息。
*PS:更多Sentinel的可订阅事件参见官方文档。
在sentinel.conf中可以配置多个sentinel notification-script
这个是在群集failover时会触发执行指定的脚本。脚本的执行结果若为1,即稍后重试(最大重试次数为10);若为2,则执行结束。并且脚本最大执行时间为60秒,超时会被终止执行。
PS:目前会存在该脚本被执行多次的问题,查找资料有人解释是:
脚本分为两个级别, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者仅由领头 Sentinel 执行(一个 Sentinel),而后者由监视同一个 master 的所有 Sentinel 执行(多个 Sentinel)。
思路: 通过定时监控 sentinel 中的 "+switch-master" channel ,获得当前的 master,与TwemProxy配置文件nutcracker.yml中的server对比,不一致,则更新配置文件,并通过脚本重启TwemProxy。
参考: http://1.breakwang.sinaapp.com/?p=271 (Python实现)
https://github.com/areina/smitty (Go实现)
思路: 通过定时监控 sentinel 中的 "+switch-master" channel ,获得当前的 master,以配置文件的形式重新构建 shardedjedispool池。
参考: 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
http://www.xiutx.cn/