Redis哨兵集群模式全方位解读
作者:小霞在敲代码
Redis哨兵集群模式
Redis提供了哨兵机制,来实现主从复制自动故障恢复。
当Redis主节点宕机后,Sentinel会在从节点中选择一个从节点成为主节点,并通知给Redis客户端,这样Redis客户端就知道下次进行操作的时候,就知道该给那个节点操作了。
Sentinel基于心跳机制监测服务状态,每隔1秒向集群中的每一个实例发送ping命令
主观下线
如果某个Sentinel节点发现某实例未在规定时间内响应,那么就会认为是主观下线(就是某Sentinel一个节点认为下线,但是其他Sentinel还没有认为下线)。
客观下线
若超过指定数量(quorum)的Sentinel都认为该实例主观下线,则该实例客观下线,quorum值最好超过Sentinel实例数量的一半。
哨兵模式的选主规则:
- 首先判断主与从节点断开时间的长短,如超过指定的值那么久排该从节点。
- 然后判断从节点的slave-priority值,越小优先级越高。
- 如果slave-priority值一样,那么就判断offset值,值越大的优先级越高。
- 最后是判断slave节点的运行id大小,越小优先级越高。
哨兵模式(脑裂),脑裂就是当主节点和Sentinel因为网络原因,不在同一个网络了,那么Sentinel就会去从节点中选出一个主节点出来,但是Redis客户端依旧能访问到老的主节点 。
当网络恢复后,老的主节点和新的主节点又在同一个网络了,这时候Sentinel就会强制将老的主节点,改变为从节点,那么这个从节点会把自己的数据清空去新的主节点中同步数据,在之前脑裂的过程中,客户端写的数据就丢失了。
解决方案
在Redis中有两个配置参数,如果不满足这两个要求,那么就会拒绝客户端的请求,这样就不会导致大量的数据丢失了。
springboot中如何实现主从哨兵集群呢?
当配置好redis配置文件的内容后,并启动了主节点从节点哨兵后,在我们的application.yml配置文件中就可以进行配置了,不需要写redis的主节点的ip,因为哨兵会自己去找到主节点。
注意:节点之间可以用逗号进行分割哦。(我这里是一主2从,那么我的哨兵就应该是3个哨兵。)
这样就可以实现简单的主从哨兵机制啦,可以测试一下,当主节点的redis宕机后,那么哨兵就会根据指定的规则在从节点中选一个新的主节点出来,如果原来那个主节点恢复回来了就会被哨兵强制变为从节点。
怎么保证Redis的高可用呢?
哨兵模式,实现主从集群的自动故障恢复。监控每一个实例是否健康,自动故障恢复,某一个主节点宕机后,那么哨兵机制通过选主的规则,来选择某一个从节点来成为主节点,通知客户端去连接哪一个Redis。
你们使用的Redis是单点还是集群,哪种集群?
集群,主从集群(1主1从)+哨兵。单节点不超过10G内存,如果Redis内存不足则可以给不同服务分配独立的Redis主从节点。
Redis中不建议存储海量的数据,Redis中一般用来存储一些热点数据。
Redis的集群脑裂,如何解决呢?
Redis的集群脑裂主要是因为,主节点和从节点以及Sentinel因为网络原因不在同一个网络,那么哨兵就会在从节点中选出一个新的主节点,但是客户端依旧能访问到老的节点,当网络恢复后,老的主节点会被强制变为从节点并清理所有数据去同步新的主节点,这样就导致了脑裂期间,大量数据的丢失。
解决方案的话 可以去redis的配置文件中修改两个配置 一个是设置主节点最少拥有的从节点以及缩短主从数据同步的延迟时间,达不到要求就拒绝请求,这样就可以避免大量的数据丢失。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。