帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】深入浅析Redis 集群伸缩原理

发表时间:2025-09-24 16:09:00 小编:主机乐-Yutio
  • 1. 迁移槽
  • 2. 忘记节点
  • Redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:Redis 槽和对应数据在不同节点之间移动

    环境:CentOS7 搭建 Redis 集群

    一、集群扩容

    1. 手动扩容

    (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}
    • 获取 count 个属于槽 slot 的键:源节点执行cluster getkeysinslot {slot} {count}
    • 迁移键:源节点执行migrate {targetIp} {targetPort} "" 0 {timeout} keys {keys...},把键通过流水线(pipeline)机制批量迁移到目标节点。Redis3.0.6 后才支持批量迁移
    • 重复上两步,直到槽下所有的键值数据迁移到目标节点
    • 向集群所有主节点通知槽被分配给目标节点:集群内所有主节点执行cluster setslot {slot} node {targetNodeId}

    内部伪代码:

    1. 迁移槽

    执行 reshard 三次,将数据平均分布到其他三个节点

    2. 忘记节点

    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();

    若主从节点都要下线,先下线从,避免全量复制

    本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!


    联系我们
    返回顶部