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. 选举的条件
- 选择优先级靠前的
优先级在redis.conf中默认replica-priority 100
,值越小优先级越高
- 选择偏移量最大的
偏移量是指获得原主机数据最全的 - 选择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秒后会检查一次,然后进行选举,选举的条件是:
- 选取优先级高的,即replica-priority值越小越先被选择,
- 选取偏移量最大的,即拥有主机数据最全的
- 选择runid最小的从服务
以上是关于Redis(二十八)- Redis的哨兵模式的主要内容,如果未能解决你的问题,请参考以下文章