首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Redis Cluster 分区实现原理(2)

Redis Cluster 分区实现原理(2)

重新分片(Resharding) 重新分片意为槽到集群节点的映射关系要改变,不变的是键到槽的映射关系,因此当重新分片的时候,如果槽中有键,那么键也是要被移动到新的节点的。下面看看重新分片是怎么做的,假如我们有一批槽需要从一个Master节点移动到另一个Master节点:

[url=][/url]
这里简化模型,假设这批待迁移的槽编号为1、2、3,并假设左边的节点为MasterA节点,右边的节点为MasterB节点。
槽迁移的过程槽迁移的过程中有一个不稳定状态,这个不稳定状态会有一些规则,这些规则定义客户端的行为,从而使得Redis Cluster不必宕机的情况下可以执行槽的迁移。下面这张图描述了我们迁移编号为1、2、3的槽的过程中,他们在MasterA节点和Master节点中的状态。
MIGRATING状态 本例中MIGRATING状态是发生在MasterA节点中的一种槽的状态,预备迁移槽的时候槽的状态首先会变为MIGRATING状态,这种状态的槽会实际产生什么影响呢?当客户端请求的某个Key所属的槽处于MIGRATING状态的时候,影响有下面几条:
  • 如果Key存在则成功处理
  • 如果Key不存在,则返回客户端ASK,仅当这次请求会转向另一个节点,并不会刷新客户端中node的映射关系,也就是说下次该客户端请求该Key的时候,还会选择MasterA节点
  • 如果Key包含多个命令,如果都存在则成功处理,如果都不存在,则返回客户端ASK,如果一部分存在,则返回客户端TRYAGAIN,通知客户端稍后重试,这样当所有的Key都迁移完毕的时候客户端重试请求的时候回得到ASK,然后经过一次重定向就可以获取这批键
IMPORTING状态本例中的IMPORTING状态是发生在MasterB节点中的一种槽的状态,预备将槽从MasterA节点迁移到MasterB节点的时候,槽的状态会首先变为IMPORTING。IMPORTING状态的槽对客户端的行为有下面一些影响:
  • 正常命令会被MOVED重定向,如果是ASKING命令则命令会被执行,从而Key没有在老的节点已经被迁移到新的节点的情况可以被顺利处理;
  • 如果Key不存在则新建;
  • 没有ASKING的请求和正常请求一样被MOVED,这保证客户端node映射关系出错的情况下不会发生写错;
键空间迁移键空间迁移是指当满足了槽迁移前提的情况下,我们就可以通过相关命令将槽1、2、3中的键空间从MasterA节点转移到MasterB节点,这个过程真正实现数据转移。相关命令:
MIGRATE
  • DUMP
  • RESTORE
  • DEL
MIGRATE命令通过三步将数据转移,示意图如下:

[url=][/url]
经过上面三步可以将键空间数据迁移,然后再将处于MIGRATING和IMPORTING状态的槽变为常态即可,完成整个重新分片的过程。然而MIGRATE并不是原子的,如果在MIGRATE出现错误的情况可能会导致下面问题:
  • 键空间在两个节点都存在;
  • 键空间只存在第一个节点;
总结 本文介绍Redis Cluster分区实现原理主要关注三个问题,1)数据是如何被自动分散到不同的节点的;2)客户端是如何能够正确找到节点的;3)键空间迁移过程是怎么样的?其次是一些实现小细节,通过了解这些问题更好地了这些问题从而更好地认识Redis Cluster分区功能。
返回列表