Redis 集群

编程

  1. 提高系统的可用性,单点故障是任何系统的灾难。
  2. 提高系统的高性能,单台计算机的处理能力肯定是有限的。

Redis 集群是如何实现的呢?我比较吃惊的是,集群中提供服务的都是 Master 节点,每个节点都负责一部分槽位。在整个集群中,数据是根据槽位来存储的,总共有16384个槽位。

客户端操作一个 Key,如何定位它要写到哪个槽位上呢?其实也是一个哈希处理算法:

CRC16(Key) & 16384

对比我们经常使用的HASH、一致性HASHRedis集群引入了槽位。HASH算法都是直接通过元素来计算,应该跟哪一个节点来进行交互。但Redis集群在两者之间又引入了槽位。

元素Key -> Hash计算槽位 -> 确定集群中的节点

问题来了,对于诸如 MSET 这种命令,它会同时设置多个Key,集群如何处理这种情况呢?集群引入了 HASH Tag 来辅助我们:通过只计算HASH Tah中的部分来计算槽位:

// 只计算{}中的部分来确定槽位

{comment:repost}note

{comment:repost}user

如果没有特殊处理,客户端的请求肯定不知道具体应该跟哪一个Redis节点打交道。比如存在两个节点,且它们负责的槽位如下:

node_a 0-8000

node_b 8001-16383

如果Key被请求到node_a节点上,通过计算槽位,发现node_a无法处理这个请求,计算的槽位是由node_b负责的。这时node_a会给客户端返回一个MOVE响应,客户端拿到MOVE的参数,重新去发起请求。而且,整个过程是没有报错的。

以上是 Redis 集群 的全部内容, 来源链接: utcz.com/z/515044.html

回到顶部