后端重定向(半夜扩容Redis?先看懂重分片原理再操作!)

后端重定向(半夜扩容Redis?先看懂重分片原理再操作!)
半夜扩容Redis?先看懂重分片原理再操作!

面试题简述

面试官在问Redis集群执行 reshard 命令时,内部具体的槽位和数据迁移过程。

面试官想听的

面试官想确认你不仅知道有这个命令,更清楚其背后严谨的、保证数据一致性的迁移机制,以及潜在的运维风险。

后端重定向(半夜扩容Redis?先看懂重分片原理再操作!)

关键点结构化分析

触发与规划:通过 redis-cli --cluster reshard 命令触发,需指定迁移的槽位总数和目标节点ID。

迁移单元:以槽(Slot)为原子单位进行迁移,每次迁移一个槽内的所有键。

原子迁移流程:对单个槽的执行包含 SETSLOT... IMPORTING 、 SETSLOT... MIGRATING 、键迁移、槽位设置更新等步骤。

协同与阻塞:迁移过程中,对该槽的写入请求可能会被源节点阻塞,以保证一致性。

更新与清理:迁移完成后,更新集群节点配置,并异步清理源节点数据。

面试加分点

能说清楚 IMPORTING 和 MIGRATING 状态的具体含义与作用。

解释迁移过程中针对已存在键和新写入请求的不同处理逻辑。

提到批量迁移( pipeline )对性能的优化,以及网络闪断等异常情况的处理思路。

结合运维经验,强调监控迁移速度和 key-lag 指标的重要性。

面试回答示例

reshard 过程,说白了就是给集群数据做一次外科手术,把一部分槽位从老节点切给新节点。我用它的时候,感觉最需要小心的是它的原子性。

具体来说,当你执行 reshard 命令并回答了那几个问题(比如移多少槽、给谁)之后,集群就开始逐个槽迁移了。每个槽的迁移都是一个原子操作:首先,目标节点会被标记为 IMPORTING 状态,准备接收数据;源节点被标记为 MIGRATING 状态,准备发送数据。然后,源节点会用 DUMP 序列化这个槽里的每一个键,通过pipeline批量传给目标节点,目标节点用 RESTORE 反序列化存好。

在这个过程中,如果客户端请求一个正在迁移的键,就有意思了:如果这个键还在源节点,那就正常处理;如果已经迁走了,源节点会返回一个 ASK 重定向错误,引导客户端去目标节点找。为了保证一致性,在迁移一个键的短暂瞬间,对这个键的写入请求会被阻塞。

等一个槽的所有键都迁完了,集群元数据会被更新,这个槽就正式划归目标节点管理了。之前被阻塞的请求也会被处理。全部槽迁移完成后,我们还得等一会儿,让集群通过Gossip协议把新配置完全同步开。

实际干这活的时候,我们一定会开另一个窗口,用 cluster nodes 命令盯着各个节点的槽位分布变化,并且监控网络和延迟,生怕迁移到一半出啥幺蛾子。这过程看似自动,但运维的心可是一直提着呢。

#面试求职 #后端开发

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读