数据库拆分实现业务线性能力扩展

在业务达到一定规模后,由于数据库是中心架构的,一个设计糟糕的数据库将会给业务带来非常严重的灾难,这方面阿里提出了很多宝贵的经验和方法论。

阿里数据库的分布式方案

  1. 垂直拆分:根据不同的业务以高内聚、低耦合的原则,将数据拆分到不同的数据库中
  2. 读写分离:垂直拆分后有些服务的请求量依然很大,我们首先想到的是读/写分离,因为往往业务场景决定这读远远大于写,这时候进行读写分离可以有效降低写的压力,且从库可以追加多个
  3. 分库分表:读写分离无法解决单表写的性能问题,以及单表数据量大的问题,针对这个问题我们可以采用水平分库/表的方案,根绝业务特点对表、库进行水平拆分,分表可以减小单表数据量,分库可以减少单库连接数的上线,从而满足业务的需求。

阿里开发了TDDL,作为数据库的拆分方案,特点是:全面支持jdbc,对业务无侵入。

  1. matrix:根据业务配置分表规则针对sql语句进行解析,选择需要执行的groupDS
  2. groupDS:负责读写分离,以及根据权重选择atomDS;
  3. atomDs:持有数据库的原子链接;

数据库分表的原则

  1. 数据尽量均匀:防止数据倾斜;
  2. 减少事务边界:尽量减少违反分表分库规则的事务,否则需要进行全表扫描,因为需要在内存中进行聚合,就会降低系统性能,且系统的性能指标就降为单库的指标。
  3. 异构索引表来满足跨表查询的场景;
  4. 提供其他搜索方案来解决复杂的查询、搜索场景;

    其中异构索引表,大部分小企业可以采用业务来解决,阿里提供了精卫系统在系统层面来解决数据同步需求:

  5. 原理是消费binlog,通过配置进行过滤,同步;

  6. 支持多线程同时同步,为了保证数据在并发情况的一致性,同一条语句根据规则打到同一个线程执行;
  7. 强大的UI工具支持;
  8. 数据的安全性:

    1. 采用zookeeper做调度、管控;
    2. 手动主从切换、宕机回复;

    PS:

    数据库分表分数据遇到了”数据均匀”,”减少事务边界”这两种情况冲突的情况,应该优先解决数据均匀的问题,因为减少事务边界可以采用异构索引表的方式解决。

    实际开发中我们采用82原则,针对80%的情况下有20%的场景出现没有分表字段的情况,采用异构索引的方式处理,其他小概率的查询我们可以全表扫描等方案。