为什么会出现重新分片
出现下面情况后redis集群会重新进行分片:
- 有新的节点加入
- 有节点需要下线
- 某些节点数据分布不均匀需要重新调整
重新分片需要人工使用redis.trib工具,流程如下:
- 执行命令./redis-trib.rb reshard ip:port
执行了这个命令之后,控制台会显示集群里所有节点信息,包括ip,port,每个节点负责的slots,每个节点的master/slave角色,及每个节点的ID。类似:
$ ./redis-trib.rb reshard 127.0.0.1:7000
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7005: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 9991306f0e50640a5684f1958fd754b38fa034c9 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 393c6df5eb4b4cec323f0e4ca961c8b256e3460a 127.0.0.1:7002
slots:10922-16383 (5462 slots) master
S: 3375be2ccc321932e8853234ffa87ee9fde973ff 127.0.0.1:7005
slots: (0 slots) slave
M: e68e52cee0550f558b03b342f2f0354d2b8a083b 127.0.0.1:7001
slots:5461-10921 (5461 slots) master
S: 48b728dbcedff6bf056231eb44990b7d1c35c3e0 127.0.0.1:7003
slots: (0 slots) slave
S: 345ede084ac784a5c030a0387f8aaa9edfc59af3 127.0.0.1:7004
slots: (0 slots) slave
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000
同时还会询问我们需要迁移多少个slots,示例中我们迁移1000.
- 指定迁移的目标节点
这里我们需要输入的是目标节点的ID而非目标节点的ip+port
$ ./redis-trib.rb reshard 127.0.0.1:7000
...
What is the receiving node ID? 9991306f0e50640a5684f1958fd754b38fa034c9
我们选择了9991306f0e50640a5684f1958fd754b38fa034c9这个节点
- 指定迁移的源节点
也就是我们希望从哪些节点将1000个slots迁移到目标节点上去。如果我们不指定特定节点而是输入all,这样之前集群中的所有主节点都会成为源节点,redis-trib会从各个源节点各取出一部分slots凑够1000个,然后迁往目标节点:
$ ./redis-trib.rb reshard 127.0.0.1:7000
...
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all
输入all之后,redis-trib会列出哪些slot由哪些节点迁移出,要是没问题需要我们进行确认:
$ ./redis-trib.rb reshard 127.0.0.1:7000
...
Moving slot 11421 from 393c6df5eb4b4cec323f0e4ca961c8b256e3460a
Moving slot 11422 from 393c6df5eb4b4cec323f0e4ca961c8b256e3460a
Moving slot 5461 from e68e52cee0550f558b03b342f2f0354d2b8a083b
Moving slot 5469 from e68e52cee0550f558b03b342f2f0354d2b8a083b
...
Moving slot 5959 from e68e52cee0550f558b03b342f2f0354d2b8a083b
Do you want to proceed with the proposed reshard plan (yes/no)? yes
【redis重新分片】输入yes确认后,迁移工作正式进行。
迁移完成之后,redis-trib会向集群中所有节点发送
cluster setslotnode
命令,这样,集群中的所有节点会更新最新的slots与节点的对应关系。ASK错误及自动转向
在迁移过程中redis集群会继续响应用户请求,但如果涉及的key刚好属于正在迁移的slot时就会出现ask错误,当然这个ask错误不会返回给用户,集群会根据响应的ask信息里的ip,port进行自动转向。
![上传中...]()
总结:
- 节点出现变动后需要重新分片
- 重新分片使用redis-trib工具,指定迁移目标节点,需要迁移多少slots,迁移的源节点
- 迁移过程中也会处理用户请求