1. 读写分离的原理与挑战?

🎯 面试要点

  • 读写分离解决的是读扩展,不解决写瓶颈和单库容量
  • 实现层:MyBatis 拦截器按方法名(select→从库)或注解 @ReadOnly 路由
  • Spring 的 AbstractRoutingDataSource 是应用层路由的经典实现

2. 什么时候需要分库分表?怎么分?

评估信号:单表数据量千万~亿级、单库写入吞吐瓶颈、连接数/IO 压力大。先考虑:索引优化、归档冷数据、缓存扛读——最后才是分库分表(成本极高)。

分法:

分片键的选择(重要)
// 分片键必须是高频查询条件,否则查询要广播所有分片
// 订单表按 user_id 分片:查"我的订单"单片命中 ✓;
// 但按 order_id 精确查 → 不知道在哪个片 → 广播查询 ✗
// 解决:把分片键编码进业务 ID(这叫「基因法」,需要自定义位分配)
// 标准雪花算法 = 1 符号位 + 41 时间戳 + 5 数据中心 + 5 机器 + 12 序列,本身不含 user_id 位
// 或用基因法:order_id 由 user_id 哈希 + 自增拼接,携带分片信息

🎯 面试要点

  • 分片带来的问题:跨片事务(分布式事务)、跨片 join(冗余/应用层组装)、全局唯一 id(雪花算法/号段模式)、扩容迁移
  • 中间件选型:ShardingSphere(应用内/代理两种模式)、MyCat;或自研路由层
  • 迁移方案:双写 + 全量对账 + 灰度切换(详见下节)

3. 分库分表的平滑迁移方案?

  1. 双写:应用同时写老库和新分片库(新库失败不影响主流程,先记录补偿)
  2. 历史数据迁移:工具/脚本按 id 分批把老数据迁到新分片(binlog 追平或直接全量)
  3. 对账:抽样比对老库/新库数据一致性,补差异
  4. 灰度切换读:读流量按比例切到新库(10% → 50% → 100%),观察延迟和错误
  5. 切换写:确认稳定后切换写流量,老库保留只读一段时间兜底

🎯 面试要点

  • 任何存储迁移的核心套路都是:双写 → 追平 → 对账 → 灰度 → 切换 → 兜底回退
  • 迁移工具:canal(binlog 增量同步)是业界标配

4. MySQL 高可用方案有哪些?

数据不丢的关键:binlog 必须完整同步到从库才返回提交成功(半同步/强同步),否则主挂 = 丢数据。因此高可用与数据安全是两件事:前者保证服务不中断,后者保证数据不丢。

🎯 面试要点

  • 衡量指标:RPO(最多丢多少数据)、RTO(恢复多久)——面试讲方案先讲这两个目标
  • 一主多从 + 从库备份:备份要放异地/跨机架,防止机房级故障
  • 定期演练故障切换,别让方案只存在于文档

🎤 常见面试追问

  1. 什么时候才需要分库分表?——先试:索引优化、冷数据归档、缓存扛读。还不行再分(成本极高):单表千万~亿级、写入瓶颈、连接/IO 压力大。
  2. 分片键怎么选?——必须是高频查询条件(如 user_id 分片,查"我的订单"单片命中);order_id 查不到在哪片会广播。解决:order_id 里编码分片信息(基因法)。
  3. 分库分表带来哪些新问题?——跨片事务(分布式事务)、跨片 join(应用层组装/冗余)、全局唯一 ID(雪花算法)、扩容迁移(双写+对账+灰度)。
  4. 读写分离的坑是什么?——主从延迟:刚写入主库立刻读从库可能读不到。解决:强一致请求走主库、半同步复制、延迟补偿。
  5. 平滑迁移的步骤?——双写 → 历史数据迁移(binlog 追平)→ 数据对账 → 灰度切读(10%→50%→100%)→ 切写 → 老库只读兜底。canal 是增量同步标配。

📖 名词解释(本页术语)

术语 大白话解释
读写分离主库写、从库读(binlog 同步),解决"读"的压力。注意主从延迟。
垂直分库按业务拆库(订单库/用户库/商品库),解决单库压力。
水平分表同一张表按分片键拆成多张(user_0/user_1…),解决单表数据量。
分片键(Shard Key)决定数据去哪个分片的字段,必须是高频查询条件。
一致性哈希哈希环分片:节点增减只影响少量 key(比取模扩容友好)。
雪花算法分布式全局唯一 ID 生成:时间戳 + 机器号 + 序列号,趋势递增。
双写迁移期同时写老库和新库,保证两边都有数据,再逐步切换。
canal阿里巴巴开源工具:伪装成从库监听 binlog,把数据库变更同步到其他地方(新库/缓存/ES)。
MHA / MGRMySQL 高可用方案:MHA 是经典自动故障转移工具(已停止维护);MGR 是官方组复制(Paxos,默认单主,可配置一致性级别)。
RPO / RTO容灾指标:RPO = 最多丢多少数据;RTO = 多久恢复。方案先定这两个目标。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。