题目重点:解释读一致性分级、quorum、区域故障与版本回滚,明确跨区延迟无法被缓存抹掉。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 来源Phone 1明确global-scale metadata、strict consistency for writes、low latency reads,并追问partition/region outage/rollback。原数据量、schema、事务范围及读一致性未给。
- 训练写入为每key线性一致CAS/版本更新;跨key事务不是自动承诺。读取提供strict与允许明确陈旧的local两种合同,若业务要求所有读线性一致,需删去local shortcut。
- 示例5副本跨三region按2/2/1放置是教学方案,不冒充AWS内部架构;实际延迟/RTO/RPO须测量。
解题路线
- 先问metadata控制什么:访问策略、路由还是展示字段?安全敏感路由/权限可能不可容忍旧值,展示字段可允许有界陈旧。strict writes不能自动推读一定linearizable,也不能自动许可读任意缓存;用业务不变量确认API。
- 每个key映射到shard共识组,leader按序复制,达到quorum再ack;请求ID幂等与expectedVersion CAS防重试重复和丢更新。读写必须拿到已提交版本,不把leader只写本地log就ack叫强一致。
- 严格读可经leader/ReadIndex等确认权威提交位置;本地replica在知道已应用到所需commit后才满足相应read合同。允许陈旧的读返回版本/asOf并与freshness预算比较,超过预算回源或明确降级,不声称毫秒缓存满足最新读。
- 跨区域partition时无法同时给任意孤岛强一致写和写可用。quorum一侧可继续,少数侧拒绝/转发,旧leader通过term/fencing防双写;网络不通时权限敏感读按合同fail closed,允许陈旧读清楚标记。
- 5副本2/2/1在失去任一2副本region后还剩3,理论可凑quorum;但仍需网络连通、容量与正确选举,不能把“剩3”当RTO保证。跨区quorum写至少受必要跨区通信约束,shard leader贴近主要写地区只是减部分路径。
- 错误metadata回滚应作为新的版本/补偿写,保留审计和expectedVersion;不能截断已经对外ack的共识历史。region恢复先追赶snapshot/log并核schema/版本,新旧缓存利用版本键防旧值复活。
- 公开共识机制参考:https://raft.github.io/index.html。实际TTL/failover阈值不编造;验收注入丢ack重试、旧leader恢复、读落后和错配置回滚,核单调版本与不变量。
手动走一遍
v7→v8写在quorum提交后ack;用户随后到另一region读,local缓存只有v7。若读允许陈旧,可返回v7及版本;若用户带minimumVersion=8,必须等待已应用v8/转权威读/超时,不可静默返回v7。回滚v8内容到旧配置创建v9,而不是让版本重新变7。
规模与取舍
存储按key数量/版本历史/副本与索引增长;读热点缓存可分担但强读仍需协议保证,写热点单key串行约束不能靠加shard解决。延迟预算拆客户端→leader、共识、apply及返回,QPS测量依拓扑/批量/磁盘。
易错点与追问
容易失分的边界
- strict write自动等于全部读最新。
- cache命中省跨区就称线性一致。
- 少数partition继续接受写。
- 回滚已提交log历史。
- 副本数量足够等于故障恢复时间确定。
继续深挖
- 跨key事务怎样实现且代价是什么?
- minimumVersion读怎么阻止会话倒退?
- leader位置如何随写地域变化?
- 旧leader如何fence外部副作用?
技术参考
- Raft 原论文与作者资源:公开概念/机制参考,本文容量与故障案例自拟;不代表原面试系统。
