面试知识库

读写分离 → 分库分表 → 分布式ID 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. 扩展三段式:读写分离(读扩展)→垂直拆分(按业务解耦)→水平分库分表(写扩展+突破单机容量)
  2. 主从延迟应对:并行复制+半同步复制降低延迟,强一致读(刚写完就读)直接走主库或缓存
  3. 分片键是核心决策:要高频查询+分布均匀;hash均匀但扩容迁移多,一致性哈希/翻倍扩容缓解迁移
  4. 分片后的代价:跨片查询/分页/join变难(靠冗余字段、ES、宽表绕开),本地事务失效要上分布式事务
  5. 分布式ID三要求:全局唯一、趋势递增(对B+树主键友好)、高性能;雪花要处理时钟回拨,号段模式更稳
  6. 代码示例
    // 雪花算法64位结构
    | 1bit 符号(恒0) | 41bit 毫秒时间戳 | 10bit 机器ID | 12bit 序列号 |
    //  41位时间戳可用约69年,10位支持1024台机器,12位每毫秒每机4096个ID
    //  时钟回拨处理:回拨小则等待追上,回拨大则抛异常或切用备用机器位
    plaintext

面试回答串联#

30秒速答#

“扩展顺序一般是读写分离→垂直拆分→水平分库分表。读写分离靠主从复制,延迟用并行/半同步复制缓解、强一致读走主库。水平分表要选分布均匀的分片键,跨片查询和分页靠冗余字段或ES解决,扩容用翻倍+一致性哈希减少迁移。分表后主键用分布式ID,雪花算法64位带时间戳保证趋势递增,但要处理时钟回拨,更稳的是号段模式。“

2分钟展开答#

“数据库扩展通常分三步走。第一步读写分离,主库负责写、从库负责读,靠主从复制同步——主库写binlog,从库IO线程拉过来写relay log,再由SQL线程重放。主从延迟是核心问题,可以用并行复制、半同步复制降低,对刚写完立刻要读的强一致场景直接走主库或读缓存。第二步如果写还是瓶颈或单表太大就分库分表,垂直拆分是按业务把表拆到不同库、把大字段拆出去,水平拆分是按规则把一张表的数据分散到多张表多个库。分片键的选择是最关键的决策,要选高频查询且分布均匀的字段比如user_id,分片算法range好扩容但容易热点、hash均匀但扩容要迁移数据、一致性哈希能减少迁移量。分片后最大的痛点是跨片查询和分页,深分页基本要禁掉,多维查询用ES或者做冗余宽表,join靠冗余字段避免。扩容比如从8片到16片用翻倍扩容配合双写迁移:新老库同时写、数据校验、灰度切读、最后下线老库。分库后跨库本地事务用不了,要上Seata或事务消息。分表之后单库自增主键会冲突,需要分布式ID,要求全局唯一、趋势递增(对B+树主键插入友好)、高性能。雪花算法是64位:1位符号、41位毫秒时间戳、10位机器ID、12位序列号,问题是依赖时钟、回拨会重复,小回拨等待、大回拨抛异常或切备用位。比雪花更稳的是号段模式比如美团Leaf,从DB批量取一段ID缓存在内存发,减少DB压力又不依赖时钟。“

相关追问链#