Redis cluster 扩容缩容重新分片

一、增加节点       

        Redis集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。扩容与缩容的本质是,对Redis的槽进行重新的分配。
  集群现有6379、6380、6381 三个主节点,因为数据压力,增加一个主节点6385,需要对之前槽方案进行重新分配,并进行数据迁移
在这里插入图片描述

 

二、重新分片流程

原命令:

  1. 制订槽分配计划,确保每个节点负责相似数量的槽,从而保证各节点的数据均匀。
  2. 对目标节点(增加的6385主键点)发送cluster setslot{slot}importing{sourceNodeId}命令,让目标节点准备导入槽的数据。
  3. 对源节点(集群扩容前存在的节点6379…)发送cluster setslot{slot}migrating{targetNodeId}命令,让源节点准备迁出槽的数据。
  4. 源节点循环执行cluster getkeysinslot{slot}{count}命令,获取count个属于槽{slot}的键。
  5. 在源节点上执行migrate{targetIp}{targetPort}""0{timeout}keys{keys…}命令,把获取的键通过流水线(pipeline)机制批量迁移到目标节点。
  6. 重复执行步骤3)和步骤4)直到槽下所有的键值数据迁移到目标节点。
  7. 向集群内所有主节点发送cluster setslot{slot}node{targetNodeId}命令,通知槽分配给目标节点。为了保证槽节点映射变更及时传播,需要遍历发送给所有主节点更新被迁移的槽指向新节点。

redis-trib相关命令:

redis-trib为Redis 集群管理工具,安装可参考:https://blog.csdn.net/womenyiqilalala/article/details/105125534

加入节点:
redis-trib.rb add-node new_host:new_port existing_host:existing_port --slave–master-id

重新分配槽:
redis-trib.rb reshard host:port --from --to --slots --yes --timeout --pipeline

  • host:port:必传参数,集群内任意节点地址,用来获取整个集群信息。
  • –from:制定源节点的id,如果有多个源节点,使用逗号分隔,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入。
  • –to:需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入。
  • –slots:需要迁移槽的总数量,在迁移过程中提示用户输入。
  • –yes:当打印出reshard执行计划时,是否需要用户输入yes确认后再执行reshard。
  • –timeout:控制每次migrate操作的超时时间,默认为60000毫秒。
  • –pipeline:控制每次批量迁移键的数量,默认为10

三、命令路由

 

在这里插入图片描述

 

请求重定向最重要的两个步骤是,计算槽和查找槽所在的节点

a计算槽

  • Redis首先需要计算键所对应的槽。根据键的有效部分使用CRC16函数计算出散列值,再 &16383获得0~16383之间的整数值作为槽号
  • 执行cluster keyslot {key}命令可以反key对应的槽。
  • 键内部使用大括号包含的内容又叫做hash_tag,它提供不同的键可以具备相同slot的功能。mget等命令优化批量调用时,键列表必须具有相同的slot,否则会报错,此时可以使用hash_tag,使键分配在统一个槽中,例如:获取店铺1、店铺2、店铺3的最近10名关注者 mget follows:{10}:shop1 follows:{10}:shop2   vfollows:{10}:shop3
  • 使用redis-cli命令时,可以加入-c参数支持自动重定向,简化手动发起重定向操作

b查找槽所在的节点
         集群内通过ping/pong消息交换每个节点都会知道所有节点的槽信息,这写信息会保存在每个节点的ClusterState对象中。

在这里插入图片描述  

       请求重定向会增加网络开销,可以考虑在应用方缓存一份集群节点与槽的对照关系表,在发生MOVE重定向消息时,更新节点对照表,最大限度的减少MOVE几率发生。

 

四、ASK重定向

       Redis集群支持在线迁移槽(slot)和数据来完成水平伸缩,当slot对应的数据从源节点到目标节点迁移过程中可能出现一部分数据在源节点,而另一部分在目标节点,客户端需要做到智能识别,保证键命令可正常执行。

槽在迁移中发生请求的流程:

  1. 客户端根据本地slots缓存发送命令到源节点(扩容前存在的节点),如果存在键对象则直接执行并返回结果给客户端。
  2. 如果键对象不存在,则可能存在于目标节点(扩容新增节点),这时源节点会回复ASK重定向异常。格式如下:(error)ASK{slot}{targetIP}:{targetPort}。
  3. 客户端从ASK重定向异常提取出目标节点信息,发送asking命令到目标节点打开客户端连接标识,再执行键命令。如果存在则执行,不存在则返回Null。

重定向流程:

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值