添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

redis cluster可以进行动态扩容,我们可以通过redis-trib.rb脚本add node到集群中,再通过reshard 或者move slot命令进行slot的重新分配或者迁移,本篇将讨论在slot迁移过程中的一些问题。

简单的通过一个例子:加入我们已经完成了add node操作,需要将编号为1,2,3的slot从master A迁移到master B

migrating状态

slot 1 ,2 , 3在master A迁出的时候会标记为migrating状态,如果客户端请求的key落在migrating状态的slot中时,分一下情况讨论。

1、如果key存在该slot上,则成功处理请求,返回给客户端

2、如果key不存在,返回客户端ask,这时候并不会改变客户端中node的映射关系,客户端的下次请求还会指向masterA

3、如果有多个命令操作该key,如果都存在则成功处理,如果都不存在,则返回客户端ASK,如果一部分存在,则返回客户端TRYAGAIN,通知客户端稍后重试,这样当所有的Key都迁移完毕的时候客户端重试请求的时候回得到ASK,然后经过一次重定向就可以获取这批键

importing状态

将slot 1 ,2 ,3迁入到masterB中的时候,状态会被标记为import,如果客户端请求的key落在importing状态的slot中的时候,分一下情况。

  1. 正常命令会被MOVED重定向,如果是ASKING命令则命令会被执行,从而Key没有在老的节点已经被迁移到新的节点的情况可以被顺利处理;

  2. 如果Key不存在则新建;

  3. 没有ASKING的请求和正常请求一样被MOVED,这保证客户端node映射关系出错的情况下不会发生写错;

键空间迁移

键空间迁移是指当满足了槽迁移前提的情况下,我们就可以通过相关命令将槽1、2、3中的键空间从MasterA节点转移到MasterB节点,这个过程真正实现数据转移。相关命令:

MIGRATE

  1. DUMP

  2. RESTORE

  3. DEL

经过上面三步可以将键空间数据迁移,然后再将处于MIGRATING和IMPORTING状态的槽变为常态即可,完成整个重新分片的过程。然而MIGRATE并不是原子的,如果在MIGRATE出现错误的情况可能会导致下面问题:

  • 键空间在两个节点都存在;

  • 键空间只存在第一个节点;

redis cluster 的hash算法简介: redis cluster 中的哈希算法是用来判断用户上传的一个key,value应该保存在哪一个节点之中(集群模式 redis 有多台主节点,每台主节点对应一台或多台备节点),下面先说一下 redis cluster 中哈希算法的规则: 之所以成为hash slot 算法是因为 redis cluster 中有固定的16384个hash slot ,这16384... 浏览器打开 Redis 在单机模式时,使用数据结构dict来实现数据库。 Redis 在集群模式时,也是使用数据结构dict来实现数据库,但是集群模式对于数据库有其他需求,包括数据的节点无关性、内部操作对客户端需要屏蔽、冗余备份等,并且在一定的情况,数据还需要在不同的节点间实现迁移。 在所有模式下, Redis 的节点数据的备份都是使用备份来实现的。这个暂时不深入。 Redis 引入的 slot 来解决如何实现集群模式下部 浏览器打开 jedis Cluster .sadd("PhiAd{materialType}qqqq","71","73"); jedis Cluster .sadd("PhiAd{materialType}ssss","72","73"); Set&lt;String&gt; set = jedis Cluster .sinter("PhiAd{materialType}qqqq&q 浏览器打开 原有 redis 添加节点172.31.176.126:7000。但是到了move slot ,敲完yes,就报了个错。请大神帮忙看下什么原因。 具体如下: Do you want to proceed with the proposed reshard plan (yes/no)? yes Moving slot 5461 from 172.31.176.80:7000 to 172.31.176.126:7000: /usr/local/ruby/lib/ruby/gems/2.3.0/gems/ redis -3.2.1/lib/ redis /client.rb:113:in `call': ERR I don't know about node 582b32872a81acadea73048963fddc1887922d4c ( Redis ::CommandError) from /usr/local/ruby/lib/ruby/gems/2.3.0/gems/ redis -3.2.1/lib/ redis .rb:2556:in `block in method_missing' from /usr/local/ruby/lib/ruby/gems/2.3.0/gems/ redis -3.2.1/lib/ redis .rb:37:in `block in synchronize' from /usr/local/ruby/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize' from /usr/local/ruby/lib/ruby/gems/2.3.0/gems/ redis -3.2.1/lib/ redis .rb:37:in `synchronize' from /usr/local/ruby/lib/ruby/gems/2.3.0/gems/ redis -3.2.1/lib/ redis .rb:2555:in `method_missing' from ./ redis -trib.rb:931:in `move_ slot ' from ./ redis -trib.rb:1258:in `block in reshard_ cluster _cmd' from ./ redis -trib.rb:1257:in `each' from ./ redis -trib.rb:1257:in `reshard_ cluster _cmd' from ./ redis -trib.rb:1701:in `<main>' 浏览器打开 如标题,我今天在建立集群的时候为节点分配槽,所有节点都是空的,我为6382节点分配0~5000的槽,但是却提示我 (error) ERR Invalid or out of range slot 我试过如下格式: cluster add slot s 0 1 2 3 4 ... 5000 cluster add slot s {0...5000} 都是提示我这个错误,请问有没有大神知道呢? 浏览器打开 集群信息一致性问题 主从和 slot 的一致性是由epoch来管理的. epoch就像Raft中的term, 但仅仅是像. 每个节点有一个自己独特的epoch和整个集群的epoch, 为简化下面都称为node epoch和 cluster epoch. node epoch一直 浏览器打开 2.将节点加入集群 1)通过 cluster meet 加入集群 127.0.0.1:6380&amp;amp;gt; cluster meet 192.168.0.207 6380 127.0.0.1:6380&amp;amp;gt; cluster meet 1... 浏览器打开 最近在做 redis 单机版本迁移到集群版,所以当时用的 redis 3.0版本吧,迁移的过程中遇到一个问题,就是如果 redis 5.0之前的版本,在移动槽点的时候,假如槽点内有值的话,导致报错:Syntax error ,try client(list|kill|getname|setname|pause|reply)  ,主要就是需要修改 redis -trib.rb文件的move_ slot ... 浏览器打开