SWE · OOD / Coding Design

Amazon DB Partition拆合:阈值、所有权与迁移状态

把“大就split、小就merge”变成可核对的键范围、状态机和并发切换合同。

题目重点:把“大就split、小就merge”变成可核对的键范围、状态机和并发切换合同。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 只给partition按size阈值split/merge,没有输入输出、range、统计更新或邻接规则。练习采用有序key-range分区,split按键分布点、merge仅相邻兼容分区;这些是需要澄清的合同。
  • 容量size是实际字节估计而非key数,不能从size数字推断一半key必占一半字节。拆合上下阈值L<U避免抖动;真实阈值未给。

解题路线

  1. Partition包含id、keyRange、owner、generation、estimatedBytes和state;Planner只提出split/merge计划,Executor负责迁移与最终owner切换,不把同步if语句当可用的在线系统。
  2. split需要实际cut key和子范围不重叠且并集等原范围;先复制snapshot,再追增量日志,确认新owner追平后原子更新routing generation并fence旧owner。不能以size/2创建没有边界的两块。
  3. merge先核邻接、兼容schema/tenant和预计总大小,合成范围同样进行复制/追平/切换。并发split与merge用计划版本CAS或分区状态互斥,旧请求不能对已替换分区重复执行。
  4. 读路由带generation,过期路由收到明确重定向而非默默写旧位置。拆合途中失败保持旧owner权威,半建新分区可重试清理;切换后旧副本按安全位点回收。
  5. 如果面试只要离线规划,可输出操作建议并验证范围不变量,不引入网络迁移实现。不要承诺无键分布数据时能均衡字节;单个巨key可能根本不可分。

手动走一遍

[a,z)为200MB,U150,取已知键分布cut m生成[a,m)、[m,z),但两侧可能20/180MB,不能说一定均分。a/m/z范围不重叠,generation10→11后旧owner拒绝新写;若新拷贝失败,10继续服务。

规模与取舍

离线对P已排序范围规划O(P)加选cut的统计成本;真实迁移字节B至少O(B)IO与网络。追平需增量消费速率超过到达率,否则无法完成;额外副本使迁移峰值存储增加。

易错点与追问

容易失分的边界

  • 只比较size并算size/2,没有key边界。
  • 任意小分区合并,跨非邻接范围制造空洞/重叠。
  • split与merge共用阈值导致频繁来回迁移。

继续深挖

  • 如果partition是hash而非range,cut和routing有什么不同?
  • 单个大value超过阈值如何分块或改变对象布局?
✓已复制微信号!