Redis 集群
- 提高系统的可用性,单点故障是任何系统的灾难。
- 提高系统的高性能,单台计算机的处理能力肯定是有限的。
Redis
集群是如何实现的呢?我比较吃惊的是,集群中提供服务的都是 Master
节点,每个节点都负责一部分槽位。在整个集群中,数据是根据槽位来存储的,总共有16384个槽位。
客户端操作一个 Key
,如何定位它要写到哪个槽位上呢?其实也是一个哈希处理算法:
CRC16(Key) & 16384
对比我们经常使用的HASH
、一致性HASH
,Redis
集群引入了槽位。HASH
算法都是直接通过元素来计算,应该跟哪一个节点来进行交互。但Redis
集群在两者之间又引入了槽位。
元素Key -> Hash计算槽位 -> 确定集群中的节点
问题来了,对于诸如 MSET
这种命令,它会同时设置多个Key
,集群如何处理这种情况呢?集群引入了 HASH Tag
来辅助我们:通过只计算HASH Tah
中的部分来计算槽位:
// 只计算{}中的部分来确定槽位{comment:repost}note
{comment:repost}user
如果没有特殊处理,客户端的请求肯定不知道具体应该跟哪一个Redis
节点打交道。比如存在两个节点,且它们负责的槽位如下:
node_a 0-8000node_b 8001-16383
如果Key
被请求到node_a
节点上,通过计算槽位,发现node_a
无法处理这个请求,计算的槽位是由node_b
负责的。这时node_a
会给客户端返回一个MOVE
响应,客户端拿到MOVE
的参数,重新去发起请求。而且,整个过程是没有报错的。
以上是 Redis 集群 的全部内容, 来源链接: utcz.com/z/515044.html