MySQL 分库分表的方式

对于分库分表来说,具体有两种方式:垂直拆分和水平拆分
垂直拆分主要是业务的细化和独立,和业务联系比较密切。所以本文只讨论更通用的水平拆分。

为什么分库分表

  1. 降低单机 MySQL 的性能
  2. 降低单表或者单库的数据量,减少数据库的查询压力
  3. 突破单机的容量限制

    分库分表的方式

  4. 范围区分(range):按月\按区\按其他的等特殊的属性维度进行分片
  5. 预定义范围:预估有多少数据的容量,对数据进行范围的分配,0-100->A 101-200->B
  6. 取模 Hash:对指定的字段进行取模运算,匹配对应的库和表。

分库分表带来的问题

  1. 数据的维护成本高
  2. 跨库的业务join
  3. 分布式事务的性能低下
  4. 自增 id 的生成问题
  5. 非分片字段查询的轮询的浪费
  6. 多节点排序问题

分库分表的中间件

对于分库分表的中间件有很多,Shardingsphere,Tddl,MyCat,cobar。从架构上分,主要分为两种:JDBC应用方式Proxy模式

JDBC应用模式是基于客户端的分片,有客户端根据Sql和规则,决定具体执行的 sql 的服务器。代表有Shardingsphere,Tddl

image-20200919120019296

JDBC应用模式 优点:

  1. 性能好
  2. 支持跨数据库(mysql oralce mssq)

缺点:

  1. 不能跨语言
  2. 对开发不够友好,增加开发难度

Proxy模式 代理模式是基于 MySQL 做一层转发代理,有代理根据规则来分发具体的SQL 到服务器上。

image-20200919120231986

优点:

  1. 跨语言
  2. 开发无感知

缺点:

  1. 性能比较差,增加了网络请求
  2. 不支持跨数据库