← 每日面试题 学习看板

什么是数据倾斜,会带来哪些问题?如何解决?

面试题/03数据库中间件/04分库分表/什么是数据倾斜,会带来哪些问题?如何解决?.md

面试记录 2026-09-23

题目:什么是数据倾斜,会带来哪些问题?如何解决?

难度:low

标签:db/sharding, general/knowledge, difficulty/low

评分:⭐⭐⭐☆☆(3/5)

我的回答

数据倾斜一般是在分库分表之后产生的一个衍生问题。由于我们分表了,把所有的数据分散到不同的表中。这时候如果大量的数据只插入到分表后的某一个表,而在其他的表中,数据量差异比较大,数量比较少,就造成了数据倾斜。大量的数据其实还在一个数据库表中,这时候我们分表的意义就会有些得不偿失,它并没有解决原本的想要把数据拆分成多份,可以更好的提升数据访问的作用,因为大量数据还是集中在一个表中,这时候要考虑我们选择的分表方式是否存在问题。比如如果选择的是哈希,是否是因为数据量哈希的这个值有问题?然后如果是选择的时间,是否是在这个时间区间内,数据有激增增长,是否要调整这个时间区间的范围?解决数据倾斜基本上是考虑调整数据的划分方式,修改数据插入到数据库表中的方式来实现处理数据倾斜的问题。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:能否识别分库分表引入的次生问题,并给出可落地的治理手段。

知识点拆解:

  1. 倾斜的两类本质:
  1. 常见成因:
  1. 业务影响:
  1. 治理手段:
  1. 典型场景案例:
  1. 与缓存倾斜、K8s Pod 倾斜、HDFS 数据倾斜的对比:底层原理一致,都是"分片维度选错导致负载不均"

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 一致性哈希如何解决数据倾斜?扩容时负载会如何变化?
  1. 线上如何主动发现数据倾斜?需要哪些监控指标?
  1. 已经倾斜了如何在线治理?不停服如何迁移?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,数据倾斜是分库分表最容易踩的坑,本质是"数据本该均匀分布,但实际集中在少数分片"。

我一般会把它分成两类来看。第一类是数据量倾斜,就是存储层面不均,热点分片磁盘可能 90% 满,其他分片才 10%。第二类是访问倾斜,就是 QPS 不均,热点 key 或大卖家把所有请求都打到同一个分片。第二类在实际项目里更常见也更难,因为它是运行时才暴露的。

成因通常就几种:

  1. 分片键选错了。比如订单表按创建时间分片,但 80% 流量都在最近 3 个月——所有新订单都在同一个时间片,历史订单基本没人查。
  2. 分片键值域分布天然不均。比如按 user_id 分片,但业务里存在大客户,某个大卖家的数据量等于 10 万个小卖家总和。
  3. 扩容后没做重平衡。普通哈希扩容到 N+1,几乎所有 key 都要重映射,负载不但不均还引发流量抖动。

治理上我分三个阶段:

事前:选分片键有三个标准——分布均匀、主查询命中、业务上不可变(一旦变了数据搬家很痛)。比如订单表我一般会选 buyer_id 而不是 order_id,因为买家查询是主路径,且买家 ID 用雪花算法生成天然均匀。

事中:监控必须做。我们一般用 Prometheus 抓每个分片的行数、磁盘水位、QPS、TPS、连接数,看各分片的方差和 P99/均值比。超过 3 倍就告警。

事后:如果已经倾斜了,看情况分两种处理。数据量倾斜可以走"双写 + 回补 + 灰度切流 + 反向校验",把热点分片的数据迁一部分到新分片,业务无感;访问倾斜可以先用热点缓存兜住 QPS,再判断要不要真的迁数据。大卖家/明星这种特殊账号,我们会单独识别,走独立分片或者广播表,不跟普通用户混在一起。

还有一个关键点:一致性哈希加虚拟节点是应对扩容倾斜的通用方案,普通哈希扩容一次就要重映射大部分数据,一致性哈希只影响 1/N,虚拟节点能让负载进一步均匀。我们在 ShardingSphere 里就是用的这个方案。

最后提一句,倾斜不只是分库分表的问题。Kafka 消费倾斜、HDFS 数据倾斜、Redis 大 Key、K8s Pod 调度不均,底层都是"分片维度选错导致负载不均",方法论是相通的。