![使用Java和Redis Sentinel实现Redis的高可用](http://p2.ttnews.xyz/loading.gif)
什么是Redis Sentinel?
可用性是企业在选择数据库的最重要的指标之一,用户往往关注的是数据的实时性和准确性。
但是,高可用数据库,说起来简单,做起来却不容易,“高可用性”需要系统可以连续工作不出现故障,但是实际工作中,系统的使用时间不可能比用户的使用时间长,那么怎么保证这种稳定性呢。
下面我们来看看Redis Sentinel。
Redis Sentinel是Redis的一种高可用性解决方案,对于Redis这里不再过多介绍,Redis Sentinel的目标是通过三种不同的功能来管理Redis实例:监视您的Redis部署,在出现问题时发送通知,以及通过创建新的主节点自动处理故障转移过程。
作为分布式系统,Redis Sentinel旨在与其他Sentinel进程一起运行。这减少了在检测到主节点发生故障时出现误报的可能性,并且还为系统接种了任何单个进程的故障。
Redis Sentinel的开发者建议我们至少有三个Sentinel实例,以便进行可靠的Sentinel部署。这些实例应分布在可能彼此独立故障的计算机之间,例如位于不同地理区域的计算机。
如何运行Redis Sentinel?
运行Redis Sentinel将需要以下两个可执行文件之一:redis-sentinel或redis-server。
使用redis-sentinel可执行文件,可以使用以下命令运行Redis Sentinel
使用redis-sentinel可执行文件,可以使用以下命令运行Redis Sentinel:
<code>redis-sentinel /path/to/sentinel.conf/<code>
其中“ /path/to/sentinel.conf”是Sentinel配置文件的路径
使用redis-server可执行文件,可以使用以下命令运行Redis Sentinel:
<code>redis-server /path/to/sentinel.conf --sentinel/<code>
请注意,在两种情况下,都必须提供指向Sentinel配置文件地址。运行Redis Sentinel时需要使用配置文件,以便在系统重新启动时保存系统的当前状态。
Redis Sentinel配置文件示例如下所示:
<code>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 sentinel monitor resque 192.168.1.3 6380 4 sentinel down-after-milliseconds resque 10000 sentinel failover-timeout resque 180000 sentinel parallel-syncs resque 5/<code>
在本例中,行“sentinel monitor”在给定的ip地址和端口号上定义一个名为master group name的sentinel主节点。quorum参数是必须同意主节点不可访问这一事实的Sentinel进程数。
其他行定义以下设置:
“sentinel down after millishes”:定义在毫秒数之后将认为无法访问主节点。
“sentinel failover timeout”:定义sentinel进程尝试为主节点的故障转移时间。
“sentinel parallel syncs”:定义在故障转移后可以重新配置为同时使用同一主节点的从属节点的数量
使用Java连接Redis Sentinel
对于Java程序员来说,坏消息是Redis Sentinel与Java不兼容。但是,好消息是Redis Sentinel和Java可以使用诸如Redisson或者Jedis的框架轻松地协同工作,Redisson是Redis的Java客户端,它使用许多熟悉的Java编程语言构造。Redisson提供了数十种以分布式方式实现的Java对象,集合,锁和服务,从而允许用户在不同的应用程序和服务器之间共享它们。
以下代码示例演示了如何在Java中开始使用Redis Sentinel。设置配置文件和Redisson客户端后,该应用程序执行一些基本操作,以演示将Redis与Java结合使用的可行性。
<code>import org.redisson.Redisson; import org.redisson.api.RBucket; import org.redisson.api.RedissonClient; /** * Redis Sentinel Java example * */ public class Application { public static void main( String[] args ) { Config config = new Config(); config.useSentinelServers() .addSentinelAddress("redis://127.0.0.1:6379") .setMasterName("myMaster"); RedissonClient redisson = Redisson.create(config); // perform operations // implements java.util.concurrent.ConcurrentMap RMap map = redisson.getMap("simpleMap"); map.put("mapKey", "This is a map value"); String mapValue = map.get("mapKey"); System.out.println("stored map value: " + mapValue); // implements java.util.concurrent.locks.Lock RLock lock = redisson.getLock("simpleLock"); lock.lock(); try { // do some actions } finally { lock.unlock(); } redisson.shutdown(); } }/<code>
请务必注意,Redisson用户必须指定至少一台Redis Sentinel服务器和至少一台Redis主节点。启动后,Redisson继续监视Redis Sentinel中可用的主节点和从节点以及Sentinel节点的列表。这意味着用户无需监视Redis拓扑的状态即可处理故障转移情况。Redisson独自完成了此任务。