面试知识

1.5.7 分库分表与扩容迁移

13-MySQL与分库分表 面试知识整理。

1.5.7 分库分表与扩容迁移

你完成本册后,能把“单库为什么不够、怎样选分片键、跨库能力损失了什么、如何不停机扩容”讲成一条可验证的工程证据链;案例统一落到 WMS(仓储管理系统)库存、订单履约和支付资金一致性。

1. 先给结论:分片解决边界,不解决所有问题

flowchart LR
    A[单库指标逼近边界] --> B{先定位瓶颈}
    B -->|表/索引过大| C[垂直拆分]
    B -->|写入或容量持续增长| D[水平分片]
    B -->|少数租户或仓库过热| E[热点隔离]
    C --> F[路由、约束与迁移设计]
    D --> F
    E --> F

1.1 为什么分库分表:容量、吞吐和热点是三条独立边界

分库分表不是“表大了就拆”的口号,而是把一个单点的容量、写入吞吐和热点竞争边界拆开。容量边界表现为数据、二级索引、历史归档和备份恢复时间持续增长;吞吐边界表现为 CPU(中央处理器)、磁盘 I/O(输入输出)、日志刷盘、复制延迟或连接数长期接近阈值;热点边界表现为少数仓库、商家、商品或支付渠道把同一行、同一分区或同一实例打热。只读副本只能分担读,缓存只能削减可缓存读,二者都不能让同一热点库存扣减并行化。

先定义业务服务目标:例如订单履约库单实例安全容量 8 亿行、日增 1 200 万行、峰值写入 8 000 TPS(每秒事务数)、主从延迟告警为 3 秒;再以 6 至 12 个月预测判断是否要演进。WMS(仓储管理系统)的库存可用量更新通常是强一致热写,支付账务是不可丢失、不可重复的资金事实,均不能仅靠“多加机器”回答。分片的价值是把独立键空间放到不同资源池,但同一分片内仍有锁、索引、日志和故障域。

边界先看证据可采用的手段不应误判为
容量行数、索引大小、备份时长、恢复目标归档、垂直拆分、水平分片单纯慢 SQL(结构化查询语言)
吞吐TPS(每秒事务数)、刷盘、复制延迟、连接池优化写路径、分片、削峰只加读副本
热点Top N(前 N)键、锁等待、分片倾斜热点隔离、键重设计、队列合并平均负载问题
可用性故障半径、切换时间、恢复演练高可用、备份、隔离分片天然高可用

数据演绎 1:是否已经跨过单库容量边界

订单主表当前 3.2 亿行,数据与索引合计 1.9 TiB(太字节),日增 900 万行、约 52 GiB(吉字节);按 70% 安全水位,目标实例可承载 3 TiB(太字节),剩余 1.1 TiB(太字节),理论窗口约为 1 126 / 52 = 21.7 天。即使磁盘还能扩,也要把全量备份、恢复校验、二级索引重建和副本追赶纳入窗口。结论不是“明天立刻拆”,而是本周冻结分片键和迁移方案,先清理可归档历史数据;若归档后净增长仍超过 35 GiB(吉字节)/天,则按四分片目标实施。这里容量告警来自未来窗口,而不是某次磁盘报警。

热门面试题

  1. 问题(基础题):什么情况下应该考虑分库分表?

    • 考点:容量、吞吐、热点和可用性的区分。
    • 回答思路:先给可量化边界,再说明替代手段和分片代价。
    • 详细答案:当单库在可预见增长期内无法满足容量、写入吞吐、热点隔离或恢复目标,而且索引、查询、归档、缓存、读写分离已不能以可接受风险解决时,才进入分片设计。要用行数、磁盘、日志、锁等待、复制延迟和恢复演练证明,不以“数据多”作为唯一理由。分片会增加路由、跨库查询、迁移和运维复杂度,因此必须有持续收益。
    • 进阶追问:读库延迟高能直接分库吗?
    • 进阶回答:先判断是慢查询、复制延迟、缓存穿透还是连接池耗尽;读写分离、索引和缓存常能先解决。只有读量与数据容量都需要独立扩展,才评估分片。
  2. 问题(原理题):为什么平均 TPS(每秒事务数)正常仍可能需要分片?

    • 考点:峰值与键倾斜。
    • 回答思路:从平均值掩盖热点、锁和尾延迟解释。
    • 详细答案:平均 TPS(每秒事务数)不能表达少数热键的串行化。WMS(仓储管理系统)大促时,一个仓库商品的库存行会形成行锁队列,即使整个实例 CPU(中央处理器)只有 40%,该商品的 P99(百分之九十九分位)也可能超时。分片能隔离不同仓库或商家,但若分片键没有打散热键,热点仍在一个库内,所以还需条件更新、库存分桶或队列合并。
    • 进阶追问:把库存随机分到多个库就行吗?
    • 进阶回答:不行;扣减、冻结和释放需要可定位且可核对的库存事实。随机写会让单次扣减跨库,反而扩大一致性成本。
  3. 问题(项目题):你怎样向面试官解释订单履约库拆分的业务收益?

    • 考点:从指标到业务结果的表达。
    • 回答思路:按“瓶颈证据—拆分边界—验证指标—剩余风险”回答。
    • 详细答案:我会说明订单主表增长使备份恢复窗口逼近目标,且头部商家的履约写入拉高同实例日志与锁等待。我们先将低频发票、附件和检索字段垂直外移,再按商家或订单归属做水平路由,使故障和扩容影响局限在少量分片。上线后同时观察分片倾斜、订单创建成功率、P99(百分之九十九分位)、复制延迟和对账差异;支付资金事实不随订单表随意拆迁,仍保留独立账务边界和日终对账。
    • 进阶追问:收益只看响应时间吗?
    • 进阶回答:不只看响应时间;还要看恢复时间、扩容是否可在线完成、故障半径、运维值班复杂度和资金差错率。

1.2 为什么先垂直后水平:先消除耦合,再扩大键空间

垂直拆分按领域职责切开表或库,例如把订单核心状态、履约轨迹、附件检索、商家配置、支付账务分成不同边界;水平分片则把同一逻辑表按分片键拆成多份。通常先垂直后水平,因为前者先让读写模型、生命周期、容量和一致性边界可见,避免把本来不该放在一起的数据一起复制到每个分片。订单表若同时承载下单状态、长文本、轨迹、营销标签和对账字段,先按职责拆开,往往就能显著缩小热表与索引。

不能机械地说“永远先垂直”。如果单一订单核心表已因日增和写吞吐达到硬边界,且领域拆分不能降低核心写入,就应并行完成水平方案。但水平分片前至少要明确哪些表随订单同分片、哪些是全局配置、哪些应独立服务,否则跨库 join(连接)会从设计问题变成日常查询问题。

拆分方式切分依据先解决什么常见风险WMS(仓储管理系统)示例
垂直拆分领域、访问频率、生命周期宽表耦合与资源互扰跨服务调用增多库存、商品、履约轨迹分开
垂直分库强一致边界与权限故障和变更隔离分布式事务增多支付账务独立
水平分表同类记录的分片键单表索引与容量路由和跨表聚合订单按商家拆表
水平分库分片键空间与资源池单实例写吞吐跨库语义丢失订单按商家路由到库

数据演绎 2:垂直拆分为何能推迟水平分片

订单宽表 1.9 TiB(太字节)中,履约轨迹与附件索引占 1.05 TiB(太字节),查询却只占 6%;营销扩展字段占 0.32 TiB(太字节),写入时还维护 5 个二级索引。先把轨迹、附件和营销扩展移到独立表后,核心订单表降到 0.53 TiB(太字节),每次状态更新维护的索引从 8 个降到 3 个,写放大明显下降。若核心订单日增仍为 450 万行,则以 4 个水平分片承接;如果不先垂直拆,4 个分片会各自携带几乎不访问的大字段和索引,迁移时间、成本和回滚复杂度都放大。

热门面试题

  1. 问题(基础题):垂直拆分和水平分片分别解决什么问题?

    • 考点:拆分维度与收益边界。
    • 回答思路:用领域职责对比键空间,并说明两者可组合。
    • 详细答案:垂直拆分按业务职责、访问模型和生命周期隔离数据,主要解决宽表、资源互扰和权限耦合;水平分片按可路由的业务键把同类数据分散,主要解决单表和单实例的容量与写吞吐。二者不互斥:订单核心表可先从轨迹、附件中垂直分离,再按商家或订单归属水平分片。
    • 进阶追问:垂直拆分后一定没有跨库事务吗?
    • 进阶回答:不一定。支付和订单状态若仍要同事务提交,就产生跨边界一致性需求;更好的做法通常是重新定义事实边界,用本地事务、事件和对账闭环。
  2. 问题(原理题):为什么水平分片会放大设计缺陷?

    • 考点:本地约束变全局约束。
    • 回答思路:说明没有分片键的访问、唯一性和关联会变贵。
    • 详细答案:单库里任意条件都能扫描、join(连接)、排序和加唯一索引;分片后,缺少分片键的请求必须广播到多库,再在应用或中间件合并。原本的全局唯一约束、外键和事务边界也不能自然成立。因此水平分片前必须盘点访问路径和不变量,而不是把原表复制 N 份。
    • 进阶追问:可以只按日期分表吗?
    • 进阶回答:只有主要访问、归档和冷热生命周期都按时间时才合适。按订单号或商家查询会广播,且当天大促仍会形成单表热点。
  3. 问题(项目题):订单履约为什么不和支付账务按同一规则分片?

    • 考点:领域一致性边界。
    • 回答思路:区分订单处理吞吐和资金事实正确性。
    • 详细答案:订单履约适合以订单归属或商家作为路由,使下单、拣货、出库等高频访问尽量同片;支付账务以支付单、渠道流水和会计期间为核心,必须支持幂等入账、可追溯和对账。强行同规则分片会让支付受订单扩容和热点影响,也会诱导跨库同步提交。我们保留支付本地账务事务,向订单发布已确认事件,并以支付流水和订单号做可重放对账。
    • 进阶追问:订单显示已支付但履约未创建怎么办?
    • 进阶回答:支付事实不能回滚;以可靠事件、幂等消费和补偿任务创建履约,告警并进入对账队列,而不是直接改订单状态掩盖缺口。

1.3 分片键选择:让大多数写入、查询和关联在同一分片完成

分片键应同时满足四个条件:高频写入能定位、常用查询能携带、数据分布相对均衡、未来扩容可迁移。候选键不能只看基数;高基数的订单号若查询常按商家、仓库或用户发起,仍会导致广播。反过来,商家键容易让订单、履约、售后同片,但头部商家会形成倾斜,需预留“商家 + 虚拟分片”或热点商家独立映射。

WMS(仓储管理系统)库存的分片键可优先是 warehouse_id(仓库标识) + sku_id(库存单元标识) 的归属规则,但库存扣减必须保证同一库存事实稳定落在一个分片;订单可按 merchant_id(商家标识) 或订单归属路由;支付不应因订单号哈希就丢失渠道流水唯一性。分片键一旦作为数据位置真相,就不能轻易改;可扩容的设计通常先引入虚拟桶,再映射到物理库表。

候选键优点主要缺陷适用判断
order_id(订单标识) 哈希均衡、点查直接商家列表和履约关联易广播订单号是主访问入口
merchant_id(商家标识)订单链路易同片头部商家热点多数请求带商家
warehouse_id(仓库标识)库存和出库同片大仓热点仓内事务占主导
user_id(用户标识)用户订单列表自然运营按商家查询昂贵消费者业务为主
时间归档和冷热简单当前分区易热、其他查询广播时间范围是主入口

数据演绎 3:用虚拟桶识别并处理头部商家

设 1 024 个虚拟桶、16 个物理分片,普通商家按 hash(merchant_id) mod 1024 落桶,再由桶映射到物理分片。总写入 16 000 TPS(每秒事务数),平均每片应为 1 000 TPS(每秒事务数),但商家 M100 独占 2 400 TPS(每秒事务数),其所在分片达到 3 100 TPS(每秒事务数),其他 15 片平均仅 860 TPS(每秒事务数)。不能直接把所有桶重哈希;应把 M100 的若干虚拟桶或专属映射迁到新分片,并让路由元数据按版本生效。迁后新分片 2 400 TPS(每秒事务数),原片回落到 700 TPS(每秒事务数),同时仍要检查单商品库存热键,因为商家拆走不等于库存锁冲突消失。

热门面试题

  1. 问题(基础题):选分片键最重要的原则是什么?

    • 考点:共定位与访问路径。
    • 回答思路:先说高频业务能路由,再补均衡和演进。
    • 详细答案:最重要的是让高频写入、点查和强关联数据在同一分片完成,避免日常广播和跨库事务;随后才是均衡、基数和扩容弹性。设计时要从真实接口参数、SQL(结构化查询语言)日志和关联链路反推,而不是只看字段唯一性。对 WMS(仓储管理系统)库存,仓库与库存单元的归属比随机订单号更能保证扣减定位。
    • 进阶追问:分片键能用自增主键吗?
    • 进阶回答:可以用于范围归档或预分段,但连续自增会形成写入尾部热点;若用哈希打散,又失去范围定位。要先确定主访问模式。
  2. 问题(原理题):为什么虚拟分片比直接按库数量取模更利于扩容?

    • 考点:重映射影响面。
    • 回答思路:对比物理取模全量变更与桶迁移。
    • 详细答案:直接 hash(key) mod 16 扩成 32 时,大量键的余数变化,需要近似全量迁移;虚拟分片先把键映射到固定桶,再将桶映射到物理节点,扩容只迁移一部分桶,路由变化和校验范围可控。桶数应远大于物理节点数,但也不能过多到让元数据和运维复杂度失控。
    • 进阶追问:虚拟桶能解决所有热点吗?
    • 进阶回答:不能。一个不可拆分的热键仍只在一个桶内;需要业务层分桶、排队合并或单独热点架构。
  3. 问题(项目题):库存防超卖的分片键怎样与一致性设计配合?

    • 考点:路由稳定性和条件更新。
    • 回答思路:先保证库存事实定位,再说明原子扣减、流水与对账。
    • 详细答案:库存记录以仓库、库存单元和批次等稳定归属路由,扣减在单分片内执行“可用量足够才扣减”的条件更新,并写入唯一预占流水。订单在另一分片只保存预占引用,不要求同步跨库提交;失败、超时和取消通过幂等事件释放库存,最终以库存余额、预占流水和订单状态三方对账。分片解决位置,不替代条件更新、唯一约束和补偿。
    • 进阶追问:同一订单有多个仓库商品怎么办?
    • 进阶回答:把每个仓库预占视为独立本地动作,订单聚合状态按全部成功、部分失败和补偿设计,不能假装它们是单库原子事务。

1.4 路由与全局 ID(全局唯一标识):数据位置必须可解释、可回放

路由是从业务键、路由版本和映射元数据确定物理库表的过程。写请求必须带确定分片键或先通过唯一索引服务查询归属;读请求优先携带分片键,缺失时只能走受控的索引表、搜索模型或异步数仓,不能默默广播。路由结果要记录 route_version(路由版本)、逻辑分片与物理位置,才能在灰度迁移、重试和故障回放中解释“这条订单为什么写到这里”。

全局 ID(全局唯一标识)至少要全局唯一、趋势有序或可接受、可独立生成且不泄露敏感业务量。数据库自增 ID(标识)在多库下会冲突且路由未知;UUID(通用唯一标识)唯一但随机性会影响索引局部性;Snowflake(雪花算法)类 ID(标识)兼顾趋势与分布式生成,但要治理时钟回拨、机器标识和解析边界。业务单号与主键要分开:支付渠道流水、商户订单号分别有自己的唯一和幂等语义。

路由或 ID(标识)方案优点风险工程控制
应用计算路由透明、性能可控规则散落路由库与版本化 SDK(软件开发工具包)
中间件路由接入改造小复杂 SQL(结构化查询语言)限制明确支持矩阵与压测
自增 ID(标识)分段简单、顺序好发号服务和段耗尽高低水位预取
Snowflake(雪花算法)ID(标识)本地生成、高并发时钟和节点治理时钟监控、节点租约
UUID(通用唯一标识)无中心依赖索引随机写、长度大选择有序变体或二进制存储

数据演绎 4:路由版本避免扩容时写错位置

订单 O900 的商家落在虚拟桶 513。旧路由版本 V1(版本一)将桶 513 指向 db03(数据库三),新版本 V2(版本二)将其指向 db17(数据库十七)。迁移灰度期间,读先按订单中持久化的 route_version(路由版本) 找到 V1(版本一)或 V2(版本二),写则由迁移状态决定双写或新写。若一个重试请求只按“当前 V2(版本二)”路由,会把本应更新旧库的订单写入新库,制造双事实。正确做法是订单创建时固定归属,迁移控制面显式改变状态,所有写入携带幂等键和位置版本。

热门面试题

  1. 问题(基础题):分片后为什么还需要全局 ID(全局唯一标识)?

    • 考点:多库主键冲突与跨系统关联。
    • 回答思路:说明本地自增局限、全局引用和索引取舍。
    • 详细答案:每个分片的自增主键都从局部序列生成,无法作为全局订单、库存流水或支付关联标识。全局 ID(全局唯一标识)让上游生成后即可路由、下游事件可幂等、对账可跨库关联;但它不是业务幂等键,支付回调仍需渠道流水或请求号唯一约束。
    • 进阶追问:全局 ID(全局唯一标识)越有序越好吗?
    • 进阶回答:不一定。过于严格的全局顺序可能增加发号协调和热点;需要的是满足索引局部性与业务可追溯的顺序,而不是把连续编号当正确性依据。
  2. 问题(原理题):路由规则为什么要版本化?

    • 考点:迁移期间的一致定位。
    • 回答思路:解释旧数据、新数据、重试请求并存。
    • 详细答案:扩容和热点迁移会让同一逻辑桶在不同时间映射到不同物理位置。没有路由版本,重试、补偿和异步消费可能按新规则更新旧数据或反过来。版本化路由把“何时、按哪个规则定位”作为数据事实的一部分,并能让切流、回滚和审计有明确依据。
    • 进阶追问:路由元数据更新后能立即清缓存吗?
    • 进阶回答:需要先定义缓存失效顺序、客户端观察到新版本的时间和双写窗口;不能假设所有实例同时更新。控制面通常要支持版本单调读取和灰度。
  3. 问题(项目题):订单履约查询没有商家标识时如何避免全库扫描?

    • 考点:反向索引与查询模型。
    • 回答思路:说明先补齐路由键,再给受控降级路径。
    • 详细答案:接口优先让调用方携带订单号或商家标识;若只有物流单号,则维护物流单号到订单归属的全局索引表或检索模型,索引记录也带路由版本。索引未命中时返回可解释的待同步状态或进入异步查询,不让线上接口广播所有分片。索引表自身要有唯一约束、重放幂等和延迟监控,否则只是把问题换到另一个库。
    • 进阶追问:全局索引表会成为单点吗?
    • 进阶回答:它也需要按访问模式分区、缓存和高可用;更关键的是把它限定为定位服务,不承载订单主事实和复杂聚合。

1.5 跨库分页、排序、聚合与 join(连接):先改变查询模型,再谈技术补救

flowchart TD
    A[带分片键的查询] --> B[单分片 SQL(结构化查询语言)]
    C[跨片列表/报表] --> D[异步宽表或数仓]
    E[少量跨片聚合] --> F[受限广播与应用归并]
    G[跨片 join(连接)] --> H[同片绑定或反范式索引]
    B --> I[稳定排序键与游标]
    F --> I

水平分片后,数据库原生的全局排序、分页、聚合和 join(连接)不再天然成立。对每个分片取 limit offset + size 再归并,看似正确却会使深分页的扫描量按分片数倍增,且并发写入下容易重复或漏读。在线列表应优先要求分片键,并用 created_at(创建时间) + id(标识) 这样的全局稳定排序键做 keyset pagination(游标分页);运营全局报表应走异步汇总、搜索模型或数仓;少量受控跨片查询才可取每片 Top K(前 K 条)后在应用层归并。

跨库 join(连接)优先改为绑定表同片、冗余必要字段或先查定位索引再点查,不应把中间件的广播 join(连接)作为日常主路径。比如订单和订单项以同一 order_id(订单标识) 规则同片,订单列表所需的商家展示名在订单快照中冗余;支付详情由支付标识定位,不在订单搜索页做实时多库连接。

需求推荐模型可接受的在线代价禁忌
订单详情带订单路由键点查一个分片先广播再过滤
商家订单列表商家同片、游标分页一个分片顺序扫描大偏移分页
全站运营排行异步聚合或数仓秒级或分钟级延迟实时扫所有分片
小范围跨片审计并发受限归并明确分片上限无上限 IN(属于)
订单与订单项绑定表同路由单片 join(连接)不同键独立散列

数据演绎 5:深分页为何会把 20 行变成 16 万次读取

16 个分片的全站订单列表请求第 10 001 页,每页 20 条。偏移分页需每片取前 10 000 × 20 + 20 = 200 020 条,理论候选为 3 200 320 条,再归并后只返回 20 条;即使索引覆盖,也会消耗网络、内存和数据库扫描预算。改用携带上页最后 (created_at, id) 的游标,每片只需向后取 20 至 40 条候选,最坏约 640 条再归并。若产品必须任意跳页,应使用异步检索索引或固定快照任务,而不是让交易库承担无限深度翻页。

热门面试题

  1. 问题(基础题):分片后如何做分页和排序?

    • 考点:全局有序性与游标。
    • 回答思路:先区分单片与跨片,再说明稳定排序键。
    • 详细答案:带分片键时仍在单片内用复合索引和游标分页;跨片列表必须有全局稳定排序键,各分片按游标取少量候选后归并。不能直接使用深偏移分页,因为每个分片都要跳过大量记录。产品若需要全局检索、跳页和复杂筛选,应将其建模为异步搜索或分析需求。
    • 进阶追问:只按创建时间排序够吗?
    • 进阶回答:不够,同一时间戳可能有多条记录;应增加全局唯一 ID(全局唯一标识)作为并列排序和游标续读条件。
  2. 问题(原理题):为什么跨库聚合容易不准确?

    • 考点:分片局部结果与全局语义。
    • 回答思路:举平均值、去重和延迟数据例子。
    • 详细答案count(计数)sum(求和) 可以局部计算后相加,但 avg(平均值) 必须合并分子分母,distinct(去重) 需要跨片去重集合,Top N(前 N)还要保留足够候选。迁移双写期间若没有去重键,同一订单可能被重复统计。因此在线聚合应限定语义、范围和迁移状态,经营报表更适合消费事件后异步汇总。
    • 进阶追问:中间件能自动聚合就没有风险了吗?
    • 进阶回答:自动归并只解决计算动作,不保证扫描成本、数据时点一致和重复迁移数据的业务语义。
  3. 问题(项目题):订单履约页怎样避免订单、轨迹和支付三库 join(连接)?

    • 考点:读模型与一致性分层。
    • 回答思路:把交易事实、展示快照和异步补偿分开。
    • 详细答案:订单详情先按订单路由读取订单与绑定的订单项;履约状态通过订单事件更新详情快照;支付只展示已确认的支付摘要和支付单入口,不在详情页同步 join(连接)账务明细。摘要短暂滞后时展示更新时间并可点击按支付标识查详情,后台任务持续修复缺失事件。这使用户路径保持单片或少量点查,资金事实仍以支付库为准。
    • 进阶追问:用户投诉支付成功但页面未更新怎么办?
    • 进阶回答:按支付流水查支付事实、事件投递与订单消费位点;若支付已入账就幂等补发状态事件,不能让前端重试直接改账务状态。

1.6 唯一约束、广播表与绑定表:把全局规则显式化

唯一约束只在一个物理表内生效。分片后 unique(email)unique(channel_trade_no) 这类业务不变量若不设计全局归属,就会在不同分片重复。方案包括把唯一键作为路由键、维护全局唯一索引表、由专用号段或登记服务分配,或者在业务允许时把唯一性范围限定为租户内。支付渠道流水必须全局或渠道范围内唯一,不能只靠应用先查询后插入;WMS(仓储管理系统)的库存预占请求号也需要在其归属分片内由唯一索引兜底。

广播表是每个分片都保存的一小份、低频变化且读多的数据,如国家码、仓库静态配置或字典;写入必须可靠传播并有版本校验,不能放高频可变余额。绑定表是一组拥有相同分片键和同一算法的表,例如订单、订单项、履约子任务,使它们在同一物理分片内 join(连接)。绑定不是外键替代:仍需定义删除、状态推进和异常补偿。

对象分片后做法一致性要求典型误区
渠道支付流水全局登记或渠道归属唯一强幂等每个订单库各建唯一键
商家内订单号merchant_id(商家标识) 同片唯一租户内强唯一误称全局唯一
国家码字典广播表加版本最终一致可控当成余额表复制
订单与订单项绑定表同路由单片事务只按各自主键散列
库存预占流水库存归属片唯一强幂等先查后插无约束

数据演绎 6:支付回调重复如何穿透双写窗口

渠道回调 T20260714001 到达两次:第一次在旧分片写入支付流水并发布事件;迁移双写期间第二次到达,应用先以渠道流水在全局登记表原子占位,返回已处理,再根据登记的支付归属定位旧片或新片。若只在每个支付分片上建唯一索引,双写时两个库都可能各插入一条成功流水,资金与订单都会重复推进。正确验收包括“登记表一条、支付事实一条、订单支付事件至多生效一次”,三者任何不一致都进入对账。

热门面试题

  1. 问题(基础题):分库分表后唯一约束怎么保证?

    • 考点:局部唯一与全局唯一。
    • 回答思路:先声明数据库唯一索引范围,再按业务不变量选方案。
    • 详细答案:物理唯一索引只能约束当前分片。若业务键可路由,就让同一键必然落在同片并建本地唯一索引;若不能路由,则需要全局索引或登记服务先原子占位;若业务语义只是商家内唯一,就把唯一范围写清并将商家作为联合唯一键。不能用“先查询不存在再插入”代替并发约束。
    • 进阶追问:全局索引表失败会怎样?
    • 进阶回答:要定义占位、主写和释放的状态机,处理超时悬挂并用对账修复;它本身也需要高可用和幂等重试。
  2. 问题(原理题):广播表为什么适合字典而不适合库存?

    • 考点:复制写放大与冲突。
    • 回答思路:对比低频版本数据与高频强一致余额。
    • 详细答案:字典配置小、读取频繁、写入少,允许按版本异步传播;广播能消除每次查询跨库访问。库存余额高频变化且扣减必须原子,复制到每片会产生多主冲突、传播延迟和写放大,无法证明可用量正确。因此库存应有单一归属,其他分片通过事件或只读快照消费。
    • 进阶追问:仓库配置变化如何保证一致?
    • 进阶回答:使用版本号、发布状态和消费确认;关键交易携带配置版本或在单一配置服务校验,不把“最终会同步”当作强一致承诺。
  3. 问题(项目题):绑定表怎样帮助订单履约,又有哪些边界?

    • 考点:共定位收益与跨域边界。
    • 回答思路:说明同片 join(连接)和事务,再指出支付不应强绑。
    • 详细答案:订单、订单项、拣货任务和履约状态以订单归属使用同一分片算法,详情页和状态推进可在一个数据库事务中完成,避免广播 join(连接)。但支付流水、退款账务和库存事实各有独立不变量,不能为了方便查询硬绑定;它们通过订单标识关联、事件通知和对账闭环协作。
    • 进阶追问:绑定表能否随意增加?
    • 进阶回答:不能。新表若主要访问键不同或生命周期不同,强行绑定会制造热点和冗余;要先审计查询和写入模式。

1.7 读写分离与一致性读:副本是性能策略,不是正确性来源

flowchart LR
    A[支付回调/库存扣减] --> B[主库单片事务]
    B --> C[binlog(二进制日志)复制]
    C --> D[只读副本]
    E[刚写后查询] --> B
    F[列表和非关键查询] --> D
    G[副本延迟超阈值] --> H[降级主库或返回可解释延迟]

读写分离把可容忍延迟的读导向副本,不能改变写入事实的唯一归属。支付回调、库存扣减、订单状态条件更新必须走主库;用户刚提交订单后查看结果、支付成功后的确认页、后台对账基线也通常要读主库或使用会话一致性策略。复制延迟时,副本可能读到旧订单状态,若应用据此再次扣减或重复入账,就会产生业务错误。

实现上可按请求语义加读路由标签,或在写后保存 GTID(全局事务标识)/时间窗并等待副本追平;更保守的做法是关键链路固定主读。不要把“读到了副本”隐藏在数据访问层,调用方必须知道本次读取是否允许陈旧。分片后每个逻辑分片都有主从拓扑,延迟、故障切换和读流量也要按分片监控。

场景读位置原因降级策略
库存扣减后确认主库必须读到本次条件更新主库限流而非读副本
支付回调幂等判断主库不能读陈旧流水重试与查单
订单历史列表副本可选允许短暂延迟标识数据更新时间
运营报表副本或数仓不参与交易决策延迟告警
对账任务主库快照或一致备份需要明确基线分批、限速

数据演绎 7:副本延迟 5 秒如何制造重复扣减

库存主库已将可用量从 1 扣到 0,并写入预占流水;副本因 5 秒延迟仍显示可用量 1。若下一个请求先从副本“预检查有库存”,再对主库执行无条件更新,便会把库存扣成负数;即使主库条件更新拦住,用户仍会经历错误提示和重试风暴。正确路径是主库直接执行条件更新,以受影响行数判断成功;副本仅用于不影响决策的展示。这个例子说明读写分离不能替代原子条件写。

热门面试题

  1. 问题(基础题):哪些请求不能读从库?

    • 考点:读己之写与交易决策。
    • 回答思路:按刚写后读取、幂等判断、资金库存决策列举。
    • 详细答案:刚写后的确认读、支付流水幂等判断、库存可用量决策、订单状态推进和对账基线不能依赖可能延迟的副本。它们要读主库、等待指定复制位点或使用强一致存储。历史列表、非关键展示和离线报表才可根据延迟预算读副本。
    • 进阶追问:主从延迟为零就绝对安全了吗?
    • 进阶回答:监控上的零是采样结果,仍可能在故障切换、网络抖动或读取时点出现差异;关键正确性不应建立在观测延迟恰好为零上。
  2. 问题(原理题):读写分离和分库分表是什么关系?

    • 考点:两个正交维度。
    • 回答思路:一个解决读副本扩展,一个解决数据归属扩展。
    • 详细答案:分库分表决定一条数据属于哪个逻辑分片和主库;读写分离决定已定位分片中的一次读去主库还是副本。二者可叠加,但路由顺序通常是先分片、再选择主从。把副本当成另一个可写分片会破坏单一写主和复制拓扑。
    • 进阶追问:读库很多能消除主库压力吗?
    • 进阶回答:能分担可复制读,却不能分担写入、日志、复制源输出和热点行锁;读流量过大还可能反向影响复制与网络。
  3. 问题(项目题):支付成功页如何在读写分离下保证体验与正确性?

    • 考点:主读窗口与最终展示。
    • 回答思路:说明支付确认、订单更新和后续降级。
    • 详细答案:支付回调在支付主库完成幂等入账后,订单服务消费事件更新订单状态。用户支付完成回跳的短窗口内,订单查询固定主库或按会话一致性读取,直到看到已支付;之后历史列表可以读副本,并标记更新时间。若订单事件暂未消费,页面展示“支付已确认,订单状态同步中”,后台幂等补偿,而不是让用户重新支付。
    • 进阶追问:如果主库压力高怎么办?
    • 进阶回答:保护支付和库存主路径,限制非关键查询、缩短主读窗口、预热订单状态缓存;不能为了吞吐把确认读悄悄改到副本。

1.8 ShardingSphere(分库分表中间件)、MyCat(数据库中间件)与应用路由对比

选型不是谁“功能多”就选谁,而是看 SQL(结构化查询语言)形态、团队可控性、迁移能力与故障模型。Apache ShardingSphere(分库分表中间件)可在 JDBC(Java 数据库连接)层或代理层提供分片、读写分离、分布式主键和部分分布式事务能力,适合 Java(编程语言)生态中希望规则集中、应用改造可控的场景;MyCat(数据库中间件)以数据库代理方式接入,便于对多语言应用透明,但代理本身成为容量、兼容性和故障域的一部分;应用路由把路由逻辑和数据访问模型显式放在服务内,性能和可解释性最好,却要求各服务严格复用规则库并承担治理。

不论选哪种,广播查询、复杂 join(连接)、全局排序、事务和迁移都受数据物理边界约束。中间件能改写 SQL(结构化查询语言)并归并结果,却无法免费创造跨库原子性或消除网络成本。先用真实 SQL(结构化查询语言)分类:单片点查比例、广播上限、写事务形态、在线变更和故障演练,再做压测和灰度。

方案主要优势主要代价适合的团队边界
ShardingSphere(分库分表中间件)JDBC(Java 数据库连接)应用内可观测、规则集中依赖接入和兼容矩阵Java(编程语言)服务统一
ShardingSphere(分库分表中间件)Proxy(代理)协议接入相对透明新代理故障域多语言且运维成熟
MyCat(数据库中间件)改造路径直观代理性能与 SQL(结构化查询语言)限制既有代理经验
应用路由位置显式、定制强每个服务需治理领域边界清晰、平台能力强

数据演绎 8:广播率决定中间件不是“零改造”

抽样一周订单接口:1 000 万次请求中,带商家或订单路由键的占 9 850 万次,缺失路由键的全局检索占 150 万次。若有 32 个分片,后者会产生 4 800 万次物理查询,平均每个逻辑请求放大 32 倍;即使中间件自动归并,数据库和网络仍承担真实成本。先把这 1.5% 的接口改为检索索引、强制筛选或异步报表,收益远大于替换中间件。验收指标应是广播率从 1.5% 降到 0.05% 以下,而不是仅验证代理能返回结果。

热门面试题

  1. 问题(基础题):ShardingSphere(分库分表中间件)、MyCat(数据库中间件)和应用路由怎么选?

    • 考点:选型维度而非产品背诵。
    • 回答思路:按接入位置、SQL(结构化查询语言)兼容、可观测和故障域比较。
    • 详细答案:统一 Java(编程语言)服务且愿意在数据访问层治理时,可评估 ShardingSphere(分库分表中间件)JDBC(Java 数据库连接);多语言透明接入可评估代理形态,包括 ShardingSphere(分库分表中间件)Proxy(代理)或 MyCat(数据库中间件);领域路由复杂、需要强定制与可解释时,应用路由更合适。无论选择哪一种,都必须限制广播 SQL(结构化查询语言)、验证兼容矩阵并演练代理或路由失效。
    • 进阶追问:中间件可以让业务不感知分片吗?
    • 进阶回答:只能降低接入感知,不能消除查询模型和一致性边界;业务仍要提供分片键并接受跨库操作限制。
  2. 问题(原理题):为什么应用路由常常更容易排障?

    • 考点:位置透明性与诊断上下文。
    • 回答思路:说明路由键、版本和物理位置可被日志记录。
    • 详细答案:应用路由可在调用链中记录业务键、逻辑桶、物理库表、路由版本和迁移状态,排障时能直接回答请求去了哪里。代理或中间件也可以提供日志,但若规则、改写和归并隐藏在基础设施层,业务排查需要跨团队拼接证据。代价是应用路由必须避免各服务复制不同规则,应由共享库或路由服务统一发布。
    • 进阶追问:应用路由是否会污染业务代码?
    • 进阶回答:要把它封装为基础设施接口,业务只传领域键和操作语义;不要让控制器里散落库表名称与取模规则。
  3. 问题(项目题):你如何验证中间件上线不会伤害订单主链路?

    • 考点:兼容性、性能和回滚演练。
    • 回答思路:从 SQL(结构化查询语言)清单、压测、灰度、故障四层回答。
    • 详细答案:先扫描所有订单 SQL(结构化查询语言),标记单片、广播、聚合、分页、事务和不支持语法;再用生产脱敏数据压测 P99(百分之九十九分位)、连接数、归并内存和广播率;灰度仅放少量商家桶,并对比路由结果与业务返回;最后演练中间件不可用、规则回滚、分片主库切换和迁移双写。任何一项越过阈值都能按路由版本切回原路径。
    • 进阶追问:只测成功 SQL(结构化查询语言)够吗?
    • 进阶回答:不够;还要测超时、重试、部分分片失败、连接耗尽、结果归并过大和事务回滚。

1.9 扩容迁移总原则:回填、追增量、校验、灰度、切流、回滚缺一不可

sequenceDiagram
    participant O as 旧分片
    participant C as CDC(变更数据捕获)
    participant N as 新分片
    participant R as 路由控制面
    O->>N: 主键分段回填
    O->>C: binlog(二进制日志)持续变更
    C->>N: 幂等重放并记录位点
    N-->>R: 校验通过
    R->>R: 灰度开启双写与影子读
    R->>N: 切换指定虚拟桶
    alt 指标越界或差异
        R->>O: 回退旧路由版本
    else 稳定窗口结束
        R->>O: 旧数据只读保留后下线
    end

不停机迁移不是把旧库停掉、导出、导入、新库开机,而是让旧库在服务期间成为权威源,目标库先承接历史快照,再通过 CDC(变更数据捕获)消费 binlog(二进制日志)追上增量。只有当目标位点追平、结构一致、数据校验和业务不变量校验均通过时,才进入双写和灰度读;切流按虚拟桶或租户小批次执行,并保留旧路由、旧数据和可回放日志直到稳定窗口结束。

迁移控制面至少维护迁移范围、快照起点、CDC(变更数据捕获)位点、源目标校验状态、双写状态、读写路由版本、切流比例和回滚阈值。回滚不是“把新库删掉”,而是停止扩大切流、把未确认的路由回到旧版本,同时保留已经产生的双写证据,以便修复差异。若已在新库独占写入,则回滚必须说明反向同步与冲突策略,不能口头承诺一键回退。

阶段目标必要证据失败动作
准备锁定范围与不变量结构、索引、路由、阈值清单不满足即不开始
回填搬运历史快照主键水位、批次记录、限速断点续传
追平消费所有增量位点差、延迟、失败队列重放或修复位点
双写验证双目标一致幂等键、双写成功率降级旧写并补偿
灰度切流验证真实请求差异率、P99(百分之九十九分位)、错误率路由回退
收尾删除旧依赖稳定窗口对账、备份延后下线

数据演绎 9:以位点差而不是“迁移跑完了”判断是否可切流

回填任务在 02:00 读到源库快照水位 L100,完成 8 000 万行后,CDC(变更数据捕获)已消费到 L180;此时源库最新位点为 L185,仍有 5 个日志事务未应用,且其中包含订单状态从“待支付”改为“已支付”。若只比较行数,源目标都是 8 000 万行,仍会漏掉状态更新。应等待目标成功应用至至少 L185,并再取一个稳定观测窗口确认源、目标位点差为零;同时检查死信、重复消费、DDL(数据定义语言)变更和长事务延迟,才允许下一阶段。

热门面试题

  1. 问题(基础题):为什么不建议停机全量搬迁?

    • 考点:停机窗口与数据变化。
    • 回答思路:说明大数据量不可预测、业务写入不会停止和回滚困难。
    • 详细答案:大表导出导入、索引构建、校验和切换时间会随数据量与环境波动,难以承诺短停机窗口;停机期间订单、支付和库存仍会产生外部事实,恢复后需要补录并可能错序。在线回填加 CDC(变更数据捕获)让源库持续服务,迁移过程可限速、可断点和可灰度,风险从一次大爆炸变成可观测的小批次。
    • 进阶追问:低峰停机迁移不是更简单吗?
    • 进阶回答:小数据、可完全关闭写入且有充分恢复演练时可以,但对订单、支付和库存主链路,低峰并不等于无外部事件,仍应优先在线方案。
  2. 问题(原理题):回填与 CDC(变更数据捕获)怎样避免漏数据?

    • 考点:快照边界和增量位点。
    • 回答思路:先记录一致快照水位,再以位点重放到追平。
    • 详细答案:在源库建立可重复的快照边界并记录对应 binlog(二进制日志)位点,回填读取该快照范围;CDC(变更数据捕获)从边界位点开始消费,目标写入必须幂等,允许回填与增量对同一主键重复到达。最后以目标已应用位点、行级校验和业务不变量共同确认,而不是依赖任务显示完成。
    • 进阶追问:源表有删除怎么办?
    • 进阶回答:CDC(变更数据捕获)必须包含删除或软删除事件;校验按当前可见状态和删除墓碑规则进行,不能只比插入数量。
  3. 问题(项目题):迁移 WMS(仓储管理系统)库存表时如何降低风险?

    • 考点:库存强一致边界与在线迁移。
    • 回答思路:强调先迁历史、主库条件写、短双写和余额对账。
    • 详细答案:库存迁移先按仓库或虚拟桶回填库存余额、预占流水和版本号,再以 CDC(变更数据捕获)追增量;迁移期间库存扣减仍在旧归属片以条件更新为权威,同时向新片按请求号幂等复制。灰度时只切换无活动预占或已对账的仓库,持续比较“可用量 + 冻结量 + 已售/预占流水”不变量。发现差异立刻回退该仓库路由并冻结扩大范围,不对全局库存做粗暴回滚。
    • 进阶追问:能否只迁余额不迁流水?
    • 进阶回答:不建议。没有预占、释放和调整流水就无法解释差异、去重补偿或完成对账;至少要保留可追溯的历史基线。

1.10 双写、影子读与灰度切流:双写是迁移阶段,不是长期架构

flowchart TD
    A[请求含幂等键与路由版本] --> B{迁移状态}
    B -->|旧写| C[只写旧分片]
    B -->|双写| D[旧分片主写]
    D --> E[新分片幂等写]
    B -->|新写灰度| F[新分片主写]
    E --> G[影子读/异步比对]
    F --> G
    G --> H{差异或阈值越界}
    H -->|是| I[停止扩大并回退路由]
    H -->|否| J[扩大下一批桶]

双写的难点不在“调用两次写入”,而在部分成功、重试乱序、超时未知和重复事件。必须先定义主写权威:常见做法是旧分片先完成本地事务,新分片按全局 ID(全局唯一标识)或业务请求号幂等写入;如果副写失败,记录可靠待补任务和告警,不把请求悄悄当成功。双写期间禁止基于新库的陈旧读做交易决策,影子读只用于比对结果,不返回给用户。

灰度切流按虚拟桶、商家或仓库逐批推进,每批都观察写成功率、双写差异、读结果差异、P99(百分之九十九分位)、复制延迟和资金/库存不变量。新写阶段必须明确旧库是否仍同步:若保留反向同步,复杂度高但回退容易;若停止旧写,则回退不再是无损动作,需要把新写反向补回或把这批视为不可回退边界。工程上优先把“可回退窗口”限定在双写期,并避免过早结束旧数据保留。

模式写权威读权威适用阶段关键风险
旧写 + 新副写旧分片旧分片初始双写新写漏补
旧写 + 影子读旧分片旧分片校验影子流量过大
新写 + 旧副写新分片新分片可控切流回退需确认旧追平
新写单写新分片新分片稳定后不能直接回退

数据演绎 10:双写 99.99% 成功仍不能忽略失败尾部

某订单桶每小时 300 万次状态写入,副写成功率 99.99%,看似只失败 0.01%,实际每小时约 300 条新分片缺失。若不记录请求号与补偿队列,24 小时会积累 7 200 条差异,其中可能包含支付确认或库存释放。正确阈值不是“成功率看起来很好”,而是副写失败必须可定位、可重放,未补差异数在 0 或明确受控上限;切流前要求连续两个观测窗口差异归零,并按业务类型抽样核验状态机。

热门面试题

  1. 问题(基础题):双写如何保证一致?

    • 考点:幂等、部分失败和补偿。
    • 回答思路:先否定同步两次调用即一致,再给权威写与可靠补偿。
    • 详细答案:双写无法天然原子,需要指定一个权威主写位置,两个目标都以相同业务幂等键写入;副写失败、超时或未知结果必须记录到可靠任务并反复补偿,不能无声忽略。读流量在切流前仍以权威库为准,差异通过校验和不变量发现。支付、库存这类强约束数据还要保留本地唯一索引和条件更新。
    • 进阶追问:能用分布式事务包住双写吗?
    • 进阶回答:可以评估,但它增加协调、可用性和故障恢复复杂度,不适合把大规模迁移每次写都变成跨库同步提交;通常用本地事务加幂等补偿更可控。
  2. 问题(原理题):影子读为什么不能直接返回新库结果?

    • 考点:比对流量与业务权威。
    • 回答思路:说明新库尚在验证、差异不能影响用户。
    • 详细答案:影子读的目的,是在不改变用户行为的前提下比较新旧库的记录、排序和权限结果。迁移未完成时,新库可能存在位点延迟、回填缺口或索引差异;直接返回会把验证问题变成用户故障。影子请求应采样、限速、脱敏并异步记录差异,超过阈值立即停止扩大灰度。
    • 进阶追问:影子读结果不同一定是数据错吗?
    • 进阶回答:不一定,可能是排序稳定性、时区、软删除过滤、权限条件或读取时点不同;比对前要定义等价语义。
  3. 问题(项目题):支付订单双写时遇到超时,你怎么判断是否重试?

    • 考点:未知结果与资金幂等。
    • 回答思路:以支付请求号查询权威事实,不盲目重发。
    • 详细答案:请求超时不代表写失败。先按支付请求号和渠道流水在权威支付分片查询状态;若已成功,就返回既有结果并异步补新分片;若明确未写入才重试;若状态未知,进入查单或人工对账队列。所有重试沿用同一幂等键,订单状态推进也以支付事件标识去重,避免网络抖动导致重复入账或重复发货。
    • 进阶追问:副写成功、主写超时怎么办?
    • 进阶回答:仍以权威主写的可查询状态判断,不把副写当资金事实;必要时标记新库孤儿记录并在对账中清理或补齐。

1.11 数据校验与业务对账:行数一致只是最低门槛

flowchart LR
    A[结构与索引校验] --> B[分桶行数校验]
    B --> C[主键/版本校验和]
    C --> D[业务不变量校验]
    D --> E[抽样明细回放]
    E --> F{差异归零?}
    F -->|否| G[差异队列:定位、重放、复核]
    G --> B
    F -->|是| H[允许扩大灰度]

迁移校验分四层。第一层是结构:字段类型、字符集、默认值、索引、唯一约束、分区和触发器是否与迁移设计一致。第二层是物理数据:按逻辑桶、主键范围或日期分段比较行数、最大更新时间、校验和,而不是只比较总数。第三层是语义数据:订单状态机是否只允许合法转换,库存是否满足余额不变量,支付借贷/收付是否平衡。第四层是链路:从请求号追到事件、订单、履约、支付和对账结果,验证重复、删除、软删除和异常补偿都可解释。

校验任务必须可重复、可限速、可记录版本。对大表不可一次全表 checksum(校验和) 把主库打满,可按虚拟桶和时间窗口在副本或一致快照上执行,并把差异落入专门队列。差异修复也必须幂等:明确源为准、重放哪条变更、是否保留审计记录,不能用“目标覆盖源”掩盖真实写入问题。

校验层级比较对象能发现什么不能证明什么
结构DDL(数据定义语言)、索引、约束漏字段、漏索引、类型漂移业务状态正确
物理分桶行数、主键、版本、校验和漏行、重复、旧版本金额语义正确
不变量库存、资金、状态机关键业务错误所有展示字段一致
链路请求到事件到事实表幂等和补偿断点全量统计准确

数据演绎 11:库存余额相等仍可能隐藏预占差异

源、目标两个仓库分片的库存余额都显示“可用 1 000、冻结 200”,行数和余额校验均通过;但源库有 200 条预占流水,目标库只有 198 条,其中两条各 10 件的预占被另一条调整流水抵消,所以总额碰巧一致。若只比余额,后续取消订单会在目标库找不到预占而无法释放。业务校验应同时验证 可用 + 冻结 + 已售调整 的守恒关系、预占流水请求号集合、每条流水的版本和关联订单状态,才能确认迁移正确。

热门面试题

  1. 问题(基础题):迁移数据只校验行数可以吗?

    • 考点:物理校验与业务校验差异。
    • 回答思路:先指出行数盲区,再列分段、版本和不变量。
    • 详细答案:不可以。行数无法发现同主键内容不同、重复覆盖、软删除丢失、金额错位或状态倒退。至少要按桶比较主键和版本校验和,再根据领域校验订单状态机、库存守恒和支付资金不变量;关键链路还要抽样从请求号回放到最终事实。
    • 进阶追问:全表校验和相同就完全正确吗?
    • 进阶回答:不完全正确,校验算法、字段选择、读取时点和碰撞概率都要考虑;它是强信号,不替代业务语义验证。
  2. 问题(原理题):为什么校验必须按分片桶分段?

    • 考点:可定位性与在线负载控制。
    • 回答思路:说明总量差异无法定位,分段能重跑。
    • 详细答案:总表差异只能告诉你“有问题”,无法快速定位哪条数据、哪段迁移、哪个路由版本造成。按虚拟桶、主键范围或时间窗校验可并行限速、失败重跑、缩小修复范围,并能与切流批次一一对应。分段方式要和路由、回填批次一致,否则校验结果难以解释。
    • 进阶追问:校验会影响线上吗?
    • 进阶回答:会,因此应优先副本或一致快照、限速、低峰执行,并监控 I/O(输入输出)和复制延迟;校验任务本身也要可暂停。
  3. 问题(项目题):支付资金一致性在迁移后怎么对账?

    • 考点:外部渠道事实与内部账务。
    • 回答思路:按渠道流水、内部账、订单状态和差异处置说明。
    • 详细答案:以渠道交易流水和内部支付账务分别汇总,按渠道流水、商户订单号和金额匹配,再关联订单支付状态;迁移期间额外比对旧新支付事实的唯一键、金额、币种、状态和入账时间。差异分为渠道有内部无、内部有渠道无、金额不符、状态不符,分别走查单、补单、冲正或人工复核。对账结果要保存批次和证据,不能只修正页面展示。
    • 进阶追问:为什么不能只以订单已支付为准?
    • 进阶回答:订单是业务投影,渠道和账务流水才是资金证据;订单状态可能因事件延迟而暂时不同步。

1.12 扩容后的热点治理、回滚边界与线上排查

flowchart TD
    A[告警:延迟/差异/锁等待] --> B{先定影响桶与版本}
    B --> C[查路由、迁移状态、主从角色]
    C --> D{数据差异?}
    D -->|是| E[停止扩大、回退未确认桶、保全位点]
    D -->|否| F{热点或资源饱和?}
    F -->|是| G[识别 Top N(前 N)键、限流、热点隔离]
    F -->|否| H[查 SQL(结构化查询语言)广播、连接与代理]
    E --> I[对账、重放、复核]
    G --> I
    H --> I

扩容完成不是终点。要持续按逻辑桶而非只按实例均值观察容量、TPS(每秒事务数)、P99(百分之九十九分位)、锁等待、慢 SQL(结构化查询语言)、复制延迟、广播率、双写遗留和对账差异。热点可能来自头部商家、单仓库爆款、分片规则倾斜、全局序列、代理连接池或迁移校验任务;先确认热点是否集中在同一业务键,再选限流、隔离、拆桶、队列合并或索引优化,不能只横向加库。

回滚边界要在切流前声明。对尚处旧写 + 新副写阶段的桶,路由回退相对简单;对已新写且旧库不再同步的桶,回退需要反向复制、冲突处理和重新对账,可能不再满足快速恢复目标。线上排查先冻结扩大范围,保存路由版本、请求号、binlog(二进制日志)位点、差异样本和指标时间线,再做定向止血。任何人工修数都必须有审批、审计和二次校验。

现象首要证据可能根因安全动作
单桶 P99(百分之九十九分位)升高桶 TPS(每秒事务数)、热键、锁等待头部商家或热库存限流、隔离、短事务
切流后查询为空路由版本、索引位点、影子差异路由错配或未追平回退该桶、补数据
对账差异增长请求号、事件位点、双写队列副写失败或重放乱序停扩、重放、复核
广播率升高SQL(结构化查询语言)标签、分片数新接口缺路由键限制接口、建索引模型
副本延迟升高每片复制延迟、校验任务负载回填/校验抢资源限速、主读保护

数据演绎 12:扩容后平均均衡但单桶仍失火

扩容至 32 个物理分片后,实例平均 CPU(中央处理器)从 68% 降到 31%,但桶 513 的订单 P99(百分之九十九分位)仍为 1.8 秒,且该桶的库存行锁等待占全局 72%。查看 Top N(前 N)键发现一个仓库爆款每秒 1 200 次预占,所有请求仍落到同一 warehouse_id(仓库标识) + sku_id(库存单元标识)。此时再迁桶只能把热点从一个实例搬到另一个实例;应先对该库存采用队列合并、按批次或库存桶拆分、限购和条件更新,并以余额守恒与成功率验证。结论:分片均衡是资源均衡,不等于单业务键可并行。

热门面试题

  1. 问题(基础题):切流后发现异常,如何回滚?

    • 考点:迁移状态决定回滚方式。
    • 回答思路:先停止扩大,再按双写状态判断路由回退是否安全。
    • 详细答案:先冻结下一批桶,保全路由版本、请求号、位点和差异样本;若仍是旧写权威且新库为副写,可把受影响桶路由回旧版本并补新库;若已新写且旧库未同步,不能直接切回,应先评估反向同步、冲突和对账,必要时将问题桶隔离处理。回滚后仍要校验两边数据,不能以接口恢复为结束。
    • 进阶追问:回滚会不会丢新库写入?
    • 进阶回答:若设计了双写、幂等键和位点证据,可重放补齐;若没有,则这是迁移设计缺陷,必须先停止扩大范围而不是盲目回退。
  2. 问题(原理题):为什么分片扩容不能解决单热键?

    • 考点:键空间分散与同键串行。
    • 回答思路:说明一个键只能落在一个归属片、锁冲突仍局部存在。
    • 详细答案:水平分片把不同键分散到不同资源,但同一库存记录、同一支付幂等键或同一全局序列仍必须在一个位置上维护顺序和约束。若热点集中在一个键,扩容只降低其他键的负载,无法让该键的锁和日志并行。要从业务语义出发做分桶、合并、限流或异步化,并保留正确性不变量。
    • 进阶追问:把热键复制多份读可以吗?
    • 进阶回答:展示读可用缓存或副本,写决策仍需单一权威;多份可写副本会把一致性问题放大。
  3. 问题(项目题):你如何组织一次订单分片迁移的线上值守?

    • 考点:可观测、止血和职责分工。
    • 回答思路:按前置检查、实时面板、阈值、回滚与复盘描述。
    • 详细答案:值守前确认迁移范围、路由版本、回填位点、双写补偿积压、结构校验和回滚开关;实时面板按桶展示错误率、P99(百分之九十九分位)、TPS(每秒事务数)、广播率、主从延迟、差异数和支付/库存不变量。明确谁批准扩大、谁执行回退、谁核对资金差异,出现异常先停止扩大并回退未确认桶。结束后保留证据、完成稳定窗口对账,再复盘接口缺键、热点和工具告警。
    • 进阶追问:为什么必须按桶观察而不是只看全局?
    • 进阶回答:灰度和热点都以桶为最小影响面;全局平均会掩盖一个桶的差异和尾延迟,导致扩大后才发现问题。

2. 综合题库演练过渡(非知识型)

下面七图只用于组织口述路径,不新增知识结论。你先说明业务边界和数据位置,再说明约束、迁移证据与回滚条件,避免把中间件能力误说成业务正确性。

flowchart LR
    A[容量告警] --> B[归档与索引治理]
    B --> C{仍无法满足恢复窗口?}
    C -->|是| D[垂直拆分]
    C -->|否| E[暂缓分片并持续监控]
    D --> F[水平分片]
flowchart TD
    A[订单宽表] --> B[订单核心]
    A --> C[履约轨迹]
    A --> D[附件与检索]
    A --> E[支付账务]
    B --> F[按归属键分片]
    C --> G[按生命周期归档]
flowchart LR
    A[业务请求] --> B[分片键]
    B --> C[虚拟桶]
    C --> D[路由版本]
    D --> E[物理库表]
    E --> F[本地约束与事务]
flowchart TD
    A[缺少分片键的查询] --> B{是否交易主链路?}
    B -->|是| C[补充定位索引或改接口]
    B -->|否| D[异步检索或报表]
    C --> E[单片点查]
    D --> F[受限跨片归并]
flowchart LR
    A[业务唯一键] --> B{能作为路由键?}
    B -->|能| C[同片唯一索引]
    B -->|不能| D[全局登记索引]
    C --> E[本地事务]
    D --> F[幂等占位与对账]
flowchart TD
    A[迁移准备] --> B[快照回填]
    B --> C[增量追平]
    C --> D[数据校验]
    D --> E[双写与影子读]
    E --> F[分桶灰度切流]
    F --> G[稳定窗口与下线]
    F -.异常.-> H[路由回退与差异修复]
flowchart LR
    A[按桶监控] --> B[容量与吞吐]
    A --> C[热点与锁等待]
    A --> D[广播率]
    A --> E[迁移差异]
    B --> F[扩容决策]
    C --> G[热点隔离]
    D --> H[查询模型治理]
    E --> I[停止扩大并对账]

3. 分库分表与迁移综合题库

每题均绑定本册真实小节与知识图谱入口。答题先给结论,再给数据或路由证据,最后说明验证与回滚。

  1. 问题(综合题):为什么要分库分表,而不是先升级单机?

    • 口述答案:我会把“为什么要分库分表,而不是先升级单机?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“为什么要分库分表,而不是先升级单机?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第1题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“为什么要分库分表,而不是先升级单机?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  2. 问题(综合题):为什么通常先垂直拆分,再做水平分片?

    • 口述答案:我会把“为什么通常先垂直拆分,再做水平分片?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“为什么通常先垂直拆分,再做水平分片?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第2题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“为什么通常先垂直拆分,再做水平分片?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  3. 问题(综合题):怎样选择订单、库存和支付的分片键?

    • 口述答案:我会把“怎样选择订单、库存和支付的分片键?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“怎样选择订单、库存和支付的分片键?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第3题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“怎样选择订单、库存和支付的分片键?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  4. 问题(综合题):分片后路由规则为什么必须版本化?

    • 口述答案:我会把“分片后路由规则为什么必须版本化?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“分片后路由规则为什么必须版本化?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第4题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“分片后路由规则为什么必须版本化?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  5. 问题(综合题):全局 ID(全局唯一标识)应怎样设计?

    • 口述答案:我会把“全局 ID(全局唯一标识)应怎样设计?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“全局 ID(全局唯一标识)应怎样设计?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第5题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“全局 ID(全局唯一标识)应怎样设计?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  6. 问题(综合题):跨库分页、排序和深翻页应怎样设计?

    • 口述答案:我会把“跨库分页、排序和深翻页应怎样设计?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“跨库分页、排序和深翻页应怎样设计?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第6题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“跨库分页、排序和深翻页应怎样设计?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  7. 问题(综合题):跨库聚合和 join(连接)为什么应改查询模型?

    • 口述答案:我会把“跨库聚合和 join(连接)为什么应改查询模型?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“跨库聚合和 join(连接)为什么应改查询模型?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第7题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“跨库聚合和 join(连接)为什么应改查询模型?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  8. 问题(综合题):分库分表后如何保证全局唯一约束?

    • 口述答案:我会把“分库分表后如何保证全局唯一约束?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“分库分表后如何保证全局唯一约束?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第8题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“分库分表后如何保证全局唯一约束?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  9. 问题(综合题):广播表和绑定表的适用边界是什么?

    • 口述答案:我会把“广播表和绑定表的适用边界是什么?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“广播表和绑定表的适用边界是什么?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第9题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复也必须留下审批、前后值与二次核验记录。
    • 对应机制详解
    • 追问树
      • 若“广播表和绑定表的适用边界是什么?”中的权威位置不可用,读写怎样降级?
      • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
      • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  10. 问题(综合题):读写分离如何避免读到旧数据?

  • 口述答案:我会把“读写分离如何避免读到旧数据?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“读写分离如何避免读到旧数据?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第10题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“读写分离如何避免读到旧数据?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):ShardingSphere(分库分表中间件)、MyCat(数据库中间件)与应用路由如何选?
  • 口述答案:我会把“ShardingSphere(分库分表中间件)、MyCat(数据库中间件)与应用路由如何选?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“ShardingSphere(分库分表中间件)、MyCat(数据库中间件)与应用路由如何选?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第11题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“ShardingSphere(分库分表中间件)、MyCat(数据库中间件)与应用路由如何选?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):为什么库存防超卖不能只靠分库分表?
  • 口述答案:我会把“为什么库存防超卖不能只靠分库分表?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“为什么库存防超卖不能只靠分库分表?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第12题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“为什么库存防超卖不能只靠分库分表?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):支付资金一致性在分片系统中应坚持哪些边界?
  • 口述答案:我会把“支付资金一致性在分片系统中应坚持哪些边界?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“支付资金一致性在分片系统中应坚持哪些边界?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第13题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“支付资金一致性在分片系统中应坚持哪些边界?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):为什么分布式事务不是默认答案?
  • 口述答案:我会把“为什么分布式事务不是默认答案?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“为什么分布式事务不是默认答案?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第14题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“为什么分布式事务不是默认答案?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):最终一致性怎样做到可证明?
  • 口述答案:我会把“最终一致性怎样做到可证明?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“最终一致性怎样做到可证明?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第15题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“最终一致性怎样做到可证明?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):不停机扩容迁移的完整步骤是什么?
  • 口述答案:我会把“不停机扩容迁移的完整步骤是什么?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“不停机扩容迁移的完整步骤是什么?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第16题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“不停机扩容迁移的完整步骤是什么?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):回填与 CDC(变更数据捕获)怎样处理更新、删除和重复?
  • 口述答案:我会把“回填与 CDC(变更数据捕获)怎样处理更新、删除和重复?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“回填与 CDC(变更数据捕获)怎样处理更新、删除和重复?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第17题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“回填与 CDC(变更数据捕获)怎样处理更新、删除和重复?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):双写出现部分成功、超时和乱序如何处理?
  • 口述答案:我会把“双写出现部分成功、超时和乱序如何处理?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“双写出现部分成功、超时和乱序如何处理?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第18题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“双写出现部分成功、超时和乱序如何处理?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):影子读怎样设计,为什么不能直接返回新库结果?
  • 口述答案:我会把“影子读怎样设计,为什么不能直接返回新库结果?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“影子读怎样设计,为什么不能直接返回新库结果?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第19题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“影子读怎样设计,为什么不能直接返回新库结果?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):迁移校验为什么要做行数、校验和和业务不变量?
  • 口述答案:我会把“迁移校验为什么要做行数、校验和和业务不变量?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“迁移校验为什么要做行数、校验和和业务不变量?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第20题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“迁移校验为什么要做行数、校验和和业务不变量?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):库存迁移后怎样对账与修复差异?
  • 口述答案:我会把“库存迁移后怎样对账与修复差异?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“库存迁移后怎样对账与修复差异?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第21题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“库存迁移后怎样对账与修复差异?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):支付迁移后怎样做资金对账?
  • 口述答案:我会把“支付迁移后怎样做资金对账?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“支付迁移后怎样做资金对账?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第22题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“支付迁移后怎样做资金对账?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):怎样设计灰度切流和回滚阈值?
  • 口述答案:我会把“怎样设计灰度切流和回滚阈值?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“怎样设计灰度切流和回滚阈值?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第23题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“怎样设计灰度切流和回滚阈值?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):扩容后单桶热点为什么不能只继续加库?
  • 口述答案:我会把“扩容后单桶热点为什么不能只继续加库?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“扩容后单桶热点为什么不能只继续加库?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第24题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“扩容后单桶热点为什么不能只继续加库?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):如何控制广播 SQL(结构化查询语言)和查询退化?
  • 口述答案:我会把“如何控制广播 SQL(结构化查询语言)和查询退化?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“如何控制广播 SQL(结构化查询语言)和查询退化?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第25题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“如何控制广播 SQL(结构化查询语言)和查询退化?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):路由错配或切流后查询为空,怎样排查?
  • 口述答案:我会把“路由错配或切流后查询为空,怎样排查?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“路由错配或切流后查询为空,怎样排查?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第26题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“路由错配或切流后查询为空,怎样排查?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):怎样组织订单分片迁移上线值守?
  • 口述答案:我会把“怎样组织订单分片迁移上线值守?”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“怎样组织订单分片迁移上线值守?”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第27题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“怎样组织订单分片迁移上线值守?”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?
  1. 问题(综合题):请完整复述 WMS(仓储管理系统)库存、订单履约、支付的协作方案。
  • 口述答案:我会把“请完整复述 WMS(仓储管理系统)库存、订单履约、支付的协作方案。”先限定为数据归属、路由、约束和迁移证据共同构成的问题,而不是把分库分表当作万能答案。首先明确这个场景的权威数据在哪里、请求必须携带什么定位信息、本地事务能保护哪些记录;订单、库存、支付和履约各有自己的事实边界,跨片关系只能通过绑定表、定位索引或可靠事件协作。其次必须给出可复盘的数据演绎:按虚拟桶计算容量与写入,按业务键观察锁等待和尾延迟,或按请求号、数据版本与位点重放一次迁移链路。这样才能区分实例平均正常但单桶热点失火、数据行数相等但业务状态错误、以及位点已追平但查询语义不同三类问题。对“请完整复述 WMS(仓储管理系统)库存、订单履约、支付的协作方案。”还要主动说明失败分支:网络超时不能直接判失败,副本旧数据不能参与交易裁决,重复调用必须由幂等键拦住,双写部分成功与延迟消息必须保留补偿证据;一旦异常,先停止扩大范围,保全路由版本、日志位点和差异样本,再按权威事实做可审计重放。最后不能只以接口成功验收,要结合唯一约束、状态机、库存或资金守恒判断数据正确性,结合 P99(百分之九十九分位)、锁等待、广播率和复制延迟判断性能,结合分桶校验、影子差异和稳定窗口对账判断迁移安全。针对第28题,我还会让正常、重复、乱序和故障恢复四种输入同时通过该链路,比较最终位置、状态与流水是否一致;只有这些证据闭环,方案才具备上线、回滚和线上排障价值。任何人工修复必须留下审批、前后值、执行人、证据和二次核验记录,避免修复本身制造新差异。
  • 对应机制详解
  • 追问树
    • 若“请完整复述 WMS(仓储管理系统)库存、订单履约、支付的协作方案。”中的权威位置不可用,读写怎样降级?
    • 若出现超时、重复或乱序,哪一个幂等键和版本可判定事实?
    • 若指标异常,先按哪个桶、位点或不变量缩小影响面?