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中的时候,分一下情况。
-
正常命令会被MOVED重定向,如果是ASKING命令则命令会被执行,从而Key没有在老的节点已经被迁移到新的节点的情况可以被顺利处理;
-
如果Key不存在则新建;
-
没有ASKING的请求和正常请求一样被MOVED,这保证客户端node映射关系出错的情况下不会发生写错;
键空间迁移
键空间迁移是指当满足了槽迁移前提的情况下,我们就可以通过相关命令将槽1、2、3中的键空间从MasterA节点转移到MasterB节点,这个过程真正实现数据转移。相关命令:
MIGRATE
-
DUMP
-
RESTORE
-
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<String> 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;gt;
cluster
meet 192.168.0.207 6380
127.0.0.1:6380&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
...
浏览器打开