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

举报
码农飞哥 发表于 2022/06/04 23:39:30 2022/06/04
【摘要】 您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 ❤️ 2. Python爬虫...

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
💪🏻 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

 
  • 1

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

3.4. 启动哨兵

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

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

 
  • 1

在这里插入图片描述
正常启动之后可以看到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();
    }


 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

PS: 让文件显示行数的命令:: set nu
在这里插入图片描述

总结

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

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

文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。

原文链接:feige.blog.csdn.net/article/details/125124220

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。