【Redis】深入解析哨兵模式(Sentinel)

首先明确一点,哨兵模式就是为了弥补主从复制中,当主机挂掉之后,需要重新手动选择主机的缺点而提出的方案。哨兵模式可以自动选取主机。

啥是哨兵?就是监视某区域的士兵,这里的哨兵模式就是这个意思,什么是哨兵?哨兵(Sentinel)就是一个独立的进程,多个Sentinel实例组成Sentinel集群。哨兵(Sentinel)通过发送命令,等待服务器响应,以此来监视多个redis实例,被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

在这里插入图片描述
简单点说,有点像打仗时候的侦查兵,连长挂掉了,排长顶上,排长挂掉了班长顶上

哨兵模式的主要功能

  • 集群监控,监控master和slave进程是否正常工作
  • 消息通知,如果redis实例出现故障,哨兵Sentinel进程负责报警
  • 故障转移,master挂掉,slave选举上岗
  • 配置中心,如果故障转移出现,通知client客户端新的master

如何实现哨兵模式

新建sentinel.conf

输入

sentinel monitor host6379 127.0.0.1 6379 1

启动哨兵模式

[root@localhost bin]# redis-sentinel /myredis/sentinel.conf 

启动成功
在这里插入图片描述
此时挂掉6379,等待一段时间之后,发现6381成为主机
在这里插入图片描述
6381set数据
在这里插入图片描述
6380可以获取到数据
在这里插入图片描述
等6379恢复之后,成为从机
在这里插入图片描述
然后观察sentinel日志,发现选举失败一次,然后选举了6381
`

复制的缺点

由于所有写操作都是先在master上操作,然后同步更新到slave上,所以从master同步到slave机器上有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这个问题更加严重

实际java项目中应用

第一步,配置主从,由于主从复制中,配从不配主,故只修改从主机的配置文件即可

# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.25.139 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456

第二步,修改sentinel.conf

protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,1代表只有一个或一个以上的哨兵认为主服务器不可用的时候(可以改为2),才会进行failover操作。
sentinel monitor mymaster 192.168.25.139 6379 1

然后启动主机和从机,最后启动哨兵服务即可

启动顺序

首先是主机(192.168.25.139)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。

第三步,编写java代码,使用jedis为例

/**
 * 测试Redis哨兵模式
 * @author jie
 */
public class TestSentinel {
    @SuppressWarnings("resource")
    @Test
    public void testSentinel() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.25.139:6379",
                "192.168.25.139:6379","192.168.25.139:6379"));
        // 创建连接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig);
        // 获取客户端
        Jedis jedis = pool.getResource();
        // 执行两个命令
        jedis.set("k1", "v1");
        String value = jedis.get("k1");
        System.out.println(value);
    }
}

猜你喜欢

转载自blog.csdn.net/yujing1314/article/details/106683232