Redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:Redis 槽和对应数据在不同节点之间移动
(1) 准备节点 9007,并加入集群
192.168.11.40:9001> cluster meet 192.168.11.40 9007
【注意】若 cluster meet 加入已存在于其它集群的节点,会导致集群合并,造成数据错乱!。建议使用 redis-cli 的 add-node:

cluster setslot {slot} importing {sourceNodeId}cluster setslot {slot} migrating {targetNodeId}cluster getkeysinslot {slot} {count}migrate {targetIp} {targetPort} "" 0 {timeout} keys {keys...},把键通过流水线(pipeline)机制批量迁移到目标节点。Redis3.0.6 后才支持批量迁移cluster setslot {slot} node {targetNodeId}内部伪代码:

执行 reshard 三次,将数据平均分布到其他三个节点
60s 内对所有节点执行如下操作:(不建议)
# 执行后,会将该节点加入禁用列表(持续 60s),不再向其发送 Gossip 消息
cluster forget {nodeId}
建议使用 redis-cli 的 del-node 忘记节点:
/usr/local/redis/bin/redis-cli –cluster del-node {host:port} {nodeId}
内部伪代码
def delnode_cluster_cmd(downNode):
# 下线节点不允许包含slots
if downNode.slots.length != 0
exit 1
end
# 向集群内节点发送cluster forget
for n in nodes:
if n.id == downNode.id:
# 不能对自己做forget操作
continue;
# 如果下线节点有从节点则把从节点指向其他主节点
if n.replicate && n.replicate.nodeId == downNode.id :
# 指向拥有最少从节点的主节点
master = get_master_with_least_replicas();
n.cluster(“replicate”,master.nodeId);
#发送忘记节点命令
n.cluster(‘forget’,downNode.id)
# 节点关闭
downNode.shutdown();
若主从节点都要下线,先下线从,避免全量复制
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!