Redis主从集群
Redis主从集群 一主多从;读写分离,主节点负责读写操作,从节点负责读操作
单节点Redis的并发能力有限,进一步提高Redis的并发能力,可搭建主从集群进行读写分离;主节点负责写操作(也可以读),从节点负责写操作
Redis主从数据同步: 一阶段: 全量同步 二阶段: 发送RDB文件 三阶段: 发送命令日志文件
第一阶段: 首先通过检查两节点id是否一致,判断是否是第一次建立连接,若是第一次 连接,主节点将自己的数据版本信息(id与offset)返回给从节点
第二阶段: 建立连接后主节点执行bgsave命令异步生成RDB文件,生成完毕后将RDB文件发送给从节点,从节点清空本地数据加载接收到的RDB文件;与此同时RDB生成过程中执行的新数据更新命令保存到缓冲区
第三阶段: 主节点将缓冲区中保存的命令发送到子节点,由子节点执行命令。
增量同步:若主从节点之间的连接由于网络故障导致连接断开,再次连接时就会进行增量同步,依据offset截取未同步的命令,缓冲区是环形的,若写满会覆盖掉原有的数据,当再次连接时若从节点还未同步的命令被新的数据覆盖(依据两者的offset判断),则有数据无法通过增量同步的方式同步,需要重新进行全量同步.
Redis哨兵
Redis哨兵 监控 自动故障恢复 通知
Redis客户端访问redis时,通过Sentinel告知客户端redis的主从地址,当监听到集 群发生故障时,会选举一个子节点升级为从节点,并将最新的主节点地址告知客户端
心跳机制: Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping 命令;若某个哨兵节点发现某实例未在规定时间内响应则认为该实例主观下线,若 超过指定数量的哨兵都认为该实例主观下线,则该实例客观下线。
master选举机制:核心,offset越大说明同步到的数据越多,优先级越高
一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:
首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-miliseconds*10)则会排除该slave节点,然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举,如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高。
最后是判断slave节点的运行id大小,越小优先级越高。
Redis分片集群
多个master,每个master保存不同的数据,master之间通过ping检测彼此的健康状态;主从与哨兵解决了高可用与高并发读的问题,但每个节点始终存储相同的数据,而每台redis节点的存储容量有限;分片集群同时具有主从哨兵的优点,又解决了海量数据存储的问题;同时具有高可用,高并发,海量数据存储的优点.
Redis分片集群具体如何进行数据存储?
哈希槽: Redis分片集群采用哈希槽方案来处理数据和节点直接的映射关系,将所有master节点映射到0~16383共16384个插槽上,数据不再与节点绑定而是与插槽绑定;利用CRC16算法对key进行运算得到一个hash值,然后对16384取余得到的结果就是其对应的插槽
脑裂问题
什么是脑裂: 在Redis一主多从的主从架构中,因为某些原因主节点的网络出现问题, 与所有从节点以及哨兵失去连接,但唯独与客户端的连接保持正常,仍然在处理客户端的请求,由于失联主节点是无法与从节点进行数据同步的;一段时间后哨兵也 发现主节点出现了异常,会在从节点中重新选举一个主节点,并将原主节点降级。 一段时间后网络恢复正常,原主节点与新主节点建立连接,由于是第一次建立新的 连接关系,那么原主节点会清空自己的本地数据与新主节点进行全量同步,至此断 连期间的所有新数据都丢失了.
解决方案: 手动进行参数配置,当从节点连接数过少、或主从复制延迟过高,禁止主节点进行写数据的操作,将错误返回给客户端;即牺牲可用性,换取数据一致性拓 展:CAP理论