大厂都是如何分库分表的?

大厂都是如何分库分表的?
最新回答
青山一叙

2021-04-22 07:41:35

大厂分库分表主要通过垂直切分和水平切分两种方式实现,结合数据定位策略和中间件工具解决数据分布与查询问题。具体如下:

一、分库分表的核心目的

当单表数据量超过千万级别时,即使优化索引和添加从库,数据库性能仍会显著下降。分库分表通过将数据分散到多个数据库中,减少单库单表的数据量,从而提升数据库的响应速度和整体性能。

二、分库分表的具体方式1. 垂直切分

垂直切分分为垂直分库和垂直分表两种:

  • 垂直分库

    依据:按照业务分类进行划分,每个业务拥有独立的数据库。

    示例:电商系统中,用户库、订单库、商品库等分别独立存储。

    优点:业务间解耦,便于独立维护、监控和扩展;高并发场景下缓解数据库压力。

    缺点:开发复杂度增加,需通过接口聚合数据;分布式事务管理难度提升;未解决单表数据量过大的问题,需配合水平切分。

  • 垂直分表

    依据:以数据表的列为依据进行切分,将大表拆分为小表。

    示例:将order表中访问不频繁的长字段(如describe)拆分到work_extend表。

    优点:核心表字段访问频率高且长度短,可加载更多数据到内存,减少磁盘IO,提升性能。

    缺点:同垂直分库,需配合水平切分解决单表数据量问题。

2. 水平切分

当垂直切分无法解决单表数据量过大时,需配合水平切分:

  • 定义:将一张大数据量的表切分为多个结构相同的表,每个表存储部分数据,并分散到不同数据库中。

    示例:2000万数据的order表切分为order_1、order_2、order_3、order_4,每表500万数据。

  • 分类

    库内分表:子表在同一数据库实例中,解决单表数据量问题,但未分布到不同物理机,仍竞争资源。

    分库分表:子表分散到不同数据库,实现分布式效果。

  • 优点:解决高并发下单库数据量过大问题,提升系统稳定性和负载能力;业务系统改造工作量较小。
  • 缺点:跨分片事务一致性难保证;跨库join查询性能差;扩容和维护难度大。
三、数据定位策略

分库分表后,需解决数据存储位置问题,常见策略包括:

1. 按取值范围切分
  • 依据:按时间区间或ID区间切分。

    示例:用户表按userId范围切分,第一个库存1~9999,第二个库存10000~20000,依此类推。

  • 优点:单表数据量可控;水平扩展简单,无需迁移数据;能快速定位查询数据所在库。
  • 缺点:连续分片可能导致数据热点,如按时间字段分片时,近期数据被频繁读写,历史数据查询少。
2. Hash取模切分
  • 依据:对关键字段(如userId)进行hash取模,确定数据存储库。

    示例:对userId取模,余数为0存第一个库,余数为1存第二个库,依此类推。

  • 优点:数据分片均匀,不易出现某库并发访问过高问题。
  • 缺点:当某机器宕机时,需重新计算hash值(如从mod N变为mod N-1),可能导致用户数据不在同一库中。
四、分库分表后的常见问题及解决方案1. 事务一致性问题
  • 问题:跨库事务难以保证一致性。
  • 解决方案

    使用XA协议和两阶段提交,但性能较差且开发量大。

    采用最终一致性方案,如事务补偿机制,允许在一段时间内达到最终一致。

2. 分页与排序问题
  • 问题:多库查询时,limit分页和order by排序复杂。
  • 解决方案

    若排序字段是分片字段,通过分片规则定位数据。

    若排序字段非分片字段,需在各分片节点排序后汇总结果,再二次排序返回。

3. 全局唯一主键问题
  • 问题:分库分表后,某库的自增主键无法保证全局唯一。
  • 解决方案:引入分布式ID生成系统,如雪花算法、UUID等,确保ID全局唯一。
五、分库分表工具

大厂通常使用成熟的中间件实现分库分表,减少开发工作量,常见工具包括:

  • Sharding-JDBC(当当)
  • TSharding(蘑菇街)
  • Atlas(奇虎360)
  • Cobar(阿里巴巴)
  • MyCAT(基于Cobar)
  • Oceanus(58同城)
  • Vitess(谷歌)

这些工具提供了数据分片、路由、事务管理等功能,帮助开发者高效实现分库分表。