在前两篇Redis中sentinel集群的搭建和Jedis测试 图文教程[一] 和Redis中sentinel集群的搭建和Jedis测试 图文教程[二] 中分别简述了Redis中sentinel集群的搭建和Java代码的Jedis测试。
这篇主要来简单分析一下Redis-sentinel集群的原理,根据追踪sentinel信息来完成Redis-sentinel集群测试中的详细的原理分析。包括master-slave各个中的sentinel信息的分析,failover过程,master宕机后的leader选举过程等等方面深层次详细简述了其各个原理。
一、Redis常见HA方案
HA(High Available,高可用性群集)机集群系统简称,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执
行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。From 百度百科.
Redis 一般以主/从方式部署(这里讨论的应用从实例主要用于备份,主实例提供读写)该方式要实现 HA 主要有如下几种方案:
1)keepalived:通过 keepalived 的虚拟 IP,提供主从的统一访问,在主出现问题时, 通过 keepalived 运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟 IP 不变),坏处是引入 keepalived 增加部署复杂性,在有些情况下会导致数据丢失;
2) zookeeper: 通过 zookeeper 来监控主从实例, 维护最新有效的 IP, 应用通过 zookeeper取得 IP,对 Redis 进行访问,该方案需要编写大量的监控代码;
3)sentinel:通过 Sentinel 监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP&PORT)是不同的, 当故障发生进行主从切换后, 应用程序无法知道新地址,故 在 Jedis2.2.2 中 新 增 了 对 Sentinel 的 支 持 , 应 用 通 过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址。
下面是该方案的部署逻辑图。

二、Redis-sentinel配置与部署
详情请见Redis中sentinel集群的搭建和Jedis测试 图文教程[一]
由于 sentinel 服务器已经在 redis 服务器的环境中(redis-sentinel),我们这里就直接使用它们(在生产环境中,sentinel 服务器和 redis-server 服务器一般是分离的,部署在不同的pc-server 上面,同时 sentinel 的个数和 redis-server 个数也没联系,下面为了方便学习使用将3 台 sentinel 服务都放到了一台 pc 上)。
注意: sentinel 配置文件只和默认的 master 有关系,和 slave 都没有关系。我们上面的例子是用了 3 个 redis-server 和 3 个 redis-sentinel,其实 redis-sentinel的个数不一定要和 redis-sever 对应,1~n 个都可以。
首先要清楚,sentinel是一个独立于redis之外的进程,不对外提供key/value服务。在redis的安装目录下名称叫 redis-sentinel 。 主要用来监控redis-server进程,进行master/slave管理,如果你的redis没有运行在master/slave模式下,不需要设置sentinel。
三、Redis-sentinel启动和检测
分别启动 redis-server 和redis-sentinel。
1)启动 redis-0 时 redis-0 的 sentinel 控制台
2)启动 redis-1 时 reids-1 的 sentinel 控制台
启动 redis-1 时 reids-0 的 sentinel 控制台
3)启动 redis-2 时 reids-2 的 sentinel 控制台
启动 redis-2 时 reids-0 的 sentinel 控制台
启动 redis-2 时 reids-1 的 sentinel 控制台
<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCjxwPqGhoaHNqLn9yc+1xL/Y1sbK5LP20MXPor/J0tS/tLP2o6zU2tLAtM7G9Lavt/7O8cqxo6y21NPDv9jWxsyoyuSz9sHLK3NlbnRpbmVsoaIrc2xhdmWhoi1zZG93biC1yNDFz6KjrMu1w/e497j2IHNlbnRpbmVsINauvOS9+NDQwcvNqNG2o6y2+MfS0rK84L/Ytb3ByyByZWRpcy1zZXJ2ZXIgtcTH6b/2oaMrc2VudGluZWwgse3KvtPQ0MK1xCBzZW50aW5lbCDKtcD9vNPI67W9vOC/2KGjzOHKvqO6yte0zrm5vaggc2VudGluZWwgu7e+s8qxo6yx2NDrytfPyMb0tq8gbWFzdGVyILv6xvehoyAgPGJyPgqhoaGhIDxicj4KoaGhoTSjqbLpv7TP4LnY0MXPoiAgPGJyPgqhoaGhyrnTwyAjIG5ldHN0YXQgLW50bHAg" grep redis 命令可以看到当前 redis 运行情况。
通过 redis-cli 查看 redis-server 的状态
/usr/local/webserver/redis/redis-cli -h 127.0.0.1 -p 6379 -a abcd123457 info Replication
(上面的 -a 用来输入密码)
说明:info 指令
该指令将会打印完整的服务信息,包括集群,我们只需要关注”Replication”部分(在上面的命令中,我们在 info 后面加上了 Replication 的限制,如果不加,这还会输出 Server、Clients、Memory、Persistence、Stats、CPU 和 Keyspace 等信息),这部分信息将会告诉我们”当前 server 的角色”以及指向它的所有的 slave 信息。可以通过在任何一个 slave 上,使用”INFO”指令获得当前 slave 所指向的 master 信息。下面是 slave1 的 Replication 信息。
同时,该指令不仅可以帮助我们获得集群的情况,当然 sentinel 组件也是使用”INFO”做同样的事情。下面是 slave2 的 sentinel 信息。
通过上面信息,可以清楚看到 redis 服务状态和主从关系。
5)failover 测试
当上述部署环境稳定后,我们直接关闭 redis-0,在等待”down-after-milliseconds”秒之后(30 秒),redis-0/redis-1/redis-2 的 sentinel 窗口会立即打印”+sdown”、”+odown”、”+failover”、”+selected-slave”、 “+promoted-slave”、 “+slave-reconf”等等一系列指令, 这些指令标明当 master失效后,sentinel 组件进行 failover 的过程。
模拟 mater 宕机的情况。此时各 sentinel 控制台输出如下信息。
redis-0 上的 sentinel 信息.
redis-1 上的 sentinel 信息
redis-2 上的 sentinel 信息

从上面三个窗口的信息可以看出, 当 master 宕机后, 三个 sentinel(哨兵)进行了对 master进行了故障转移。
{从 redis-1 的 sentinel 控制台可以看出,进行了下面的操作。
a.+sdown mater mymaster 127.0.0.1 6379 (主观认为 mater 失效);
b.+odown mater mymaster 127.0.0.1 6379 #quorum 2/2(已经有两个哨兵认为 master 主观失效,则认为 mater 客观失效);
c.+new-epoch 1(准备进行新 mater 的选取);
d.+try-failover master mymaster 127.0.0.1 6379(尝试热备份切换,master 让出位置);
e.+vote-for-leader 1eb0f03b7a7815c3c5506b0fa041ad8d6ca9db90 1(投票选举 Leader);
f.127.0.0