Redis Sentinel为Redis提供了很高的可用性,在实践中,这意味着你可以部署一个可以解决非人为干预导致节点故障的Redis集群系统。Redis Sentinel还提供了其他的功能:如监控,通知和客户端配置服务的提供方。下面列出来了Redis Sentinel的功能列表:
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动 Redis Sentinel。
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
最后的文件结构:
4. 将maser-sentinel文件夹拷贝到10.7.12.52和10.5.35.3机器上各一份
5. 分别启动各自的start-sentinel.bat命令来启动redis-sentinel节点
10.7.112.52上的启动信息:
10.7.12.52上的启动信息
10.5.35.3上的启动信息
启动完之后发现sentinel.conf文件内容也自动发生了改变:
sentinel monitor mymaster 10.7.112.52 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
port 26379
dir "D:\\redis\\redis-cluster\\master-sentinel\\redis-64.2.8.17"
sentinel known-slave mymaster 10.5.35.3 6380
sentinel known-slave mymaster 10.7.12.52 6379
sentinel known-sentinel mymaster 10.7.12.52 26379 5356501f2b6b773704718527020dd88da1c43725
sentinel known-sentinel mymaster 10.5.35.3 26379 80bfae8b3c96aca804268b7f660ce1acdc80bc7d
sentinel current-epoch 0
此已经将redis sentinel的3个节点启动完成了,用redis-cli连接到master节点查看下集群信息:
我们用客户端程序来测试下redis的使用。
public static void main(String[] args){
Set sentinels = new HashSet();
sentinels.add(new HostAndPort("10.7.112.52", 26379).toString());
sentinels.add(new HostAndPort("10.7.12.52", 26379).toString());
sentinels.add(new HostAndPort("10.5.35.3", 26379).toString());
JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);
System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString());
Jedis master = sentinelPool.getResource();
master.set("name","张三");
sentinelPool.returnResource(master);
Jedis master2 = sentinelPool.getResource();
String value = master2.get("name");
System.out.println("name: " + value);
master2.close();
sentinelPool.destroy();
}
运行结果:
六月 08, 2015 3:35:24 下午 redis.clients.jedis.JedisSentinelPool initSentinels
信息: Trying to find master from available Sentinels...
六月 08, 2015 3:35:24 下午 redis.clients.jedis.JedisSentinelPool initSentinels
信息: Redis master running at 10.7.112.52:6379, starting Sentinel listeners...
六月 08, 2015 3:35:24 下午 redis.clients.jedis.JedisSentinelPool initPool
信息: Created JedisPool to master at 10.7.112.52:6379
Current master: 10.7.112.52:6379
name: 张三
现在来模拟master节点发生故障,看看redis sentinel对节点的故障转移,关闭10.7.112.52上的master节点,然后会发现10.7.112.52,10.7.12.52,10.5.35.3的sentinel节点上打印以下信息,实际上就是进行新Master节点的选举:
这里我们可以看到10.5.35.3上的slave节点被选举成为新的Master节点,然后10.7.12.52上的slave节点开始从这个新的master节点上同步数据:
这时查看10.7.112.52上的sentinel.conf文件,发现已经发生改变了:
sentinel monitor mymaster 10.5.35.3 6380 2
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
# Generated by CONFIG REWRITE
port 26379
dir "D:\\redis\\redis-cluster\\master-sentinel\\redis-64.2.8.17"
sentinel known-slave mymaster 10.7.12.52 6379
sentinel known-slave mymaster 10.7.112.52 6379
sentinel known-sentinel mymaster 10.5.35.3 26379 80bfae8b3c96aca804268b7f660ce1acdc80bc7d
sentinel known-sentinel mymaster 10.7.112.52 26379 1167bab5c8882cbc3b01a974c30ad6997e4e1d9d
sentinel current-epoch 1
而10.7.12.52上的redis.conf的文件也发生了改变,原来配置的是属于10.7.112.52的slave节点,现在调整成10.5.35.3的slave节点:
原来配置为:slaveof 10.7.112.52 6379
现在配置为:slaveof 10.5.35.3 6380
可见,当重新选举master节点时,各个slave节点的配置文件redis.conf和各个sentinel节点的配置文件sentinel.conf都会自动发生调整。
现在我们用redis-cli客户端连接到10.5.35.3上的master节点查看集群节点信息:
现在再把10.7.112.52上的redis节点启动起来,会发现该节点会自动加入redis集群,并且成为新maste(10.5.35.3)的slave节点:
现在我们再用redis-cli客户端连接到10.5.35.3上的master节点查看集群节点信息:
再次执行测试程序,结果如下:
六月 08, 2015 3:59:53 下午 redis.clients.jedis.JedisSentinelPool initSentinels
信息: Trying to find master from available Sentinels...
六月 08, 2015 3:59:53 下午 redis.clients.jedis.JedisSentinelPool initSentinels
信息: Redis master running at 10.5.35.3:6380, starting Sentinel listeners...
六月 08, 2015 3:59:53 下午 redis.clients.jedis.JedisSentinelPool initPool
信息: Created JedisPool to master at 10.5.35.3:6380
Current master: 10.5.35.3:6380
name: 张三