本文仅仅只是针对 Redis 的 cluster 进群 做简单的介绍(仅仅是基于理论知识),在并没有对其涉及到的深层次概念做深入的探讨。 Redis 3.0 版本之后支持的cluster,下图就是Redis cluster 进群拓扑图

redis 集群分库 redis集群架构图_redis 集群分库

    Redis cluster 是一个分布式、容错的Redis 的实现,Redis 集群是 Redis 提供分布式数据库方案,可以在多个Redis 节点之间进行数据共享的程序集,并提供复制、故障转移功能。Redis Cluster 中不存在所谓的中心节点或者代理节点,每个节点都有保存数据和整个集群的状态,也就是说每个节点都会保存其他节点的信息,并且定时会给其他节点发送心跳,能够及时感知集群中的节点。

    Redis Cluster 不支持那些需要同时处理多个键的Redis 命令,因为执行这些命令的时候,需要在多个节点中间进行数据同步,而且在高负载的情况下,会对降低 Redis 的性能,严重的可能会导致不可预测的错误。

    客户端不需要连接Redis cluster 中的所有节点,只要连接到cluster 中的任何一个可用节点即可,这就意味着:只要cluster 中有一个可用节点就可以正常使用。

集群的数据结构

    Redis cluster 中节点负责存储数据,记录集群状态,cluster 能自动发现其他节点,检测出节点的状态,并在必要的时候剔除故障节点,提升新的节点。

    Redis cluster 所有节点彼此互联(PING-PONG 机制),而且节点fail 是通过Cluster 中超过半数的节点检测失效时才会生效,从而Redis 根据自动故障机制,将从节点提升为主节点,这时Redis cluster恢复可用。

    clusteNode结构保存了一个当前节点状态,比如节点的创建时间、节点的名称等、节点当前的配置纪元、节点的IP地址和端口号!Redis cluster 通过分片来保存数据库的键值对,集群的整个数据库被分成了16384个slot,数据库中的每个键都属于这16384个slot的其中一个,每个节点都可以处理0或者最多16384个slot。当数据库中的16384个slot都有节点在处理时,Redis cluster 处于上线状态,而如果任何一个slot 没有得到处理,则说明集群处于下线状态。

Redis cluster 中的节点之间使用异步复制

集群的数据共享

    Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现。

    Redis 提供多个节点实例间的数据共享,也就是Redis A、B、C、D 彼此之间的数据是同步的,同样彼此之间也是可以通信,而对于客户端操作的key 是有Redis 系统自行分配到各个节点中。见图1。

redis 集群分库 redis集群架构图_Redis_02

当Redis cluster 中的一个节点故障,根据Redis cluster复制机制(Master-Slave),将从其余可用节点中选择一个作为主节点继续保持工作,如图2 所示。一旦节点A故障了,那么其从节点A1、A2就可以接管并继续提供与A同样的服务,当然如果节点A、A1、A2节点都出现问题, 那么这个集群就不会继续工作了。

redis 集群分库 redis集群架构图_redis 集群分库_03

 

redis 集群分库 redis集群架构图_Redis_04