什么是Redis哨兵?

可用性是任何企业数据库最重要的质量之一。用户必须有保证,他们可以获得他们需要的信息和洞察力,以便在他们的工作中脱颖而出。

然而,确保数据库在需要时可用,说起来容易做起来难。“高可用性”一词指的是一种系统,它可以连续运行,而不会在超过平均时间的一段时间内发生故障。

Redis Sentinel是一种高可用性的解决方案Redis,一种开放源码的内存中数据结构存储,可用作非关系键值数据库.RedisSentinel的目标是通过三个不同的功能来管理Redis实例:监视您的Redis部署,如果有问题发送通知,以及通过创建一个新的主节点来自动处理故障转移过程。

作为一个分布式系统,RedisSentinel打算与其他哨兵进程一起运行。这降低了在检测主节点失败时出现假阳性的可能性,并使系统对任何单个进程的故障进行接种。

RedisSentinel的创建者建议您至少有三个哨兵实例,以便有一个健壮的哨兵部署。这些实例应该分布在可能彼此独立的计算机上,例如位于不同地理区域的计算机。

如何运行Redis哨兵

运行RedisSentinel需要两个可执行文件之一:红哨或Redis服务器.

带着红哨可执行文件,您可以使用以下命令运行Redis Sentinel:

redis-sentinel /path/to/sentinel.conf

其中“/path/to/entinel.conf”是Sentinel配置文件的路径。

带着Redis服务器可执行文件,您可以使用以下命令运行Redis Sentinel:

redis-server /path/to/sentinel.conf --sentinel

注意,在这两种情况下,您必须提供一个指向哨兵配置文件的链接。在运行RedisSentinel时需要使用配置文件,以便在系统重新启动时保存系统的当前状态。

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
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

在本例中,“哨兵监视器<主组名称>”行定义了一个名为Sentinel主节点的Sentinel主节点。主组名称在给定的IP地址和端口号上。这个法定人数参数是哨兵进程的数目,这些进程必须就无法到达主节点这一事实达成一致。

其他行定义以下设置:

“哨兵-每毫秒”:定义主节点不可访问的毫秒数。
“哨兵故障转移超时”:定义哨兵进程尝试为主节点的故障转移投票的时间长度。
“前哨并行同步”:定义可以在同一时间故障转移后重新配置为使用同一主节点的从节点数。

在Java上连接到Redis哨兵

对于Java程序员来说,坏消息是RedisSentinel与Java不兼容。然而,好消息是Redis Sentinel和Java可以使用诸如Redisson这样的框架轻松地协同工作,Redisson是Redis的一个Java客户端,它使用了许多常见的Java编程语言结构。Redisson提供了数十个以分布式方式实现的Java对象、集合、锁和服务,允许用户在不同的应用程序和服务器之间共享它们。

下面的代码示例演示如何在Java中开始使用RedisSentinel。在设置配置文件和雷迪森客户端,应用程序执行一些基本操作来演示在Java中使用Redis的可行性。

package redis.demo;
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<String, String> 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();
    }
}

需要注意的是,Redisson用户必须指定至少一个RedisSentinel服务器和至少一个Redis主节点。启动后,Redisson继续监视RedisSentinel中可用的主从节点以及哨兵节点的列表。这意味着用户不需要监视Redis拓扑的状态来处理故障转移情况;Redisson自己处理这个任务。