Redis 集群架构
Redis Cluster
1. 哨兵架构的局限性
在哨兵架构中,虽然我们可以利用哨兵在主服务器宕机时,快速、自动地选择一个新的主服务器,但是在选择的这段时间依然无法进行写操作。
同时,如果我们想使Redis
的存储能力达到1T
,那么主从架构是无法达到的。我所见过的计算机内存最大为 64G
,和 1T
相差甚远。
由此,便产生了Redis
的集群架构。
2. Redis 集群架构
Redis
的集群架构图如下:
Redis
的集群是Redis
提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。
优点
存储容量不受限制,可以进行横向扩容,新增Master
即可。
数据分片可理解为hash
的方式,被存储到不同的Master
中,如果其中一个Master
挂掉,那么有新的数据进行插入,并不意味着一定插入到挂掉的Master
中,倘若Master
的数量越多,那么数据插入挂掉的Master
的概率便越小。同时,Sentinel
会快速进行主服务器的重新选举,数据被丢失的概率极低。可见,可用性非常高,并且读写的吞吐量也很高。
3. 槽指派
Redis
集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot
),数据库中的每个键都属于这16384
个槽的其中一个(键并不存储在槽中,还是在 Redis
服务器中,通过槽可以确定其所属的节点,找到该节点后再节点的数据库中进行键值对操作,而槽的作用是进行分流),集群中的每个节点可以处理0
个或最多16384
个槽。
当数据库中的16384
个槽都有节点在处理时,集群处于上线状态(ok
);如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态( fail
)。
如果集群启动后,并没有分配槽位,所以并不能使用。
槽被指派好后,结构图如下所示:
4. 在集群中执行命令
当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:
- 如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令。
- 如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错
误,指引客户端转向( redirect )至正确的节点,并再次发送之前想要执行的命令。
4.1 计算键属于哪个槽
节点使用以下算法来计算给定键key
属于哪个槽:
def slot_number(key):
return CRC16(key) & 16383
其中CRC16(key)
语句用于计算键key
的CRC-16
·校验和,而& 16383
则用于计算出介于0-16383
的整数作为键key
的槽号。
上一篇: MySQL集群架构