个人名片:
🐼作者简介:一名大三在校生,喜欢AI编程🎋
🐻❄️个人主页🥇:落798.
🐼个人WeChat:hmmwx53
🕊️系列专栏:🖼️
- 零基础学Java——小白入门必备🔥
- 重识C语言——复习回顾🔥
- 计算机网络体系———深度详讲
- HCIP数通工程师-刷题与实战🔥🔥🔥
- 微信小程序开发——实战开发🔥
- HarmonyOS 4.0 应用开发实战——实战开发🔥🔥🔥
- Redis快速入门到精通——实战开发🔥🔥🔥
🐓每日一句:🍭我很忙,但我要忙的有意义!
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
文章目录
- 3.Redis哨兵
- 3.1.哨兵原理
- 3.1.1.集群结构和作用
- 3.1.2.集群监控原理
- 3.1.3.集群故障恢复原理
- 3.1.4.小结
- 3.2.搭建哨兵集群
- 3.3.RedisTemplate
- 3.3.1.导入Demo工程
- 3.3.2.引入依赖
- 3.3.3.配置Redis地址
- 3.3.4.配置读写分离
- 欢迎添加微信,加入我的核心小队,请备注来意
3.Redis哨兵
Redis提供了哨兵(Sentinel
)机制来实现主从集群的自动故障恢复。
哨兵是Redis的一种运行模式,它专注于对Redis实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个Redis系统的可用性。结合Redis的官方文档,可以知道Redis哨兵具备的能力有如下几个:
- 监控(Monitoring):持续监控Redis主节点、从节点是否处于预期的工作状态。
- 通知(Notification):哨兵可以把Redis实例的运行故障信息通过API通知监控系统或者其他应用程序。
- 自动故障恢复(Automatic failover):当主节点运行故障时,哨兵会启动自动故障恢复流程:某个从节点会升级为主节点,其他从节点会使用新的主节点进行主从复制,通知客户端使用新的主节点进行。
- 配置中心(Configuration provider):哨兵可以作为客户端服务发现的授权源,客户端连接到哨兵请求给定服务的Redis主节点地址。如果发生故障转移,哨兵会通知新的地址。这里要注意:哨兵并不是Redis代理,只是为客户端提供了Redis主从节点的地址信息。
哨兵模式是天然的分布式系统,它被设计为基于一套配置,并在多个哨兵实例的配合下工作。多实例共同协作有以下优势:
- 主节点的系统故障是在多个实例共同认可的情况下完成的,大大降低了误报的概率。
- 即使不是所有的哨兵实例都正常运行哨兵集群也能正常工作,这大大增加了系统的鲁棒性。
3.1.哨兵原理
3.1.1.集群结构和作用
哨兵的结构如图:
哨兵的作用如下:
- 监控:Sentinel 会不断检查您的master和slave是否按预期工作
- 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
- 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端
3.1.2.集群监控原理
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping
命令:
•主观下线:如果某sentinel
节点发现某实例未在规定时间响应,则认为该实例主观下线。
• 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。
3.1.3.集群故障恢复原理
一旦发现maste
r故障,sentinel
需要在salve
中选择一个作为新的master
,选择依据是这样的:
- 首先会判断
slave
节点与master
节点断开时间长短,如果超过指定值(down-after-milliseconds * 10
)则会排除该slave节点 - 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
- 如果
slave-prority
一样,则判断slave
节点的offset
值,越大说明数据越新,优先级越高 - 最后是判断
slave
节点的运行id
大小,越小优先级越高。
当选出一个新的master
后,该如何实现切换呢?
流程如下:
sentine
l给备选的slave1
节点发送slaveof no one
命令,让该节点成为master
sentinel
给所有其它slave
发送slaveof 192.168.150.101 7002
命令,让这些slave
成为新master
的从节点,开始从新的master
上同步数据。- 最后,
sentinel
将故障节点标记为slave
,当故障节点恢复后会自动成为新的master
的slave
节点
3.1.4.小结
Sentinel
的三个作用是什么?
- 监控
- 故障转移
- 通知
Sentinel
如何判断一个redis实例是否健康?
- 每隔1秒发送一次ping命令,如果超过一定时间没有相向则认为是主观下线
- 如果大多数sentinel都认为实例主观下线,则判定服务下线
故障转移步骤有哪些?
- 首先选定一个
slave
作为新的master,执行slaveof no one
- 然后让所有节点都执行
slaveof
新master
- 修改故障节点配置,添加
slaveof
新master
3.2.搭建哨兵集群
具体搭建流程参考【Redis快速入门】Redis三种集群搭建配置(主从集群、哨兵集群、分片集群)
3.3.RedisTemplate
在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。
下面,我们通过一个测试来实现RedisTemplate集成哨兵机制。
3.3.1.导入Demo工程
首先,我们引入课前资料提供的Demo工程:
wx获取
3.3.2.引入依赖
在项目的pom
文件中引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.3.3.配置Redis地址
然后在配置文件application.yml
中指定redis的sentinel
相关信息:
spring:
redis:
sentinel:
master: mymaster
nodes:
- 192.168.150.101:27001
- 192.168.150.101:27002
- 192.168.150.101:27003
3.3.4.配置读写分离
在项目的启动类中,添加一个新的bean:
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
这个bean中配置的就是读写策略,包括四种:
MASTER
:从主节点读取MASTER_PREFERRED
:优先从master节点读取,master不可用才读取replicaREPLICA
:从slave(replica)节点读取REPLICA _PREFERRED
:优先从slave(replica)节点读取,所有的slave都不可用才读取master
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
欢迎添加微信,加入我的核心小队,请备注来意
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇