欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis 集群架构

程序员文章站 2022-07-15 10:09:56
...

1. 哨兵架构的局限性

       在哨兵架构中,虽然我们可以利用哨兵在主服务器宕机时,快速、自动地选择一个新的主服务器,但是在选择的这段时间依然无法进行写操作。

       同时,如果我们想使Redis的存储能力达到1T,那么主从架构是无法达到的。我所见过的计算机内存最大为 64G,和 1T相差甚远。

       由此,便产生了Redis的集群架构。

2. Redis 集群架构

       Redis的集群架构图如下:

Redis 集群架构

       Redis的集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。

       优点

       存储容量不受限制,可以进行横向扩容,新增Master即可。

       数据分片可理解为hash的方式,被存储到不同的Master中,如果其中一个Master挂掉,那么有新的数据进行插入,并不意味着一定插入到挂掉的Master中,倘若Master的数量越多,那么数据插入挂掉的Master的概率便越小。同时,Sentinel会快速进行主服务器的重新选举,数据被丢失的概率极低。可见,可用性非常高,并且读写的吞吐量也很高。

3. 槽指派

       Redis 集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个(键并不存储在槽中,还是在 Redis服务器中,通过槽可以确定其所属的节点,找到该节点后再节点的数据库中进行键值对操作,而槽的作用是进行分流),集群中的每个节点可以处理0个或最多16384个槽。

       当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态( fail )。

       如果集群启动后,并没有分配槽位,所以并不能使用。

Redis 集群架构
       槽被指派好后,结构图如下所示:

Redis 集群架构

4. 在集群中执行命令

       当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:

  • 如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令。
  • 如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错
    误,指引客户端转向( redirect )至正确的节点,并再次发送之前想要执行的命令。

Redis 集群架构

4.1 计算键属于哪个槽

       节点使用以下算法来计算给定键key属于哪个槽:

def slot_number(key):
	return CRC16(key) & 16383

       其中CRC16(key)语句用于计算键keyCRC-16·校验和,而& 16383则用于计算出介于0-16383的整数作为键key的槽号。