哨兵系统java_Redis 哨兵模式

哨兵系统java_Redis 哨兵模式Redis 提供了一种能监控多台 Redis 服务器 并且能完成主从切换的特殊模式 Redis 哨兵模式我们能用 Redis 主从实现读取分流 但是如果某个时间点写入数据如果太大 给 master 造成太大压力造成宕机 如果没有哨兵模式的情况下我们就需要人工处监控理 这样就造成了某个时间段 Redis 不能提供服务 然而使用哨兵模式 我们就能解决某个时间段 Redis 不能提供服务的问题 Redis 哨兵模式主要的两

Redis提供了一种能监控多台Redis服务器,并且能完成主从切换的特殊模式—-Redis哨兵模式

我们能用Redis主从实现读取分流,但是如果某个时间点写入数据如果太大,给master造成太大压力造成宕机,如果没有哨兵模式的情况下我们就需要人工处监控理,这样就造成了某个时间段Redis不能提供服务,然而使用哨兵模式,我们就能解决某个时间段Redis不能提供服务的问题,Redis哨兵模式主要的两个功能:监控服务和主从切换

一、主从切换原理

哨兵(Sentinel)不仅要监控所有的Redis服务,也要监控其他的Sentinel。原理就是Sentinel向Redis或者其他Sentinel发送ping命令,其他服务则响应。

d31b01c64324f526a1f2a7789dd85d00.png

主观下线:例如Sentinel向Redis发送命令后,有台Redis服务没响应则认为该服务器为主观下线

客观下线:如果多个Sentinel都对同一个服务做出了主观下线的判断,并且通过交流之后会认定该服务器为客观下线

它们的区别可以这样理解:主观下线是“只有我认为它宕机了”,而客观下线是“大部分人都认为它宕机了”,当一台服务器被认定客观下线之后,Sentinel有可能会进行一次选举。为什么说有可能,因为选举的目的是选择一个新的 master ,如果宕机的是 slave 则不影响系统使用,假如宕机的是 master 这时 Sentinel才会进行一次选举。选一个 Sentinel 作为 leader 来决定应该把哪台 slave 切换为 master。这就是主从切换的一个基本过程

二、监控原理

一个刚刚新启动的Sentinel如何得知其他的Sentinel信息和Redis信息?

它会每10秒向master发送一次info命令,master这时返回的信息可以分为两个部分,第一部就是master自身的信息,另外一个部分就是 slave 的信息,这样就知道了当前master的所有 slave 信息。

4a7cc570d3e17155927e8aa00e545825.png

它还会每2秒向master发送 发布(publish)/订阅(subscribe) 命令从而获取其他 Sentinel 的信息

ffa3675935689e7268ab8994e59028ff.png

三、redis配置

下面是我事先配置好的三台Redis主从信息,主从配置可以在这里看

740e25866507d3a282ba521adef62a01.png

接下来开始配置Sentinel,找到redis-sentinel.conf文件,与redis.conf放在同一个目录

64c080899b9c61d97d3de45ec8c150cd.png

在配置文件加上配置找到sentinel monitor 、sentinel auth-pass 并且配置

配置监听的主服务器,这里sentinel monitor代表监控

mymaster是服务器的名称,可以自定义但是配置文件里面大部分地方用的名称是mymaster,如果要自定义就把所有的名称改过来

192.168.65.128代表监控的主服务器,6379代表端口,

2代表有两个及以上的Sentinel认为master客观下线的时候,才会进行failover操作。

b03dbe1fc78046680a0a439058f4d8c6.png

其他Sentinel服务也是一样的配置,安装了redis之后一般情况下redis-sentinel服务也会存在,所以我们可以使用 service redis-sentinel status 查看状态 service redis-sentinel start 打开Sentinel 服务

cf7ecd5251db05be60c09d6829da303a.png

因为这个时候我们的 master 是 192.168.65.128 我们测试一下

四、Java程序测试

程序如果想要用哨兵模式就必须连接Sentinel,而不能直接连接Redis,下面先放一段测试代码,26379是Sentinel的默认端口

public classJedisTest {

public static voidmain(String[] args) {

//连接池配置JedisPoolConfig jedisPoolConfig = newJedisPoolConfig();

jedisPoolConfig.setMaxTotal(10);

jedisPoolConfig.setMaxIdle(5);

jedisPoolConfig.setMinIdle(5);

//哨兵信息Set sentinels = newHashSet(Arrays.asList(“192.168.65.128:26379”, “192.168.65.130:26379”, “192.168.65.129:26379”));

//创建连接池//mymaster是我们配置给哨兵的服务名称//连接redis服务器的密码JedisSentinelPool pool = newJedisSentinelPool(“mymaster”, sentinels, jedisPoolConfig, “”);

//获取客户端Jedis jedis = pool.getResource();

//执行获取命令System.out.println(jedis.get(“test”));

}

}

第一次的运行报错,提示我全部哨兵都没启动,其实我已经启动了,但是 redis-sentinel.conf 配置文件里的 protected-mode 配置项如果没配置成 no 的话还是会报错因为Redis 没有配置 bind ip ,所以这里我为了测试就把该配置改成 no

7a5afe67715c4b6494ba75b592c73459.png

4616a11789f9a4793fadf7a9fd8c1226.png

再次执行结果,通过哨兵已经可以访问到数据库了

cc12bfd5c2d3960c71f10ad2f1ecc5cd.png

然后为了验证一下哨兵的主从切换,我目前2个从库都是只有test与test2这两个key。我先把master停掉,然后再用java程序插入数据

ba0c4c1f77b6cb97ab1c527b7af5105d.png

停掉master

9f90dc9e0a33e24a180c85a0bd29b538.png

停掉master之后再执行上面的Java程序的结果,不过在 get 之前加多一个set的代码

//添加值jedis.set(“javatest”,”Hello World !!!”);

//执行获取命令System.out.println(jedis.get(“javatest”));

执行结果也验证了主从切换:

d4c30e7bc2c0a2023e2e116cb5343dc9.png

以上内容就是目前对Redis哨兵模式的学习内容!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210717.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:03
下一篇 2026年3月19日 上午7:03


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号