Key分配模型
Redis Cluster共划分为16384个槽位 。这也意味着一个集群最多可以有16384个master,不过官方建议master的最大数量是1000个 。
如果Cluster不处于重新配置过程,那么就会达到一种稳定状态 。在稳定状态下,一个槽位只由一个master提供服务,不过一个master节点会有一个或多个slave,这些slave可以提供缓解master的读请求的压力 。
【深度原理学习–Redis集群】Redis Cluster会对key使用CRC16算法进行hash,然后对16384取模来确定key所属的槽位(hash tag会打破这种规则) 。
Keys hash tags
标签是破坏上述计算规则的实现,Hash tag是一种保证多个键被分配到同一个槽位的方法 。
hash tag的计算规则是:取一对大括号{}之间的字符进行计算,如果key存在多对大括号,那么就取第一个左括号和第一个右括号之间的字符 。如果大括号之前没有字符,则会对整个字符串进行计算 。
说了这个多,可能你还是一头雾水 。别急,我们来吃几个栗子 。
- {Jackeyzhe}.following和{Jackeyzhe}.follower这两个key都是计算Jackey的hash值
- foo{{bar}}这个key就会对{bar进行hash计算
- follow{}{Jackey}会对整个字符串进行计算
前面聊性能的时候我们提到过,Redis Cluster为了提高性能,不会提供代理,而是使用重定向的方式让client连接到正确的节点 。下面我们来详细说明一下Redis Cluster是如何进行重定向的 。
MOVED重定向
Redis客户端可以向集群的任意一个节点发送查询请求,节点接收到请求后会对其进行解析,如果是操作单个key的命令或者是包含多个在相同槽位key的命令,那么该节点就会去查找这个key是属于哪个槽位的 。
如果key所属的槽位由该节点提供服务,那么就直接返回结果 。否则就会返回一个MOVED错误:
1GET x
2-MOVED 3999 127.0.0.1:6381
这个错误包括了对应的key属于哪个槽位(3999)以及该槽位所在的节点的IP地址和端口号 。client收到这个错误信息后,就将这些信息存储起来以便可以更准确的找到正确的节点 。
当客户端收到MOVED错误后,可以使用CLUSTER NODES或CLUSTER SLOTS命令来更新整个集群的信息,因为当重定向发生时,很少会是单个槽位的变更,一般都会是多个槽位一起更新 。因此,在收到MOVED错误时,客户端应该尽早更新集群的分布信息 。当集群达到稳定状态时,客户端保存的槽位和节点的对应信息都是正确的,cluster的性能也会达到非常高效的状态 。
除了MOVED重定向之外,一个完整的集群还应该支持ASK重定向 。
ASK重定向
对于Redis Cluster来讲,MOVED重定向意味着请求的slot永远由另一个node提供服务,而ASK重定向仅代表下一个请求需要发送到指定的节点 。在Redis Cluster迁移的时候会用到ASK重定向,那Redis Cluster迁移的过程究竟是怎样的呢?
Redis Cluster的迁移是以槽位单位的,迁移过程总共分3步(类似于把大象装进冰箱),我们来举个栗子,看一下一个槽位从节点A迁移到节点B需要经过哪些步骤:
- 首先打开冰箱门,也就是从A节点获得槽位所有的key列表,再挨个key进行迁移,在这之前,A节点的该槽位被设置为migrating状态,B节点被设置为importing的槽位(都是用CLUSTER SETSLOT命令) 。
- 第二步,就是要把大象装进去了,对于每个key来说,就是在A节点用dump命令对其进行序列化,再通过客户端在B节点执行restore命令,反序列化到B节点 。
- 第三步呢,就需要把冰箱门关上,也就是把对应的key从A节点删除 。
容错
了解了Redis Cluster的重定向操作之后,我们再来聊一聊Redis Cluster的容错机制,Redis Cluster和大多数集群一样,是通过心跳来判断一个节点是否存活的 。
推荐阅读
- “减速玻璃”这个忽悠我们几十年的黑科技,原理是啥?一次讲明白
- 170男生如何穿搭,穿搭显高秘籍都在这里了,快来学习吧
- redis分布式锁 Redlock原理分析
- 初识Redis
- 自旋锁的自旋是什么意思,底层原理又是什么?
- 断点续传原理
- 春季耳鼻喉疾病会影响儿童学习 做好饮食保健很重要
- linux性能工具perf工作原理简析
- PHP底层运行机制与原理
- 瘦大腿、瘦小腿 经络学习之胆经
