redis集群方案有三种:主从复制、哨兵模式、redis分片集群
主从集群,用于解决单节点redis并发能力上限的,一般就是读写分离。一般一主节点负责写数据,多从节点负责读取数据,主节点写入数据之后,需要将数据同步到从节点中
主从同步分为两个阶段,一个是全量同步,一个是增量同步
全量同步是指从节点第一次与主节点建立连接使用的就是全量同步,流程如下
从节点携带自己的repication id和offset偏移量请求主节点同步数据,主节点会根据是否与从节点是同一个replication id来判断从节点是否是第一次请求,如果replication id不是同一个,说明是第一次同步,主节点会把自己的replication id和offset发送给从节点,让从节点与主节点信息保持一致。
于此同时主节点会执行bgsave,生成rdb文件,发送给从节点去执行,从节点会先把自己的数据清空,然后执行主节点的rdb文件,这样就会保持主从一致了。如果在rdb生成期间,有请求到达了主节点,主节点会以命令的方式记录到缓冲区,缓冲区是日志文件AOF,最后将日志文件发送给从节点,这样主节点和从节点完全一致了,后期在同步数据就都依赖这个日志文件了。
所以增量同步指的是,从节点重启后,数据不一致,从节点请求主节点同步数据,主节点判断不是第一次请求后获取从节点的offset值,然后主节点从命令日志AOF中获取offset值之后的数据,发送从节点数据同步。
哨兵模式是用来解决redis高并发高可用问题的。哨兵模式可以实现主从集群的自动故障恢复,里面包含对主从服务的监控、自动故障恢复、通知等功能。主节点故障,哨兵Sentinel会从新从从节点中选取主节点,故障恢复后也是新的master为主节点。并且集群发生故障后,Sentinel会将最新信息推送给Redis客户端。
一般不会做分片集群,因为分片集群维护起来比较麻烦,集群之间的心跳检测和数据通信会消耗大量的网络宽带,也没法使用lua脚本和事务。所以项目中一般都是1主1从加哨兵模式。一般单节点不超过10G内存。redis内存不足可以给不同的微服务分配独立的redis主从节点。
redis主从加哨兵模式,非常少见的情况下会出现脑裂现象。比如说网络原因,redis的主节点从节点和哨兵处于不同的网络分区,哨兵没感知到主节点的心跳,重新选举主节点,这样就有两个主节点,这就是脑裂现象。这样导致客户端在旧主节点写数据,新节点无法同步数据。网络恢复后,旧的主节点降级为从几点,新的主节点同步数据到从节点,会导致大量的数据丢失。解决问题,可以在redis中设置,首先至少有一个从节点才能同步数据,然后设置主从数据复制和同步的延迟间,达不到请求就拒绝请求,避免数据丢失
redis分片集群解决的是海量存储问题,及群众有很多的主节点,每个主节点负责保存不同的数据,并且可以每个主节点分配多个从节点,增加集群的高并发能力。同时主节点间互相检测彼此的健康状态,客户端请求访问集群任意节点最终都会被发送到正确节点,原理主要是redis引入了哈希槽的概念。
redis集群中有16384个哈希槽,集群每个主节点都绑定了一定范围的哈希槽范围,每个key通过CRC16校验后对16384取模来决定放哪个哈希槽,通过哈希槽找到对应的节点进行存储,查询的时候也是同样的方式来定位。