redis节点失效,迁移的数据的访问会有影响吗?

关于redis的16384个槽,还有里面的数据,到底是怎么一回事。

根据之前文章搭建的redis集群,我们来看下数据迁移,也就是“槽迁移”到底是怎么一回事?

 

 

 1 我们首先将name = "Hx" 放到内存中,看下到底是放在哪个槽里面了

我们先连接到7001,存入name时,根据crc64(key) 计算得到,这个name需要放到 7002的第5798个槽中存储

 

 

 2 所以,槽中存在的是实实在在的key-value数据, 假如7002进程宕了,是否还能拿到name的数据? 或者,如果新产生节点,将这个5798这个槽迁移到了新节点,也是否能拿到数据?

  1 先看槽迁移

    我们将5461-5800这几个槽,迁移到7001节点上,看下,这个槽不在7002时候,还是否能命中。

 

 

  从下面这个图可以看到5798这个槽,已经在7001这个节点里面了

 

 

 我们直接吧7002节点杀掉,再查询

 

 

 立即拿是拿不到的,其实可以看到,这个7002节点挂掉后,其从节点,还没有切换过来。

 

 

 等一段时间后,再查就能查到了(且主从切换也成功了)

 

 

   如果7004也挂掉了,是否还能拿到name的值? 答案是拿不到

 

 

那 name 这个key到底是在7001还是7002呢?

先到7004中,找一下所有存储在该节点的key, 结果是empty,也就是说这个name-"Hx" 这个键值对,不在7004中,而且,get name的时候,也是让我去7001拿

 

 

在7001节点中找到

 

 

 到此,总结一下

  1 首先key被计算到7002的5798个槽中

  2 我将前5800个槽,迁移到7001中,然后查询key,能拿到key的value

  3 为了确定是在7001中直接拿到的还是,7002将请求抛到7001,让7001返回,我将7002节点kill掉了。此时,这个节点的主从切换还未完成,请求失败。拿不到name的value值,由此可见,数据虽然不在7002这个槽,但是请求还是需要7002来处理。

  4 7002的从节点7004,经过主从切换,顶替了主节点,这个时候,再次查询name, 是可以查到的,因为次数查询name的请求,还是会抛给7001来执行。

  5 kill掉7004,那5801-10922这段槽无法使用,需要节点7002或者7004的请求,都无法完成,所以name的值显然是拿不到的。

  由此可见,节点的增删,不会改变crc(key)的变化,即便槽在不同的节点,但是请求服务的时候,拿到crc64(key) % 16384来请求服务的。即需要通过7002节点去7001拿数据,而不是直接请求7001。

 

所以,redis集群节点失效的时候,不会导致数据的丢失是什么意思,下回解答!

posted @ 2022-04-09 17:06  脚比路长  阅读(188)  评论(0)    收藏  举报