分片规则从 id 取模 16 改成按 id 区间划分,上线后查 8 月以前的订单,接口返回空列表,而那些行在旧分片里还在。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,路由算法只对新增写入生效,历史数据没有按新规则重分布。查询时按新规则算出的目标片里没有这些行,旧片又不在路由表里,结果就是查不到。
「路由规则变更」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。改完顺手把文档补一句,省得下次自己重新推一遍。
SELECT * FROM route_config WHERE table_name = 't_order'; -- 确认 version=2 生效前 old_rule 仍然可读
监控和日志的时间要对上,时区不一致会多绕很大一圈。
具体做法是,上线前先做数据重分布 把老数据迁到新规则对应的片;迁移期间双读 新片没有就回旧片查 结果打标;路由表保留新旧两套映射 按时间字段决定走哪套;切换完成后下线旧映射 再清理旧片。
最后用这个标准收尾,任意日期的订单都能查到 新旧规则结果对比无差异。
