- 目录:
- 一、单机Redis的问题
-
- 二、Redis哨兵机制
1、认识Redis哨兵机制
2、主观下线和客观下线
3、新master选举
4、故障转移步骤
5、搭建哨兵集群
6、RedisTemplate的哨兵模式
一、单机Redis的问题
1、数据丢失问题
实现Redis数据持久化;
2、并发能力问题
搭建主从集群,实现读写分离;
3、故障恢复问题
利用哨兵机制,实现健康检测和自动恢复;
4、存储能力问题
搭建分片集群,利用插槽机制实现动态扩容。
二、Redis哨兵机制
1、认识Redis哨兵机制
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。
-
①
健康监控(Monitoring)
:Sentinel 会不断检查您的master和slave是否按预期工作; -
②
自动故障恢复(Automatic failover)
:如果master故障,Sentinel会将一个slave提升为master; -
③
通知(Notification)
:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。
2、主观下线和客观下线
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
-
①
主观下线(Subjectively Down, 简称 SDOWN)
:指的是单个 Sentinel 实例对服务器做出的下线判断; -
②
客观下线(Objectively Down, 简称 ODOWN)
:指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)
如果一个服务器没有在 master-down-after-milliseconds
选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。
3、新master选举
一般没有特殊配置的话,我们仅需关注第③点,如下:
- ① 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点;
- ② 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举;
-
③ 如果slave-prority一样,则判断slave节点的
offset值
,越大说明数据越新,优先级越高; - ④ 最后是判断slave节点的运行id大小,越小优先级越高。
4、故障转移步骤
-
① 首先选定一个slave作为新的master,执行
slaveof no one
; -
② 然后让所有节点都执行
slaveof 新master
; -
③ 修改故障节点,执行
slaveof 新master
。
5、搭建哨兵集群
- ① 准备实例和配置
- ② 编写sentinel.conf文件
在s1\s2\s3中编写配置文件,先编写一个,后面批量复制:
批量复制:
修改s2、s3端口号:
- ③ 启动哨兵实例
- ④ 测试
shutdown 7001节点:
查看7003的日志:MASTER MODE enabled
查看7002的日志:会进行主从同步
6、RedisTemplate的哨兵模式
在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。
- ① 添加依赖
- ② application.yaml
- ③ 编写配置类
ReadFrom是配置Redis的读取策略:
Ⅰ MASTER
:从主节点读取;
Ⅱ MASTER_PREFERRED
:优先从master节点读取,master不可用才读取replica;
Ⅲ REPLICA
:从slave(replica)节点读取;
Ⅳ REPLICA _PREFERRED
:优先从slave(replica)节点读取,所有的slave都不可用才读取master。
- ④ Controller类
- ⑤ 测试
三、结尾
以上即为Redis-分布式缓存(二)的部分内容