Redis有三种集群模式:主从模式、哨兵模式和集群模式。
1. 主从模式
所有的写请求都被发送到主数据库上,再由主数据库将数据同步到从数据库上。主数据库主要用于执行写操作和数据同步,从数据库主要用于执行读操作缓解系统的读压力。Redis的主从模式如下图所示:
实现原理请参考《Redis主从复制的原理》
2. 哨兵模式
在主从模式上添加了一个哨兵的角色来监控集群的运行状态。哨兵通过发送命令让Redis服务器返回其运行状态。哨兵是一个独立运行的进程,在监测到Master宕机时会自动将Slave切换成Master,然后通过发布与订阅模式通知其他从服务器修改配置文件,完成主备热切。Redis的哨兵模式如图所示:
3. 集群模式
Redis集群实现了在多个Redis节点之间进行数据分片和数据复制。基于Redis集群的数据自动分片能力,我们能够方便地对Redis集群进行横向扩展,以提高Redis集群的吞吐量。基于Redis集群的数据复制能力,在集群中的一部分节点失效或无法进行通信时,Redis仍然可以基于副本数据对外提供服务,这提高了集群的可用性。Redis的集群模式如下图所示:
Redis集群遵循如下原则:
1)所有Redis节点彼此都通过PING-PONG机制互联,内部使用二进制协议优化传输速度和带宽。
2)在集群中超过半数的节点检测到某个节点Fail后将该节点设置为Fail状态。
3)客户端与Redis节点直连,客户端连接集群中任何一个可用节点即可对集群进行操作。
4)Redis-Cluster把所有的物理节点都映射到0~16383的slot(槽)上,Cluster负责维护每个节点上数据槽的分配。Redis的具体数据分配策略为:在Redis集群中内置了16384个散列槽;需要在Redis集群中放置一个Key-Value时,Redis会先对Key使用CRC16算法算出一个结果,然后把结果对16384求余数,这样每个Key都会对应一个编号0~16383的散列槽;Redis会根据节点的数量大致均等地将散列槽映射到不同的节点。