0%

DBMS-Subtable-Strategy

阅读更多

1 前言

当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了

数据库拆分简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。

切分模式:垂直(纵向)拆分、水平拆分

2 垂直拆分

一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面(注意,并不是将一张表拆分成多张表,这叫做数据表的垂直拆分),这样也就将数据或者说压力分担到不同的库上面,如下图:

fig1

优点:

  1. 拆分后业务清晰,拆分规则明确
  2. 系统之间整合或扩展容易
  3. 数据维护简单

缺点:

  1. 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度
  2. 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高
  3. 事务处理复杂

3 水平拆分

垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。

相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,主要有分表,分库两种模式,如图:

fig2

fig3

优点:

  1. 不存在单库大数据,高并发的性能瓶颈
  2. 对应用透明,应用端改造较少
  3. 按照合理拆分规则拆分,join操作基本避免跨库
  4. 提高了系统的稳定性跟负载能力

缺点:

  1. 拆分规则难以抽象
  2. 分片事务一致性难以解决
  3. 数据多次扩展难度跟维护量极大
  4. 跨库join性能较差

4 如何拆分

两张方式共同缺点:

  1. 引入分布式事务的问题
  2. 跨节点Join的问题
  3. 跨节点合并排序分页问题

针对数据源管理,目前主要有两种思路:

  1. 客户端模式,在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个 数据库,在模块内完成数据的整合
    • 优点:相对简单,无性能损耗
    • 缺点:不够通用,数据库连接的处理复杂,对业务不够透明,处理复杂
  2. 通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明
    • 优点:通用,对应用透明,改造少
    • 缺点:实现难度大,有二次转发性能损失

拆分原则:

  1. 尽量不拆分,架构是进化而来,不是一蹴而就。(SOA)
  2. 最大可能的找到最合适的切分维度
  3. 由于数据库中间件对数据Join实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表Join-尽量通过数据冗余,分组避免数据垮库多表join
  4. 尽量避免分布式事务
  5. 单表拆分到数据1000万以内

切分方案:

  1. 范围
  2. 枚举
  3. 时间
  4. 取模
  5. 哈希
  6. 指定

5 参考