首页 /  技术专区  /  Redis 宽屏模式 >

Redis集群方案(主从复制、哨兵模式、分片集群)

主从复制

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

Image.png

主从数据同步原理

主从全量同步:

Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid

offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

Image.png


主从增量同步(slave重启或后期数据变化)

Image.png


哨兵的作用

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:

监控:Sentinel 会不断检查您的master和slave是否按预期工作

自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主 

通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

Image.png

服务状态监控

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

    主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。 

    客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

Image.png

哨兵选主规则

    首先判断主与从节点断开时间长短,如超过指定值就排该从节点

    然后判断从节点的slave-priority值,越小优先级越高 

    如果slave-prority一样,则判断slave节点的offset值,越大优先级越高 

    最后是判断slave节点的运行id大小,越小优先级越高。


redis集群(哨兵模式)脑裂

正常情况下:

Image.png


哨兵检测不到主节点,提升从节点为主节点:

Image.png

哨兵检测到老的主节点,将之前的主节点强制降级为从节点

Image.png

集群脑裂是由于主节点和从节点和sentinel处于不同的网络分区,使得sentinel没有能够心跳感知到主节点,所以通过选举的方式提升了一个从节点为主,这样就存在了两个master,就像大脑分裂了一样,这样会导致客户端还在老的主节点那里写入数据,新节点无法同步数据,当网络恢复后,sentinel会将老的主节点降为从节点,这时再从新master同步数据,就会导致数据丢失

解决:我们可以修改redis的配置,可以设置最少的从节点数量以及缩短主从数据同步的延迟时间,达不到要求就拒绝请求,就可以避免大量的数据丢失  


分片集群结构

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

    海量数据存储问题 

    高并发写的问题 

Image.png

使用分片集群可以解决上述问题,分片集群特征: 

    集群中有多个master,每个master保存不同数据 

    每个master都可以有多个slave节点 

    master之间通过ping监测彼此健康状态 

    客户端请求可以访问集群任意节点,最终都会被转发到正确节点


分片集群结构-数据读写

Redis 分片集群引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

Image.png


头像
0/200
图片验证码