SpringCloud-高级篇(十二)

2024-01-07 18:18:08

?

在主从集群中slave节点发生了宕机,不用担心,只要它重启就能从master节点上完成数据的同步,恢复数据,如果宕机的不是slave而是master,是不是master重启就可以呢?如果你做了master节点的数据持久化,如果你重启,数据也不会丢失,但是在master宕机这一段时间,重启数据恢复分过程当中,用户是无法执行写操作的,因为master挂了,整个集群的可用性就下降了,不能做写,只能做读了,这是我们不想看到的,我们要的是整个集群是一直可用的。

我们可以这样做要监控节点的状态,当master宕机后,重新选一个slave节点当做master,这只是一瞬间的事,这个时候整个集群一直是健康的,可以去做读操作,写操作,宕机后的原来主节点,让他当从节点就可以了

(1)Redis哨兵作用和原理

(2)搭建哨兵集群

?

发现他们已经监控主节点7001?

我们测试让7001停止,宕机

从节点会发生变化:报错连接不上

Sentinel会监控做一个选举

每个Sentinel:都会监控主观下线sdowp

到第三个Sentinel监控的时候,已经超多两个:就会标记odown可观下线

Sentinel集群谁最先发现可观下线,会被选为主节点,进行故障恢复进行选举从节点为主节点

可以看到7002选举为了主节点,并执行了命令 不从属任何节点,写入7001配置文件更改从属关系,发送命令7003更改从属关系

7002此时也称为了主节点:

7003也会接收到命名执行:成为7002的从节点,从新做一次全量同步

7001重新启动看7002的日志:发现7001发现在做数据同步

(3)RedisTemplate的哨兵模式

哨兵有一个通知功能,哨兵会对集群做故障转移,master宕机,会做主从节点的切换,主从地址发生了变更,Redis客户端必须知道这些的变化,需要有哨兵通知Redis的客户端发生了故障切换,客户端可以向哨兵获取最新的地址信息

这里配置的不是Redis集群的地址,而是Sentinel的地址,因为在Sentinel的模式下,主从的地址是有可能变更的,不能够把它写死,而是Redis客户端不需要知道Redis集群的具体地址,只需要知道Sentinel的地址就可以了,将来基于Sentinel来做服务的地址发现

mymaste是Sentinel配置文件中maser节点的名称

?通过这些地址java客户端能够通过这些地址找到Sentinel从而得知Redis集群地址

可以在任何的配置类做这个配置,我们可以在启动类做这个配置

上面的匿名内部类,如果一个接口只有一个方法可以用lambda表达式来代替的

启动项目:

执行读操作

主节点信息?:前面我们发生了主节点故障的切换

从节点信息?

建立连接:

上面的Get请求交给7003来查询:

执行写操作:

故障切换我们把7002节点弄宕机:

Sentinel发生选举:切换7001再次为主节点

7001位主节点?

7002让他恢复:从属7001

java客户端会重新尝试连接集群:

得到matser是7001

主从切换自动完成:

从新执行get

找的从节点7002?

Set

找主节点7001

?主从自动切换,读写分离,由客户端自动实现了

文章来源:https://blog.csdn.net/dengfengling999/article/details/135437337
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。