Redis(二十八)- Redis的哨兵模式

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis(二十八)- Redis的哨兵模式相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556

文章目录

1. 简介

上一篇文章我们介绍了Redis中的主从复制模式,在文章的末尾我们说到了这种模式的一个弊端。那就是当master宕机之后,slave不能自动晋升为master,这就会导致redis服务出现不可用的情况。
这篇文章将介绍另外一种模式—哨兵模式,该模式在master宕机之后可以自动从各个slave中选举一个作为新的master。

2. 哨兵模式的构造

通过哨兵来监听master,当master宕机之后,哨兵会选举出新的master。哨兵可以设置一个,也可以设置多个,一般而言在生产中会设置大于1个的奇数个哨兵,这是为了防止哨兵自身宕机的情况。

3. 哨兵模式的设置

3.1. 将redis服务设置为一主两从

3.2. 新建 sentinel.conf 文件

在redis.conf的同级目录下,新建一个名为 sentinel.conf的文件,这个文件的名称不能修改,不能错。

3.3. 配置哨兵

在前面创建的sentinel.conf 文件中写入如下内容:

sentinel monitor mymaster 127.0.0.1 6379 1

其中,mymaster 为监控对象其的服务器名称,1 为至少有多少个哨兵同意迁移的数量。

3.4. 启动哨兵

/usr/local/bin 目录下有个名为redis-sentinel的程序,启动它即可启动哨兵。这里为了方便演示,采用的是客户端的启动方式。如果想采用后台启动的方式,则需要在 sentinel.conf 文件中设置daemonize yes

/usr/local/bin/redis-sentinel /myredis/sentinel.conf


正常启动之后可以看到sentinel 的端口号是 26379,监听到的master是: 127.0.0.1 6379

4. 观察哨兵模式的运行

这里手动将主服务器 6379宕机。然后,大概10秒左右可以看到哨兵窗口日志,切换了新的主机。

哨兵通过选举的方式,选出了 6380 作为新的master。

5. 哨兵模式的选举策略

哨兵模式的选举过程有三步:

  • 从下线的主服务的所有从服务里面挑选一个从服务,将其转成主服务。选择的条件详见下方说明。
  • 挑选出新的主服务之后sentinel向原主服务的从服务发送slaveof新主服务的命令,复制新master。
  • 当下线的服务重新上线时,sentinel 会向其发送slaveof命令,让其成为新主的从服务器。

5.1. 选举的条件

  1. 选择优先级靠前的
    优先级在redis.conf中默认replica-priority 100 ,值越小优先级越高
  2. 选择偏移量最大的
    偏移量是指获得原主机数据最全的
  3. 选择runid最小的从服务
    每个redis实例启动后都会随机生成一个40位的runid。

6. 复制延时

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

7. 连接哨兵模式代码

  private static JedisSentinelPool jedisSentinelPool = null;

    public static Jedis getJedisFromSentinel() 
        if (jedisSentinelPool == null) 
            Set<String> sentinelSet = new HashSet<>();
            sentinelSet.add("127.0.0.1:26379");
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(10); //最大可用连接数
            poolConfig.setMaxIdle(5); //最大闲置连接数
            poolConfig.setMinIdle(5); //最小闲置连接数
            poolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待
            poolConfig.setMaxWaitMillis(2000); //等待时间
            poolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试ping

            jedisSentinelPool = new JedisSentinelPool("mymaster", sentinelSet, poolConfig);
            return jedisSentinelPool.getResource();
        
        return jedisSentinelPool.getResource();
    

PS: 让文件显示行数的命令:: set nu

总结

本文首先介绍了哨兵模式的搭建,哨兵的搭建其实就是增加sentinel.conf文件,然后启动 redis-sentinel 命令
接着哨兵如何进行选举的,当主机宕机之后,哨兵在10秒后会检查一次,然后进行选举,选举的条件是:

  1. 选取优先级高的,即replica-priority值越小越先被选择,
  2. 选取偏移量最大的,即拥有主机数据最全的
  3. 选择runid最小的从服务

以上是关于Redis(二十八)- Redis的哨兵模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis(二十八)- Redis的哨兵模式

redis(二十一):Redis 架构模式实现(哨兵)

redis 简单整理——哨兵部署业务图[二十九]

redis 会丢数据吗

Redis Cluster的部署与维护

脑裂以及Redis主从同步中的坑