Redis Cluster 中的slot槽位迁移

本文详细介绍如何在Redis集群中从一个节点迁移槽位至另一个节点的过程,包括获取槽位信息、执行迁移命令、确认迁移状态等关键步骤,为Redis集群维护人员提供实用操作指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.0、目标

从from节点迁移槽位slot到to节点上。

0.1、获取key所在槽位

如果我们是针对big key的迁移。

cluster keyslot <key>

1、在目标节点上执行

cluster setslot <slot> importing <from-nodeid>

2、在源头节点上执行

cluster setslot <slot> migrating <to-nodeid>

3.0、获取槽位上的key

获取分片上的数据:

cluster getkeysinslot <slot> 500

500是获取的key的个数。

3.1、迁移源头节点上的数据

然后进行针对key的迁移。

migrate <to-ip> <to-port> "" <db0> <timeout> keys <key1> <key2>

举例如下:

migrate 127.0.0.1 6379 "" 0 5000 keys nihao name age

4.0、源头节点上的槽位确认

cluster setslot <slot> node <to-nodeid>

4.1、源头节点上的槽位确认

cluster setslot <slot> node <to-nodeid>

4.2、其他节点会自动进行槽位确认

### 验证 Redis Cluster 所有 Slot 的分布与正常工作状态 为了验证 Redis Cluster 中所有的分布以及其正常工作的状态,可以按照以下方法操作: #### 1. 使用 `CLUSTER SLOTS` 命令查看分配情况 通过执行 `CLUSTER SLOTS` 命令,可以获得当前集群中每个的具体分配信息。该命令返回的结果是一个数组列表,其中每一项代表一个范围及其对应的主节点和从节点地址。 ```bash redis-cli -c -h 127.0.0.1 -p 6379 CLUSTER SLOTS ``` 此命令可以帮助确认所有的 16384 个是否都被正确分配到各个节点上[^2]。 --- #### 2. 使用 `CLUSTER INFO` 查看集群的整体状态 运行 `CLUSTER INFO` 可以获取关于整个 Redis Cluster 的基本信息,其中包括集群的状态(cluster_state),它会显示为 `ok` 或者 `fail`。只有当所有都成功分配给某个节点时,集群才会进入上线状态(state=ok)。 ```bash redis-cli -c -h 127.0.0.1 -p 6379 CLUSTER INFO ``` 如果输出中的 `cluster_state` 显示为 `ok`,则说明所有都已经分配完毕并正在被处理。 --- #### 3. 利用 `redis-trib.rb check` 工具检测一致性 可以通过官方工具 `redis-trib.rb` 来进一步检查集群配置的一致性和覆盖情况。以下是具体命令: ```bash ./redis-trib.rb check 127.0.0.1:6380 ``` 上述脚本会对指定 IP 和端口下的 Redis 节点发起一系列查询请求,最终报告是否存在未分配或者重复分配的情况。如果一切正常,则会有 `[OK] All nodes agree about slots configuration.` 提示,并且还会告知是否有任何开放或遗漏的[^1]。 --- #### 4. 测试数据迁移过程中的重新平衡 假如之前进行了某些手动调整(比如迁移动态负载较高的键值对至其他分片),那么应该再次调用 `rebalance` 功能来确保各成员间资源占用比例接近理想水平。例如: ```bash ./redis-trib.rb rebalance 127.0.0.1:6380 ``` 如果没有必要再做额外改动的话,终端将会打印类似于下面这样的消息:“*** No rebalancing needed!” 表明目前状况良好无需干预。 --- #### 5. 实际写入读取测试 最后一步也是最直观的方式就是实际向不同分区存储一些样本记录然后再尝试检索它们。假设我们已经知道哪些 key 属于哪个特定区间内的 hash tag ,就可以分别连接不同的物理机器去存取关联的数据片段。 例如,在客户端程序里随机生成若干条带标签的消息体发送出去保存起来;稍后再逐一提取出来核验内容一致与否即可完成这项任务。 ```python import redis r = redis.StrictRedis(host='127.0.0.1', port=6379, decode_responses=True) for i in range(100): r.set(f'key:{i}', f'value-{i}') print(r.get('key:5')) # 应该能够顺利取出 value-5 ``` 以上代码展示了如何利用 Python 客户端库批量插入多组键值对并对其中一个进行抽样检验的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值