Sentinel 模块在Twemproxy、ReHash中的应用

一 Sentinel API概念理解

         Starting with Redis version2.8.4, Sentinel provides an API in order to add, remove, or change the configuration of a given master.(Jedis推荐用最新,)
      
       
redis.clients
jedis
2.4.2
    

 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:

       Jedis j=new Jedis("127.0.0.1", 26379 );

    有两种方式可以与Sentinel进行通讯:指令、发布与订阅。

    1.1 通过 Sentinel命令

       PING :返回 PONG 。
       SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态;
       SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;
       SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个                     命令返回新的主服务器的 IP 地址和端口号;
       SENTINEL reset : 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel ;
       SENTINEL failover : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。

客户端可以通过SENTINEL get-master-addr-by-name 获取当前的主服务器IP地址和端口号,以及SENTINEL slaves 获取所有的Slaves信息

    1.2 通过 发布与订阅

    客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
   一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
  通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。

        +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。

     可以看出,我们使用Sentinel命令和发布订阅两种机制就能很好的实现和客户端的集成整合:

        使用get-master-addr-by-name和slaves指令可以获取当前的Master和Slaves的地址和信息;

       当发生故障转移时,即Master发生切换,可以通过订阅的  "+switch-master" 事件获得最新的Master信息。

    *PS:更多Sentinel的可订阅事件参见官方文档。

  1.3 sentinel.conf中的notification-script

    在sentinel.conf中可以配置多个sentinel notification-script , 如sentinel notification-script mymaster ./check.sh

    这个是在群集failover时会触发执行指定的脚本。脚本的执行结果若为1,即稍后重试(最大重试次数为10);若为2,则执行结束。并且脚本最大执行时间为60秒,超时会被终止执行。

    PS:目前会存在该脚本被执行多次的问题,查找资料有人解释是:
        脚本分为两个级别, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者仅由领头 Sentinel 执行(一个 Sentinel),而后者由监视同一个 master 的所有 Sentinel 执行(多个 Sentinel)。

二 TwemProxy整合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 模块与ShardedJedisPool实现rehashing

  思路:   通过定时监控 sentinel 中的 "+switch-master"  channel  ,获得当前的 master,以配置文件的形式重新构建 shardedjedispool池。

   参考:  基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

   http://www.xiutx.cn/


你可能感兴趣的:(数据缓存-redis)