为什么做数据库拆分

  • 单库单表承载的容量有限
  • 索引树层级增加,IO性能下降
  • 服务的无状态性可任意扩展导致压力都落到数据库,单一的数据库节点或简单的主从可用性不高
  • 大库单库的不足
    • 无法执行DDL,比如添加一列、增加索引、都会导致长时间的数据库无响应
    • 无法备份,备份会锁表,量大了也无法执行
    • 影响稳定性和性能,主从同步延迟变高,不可控
  • 从读写分离到分库分表

    • 主从结构解决了高可用,读扩展,但没有解决容量问题,单机写的性能问题
    • 分库分表解决容量问题,多个数据库作为数据分片提供集群服务,同时也会降低单节点压力

      扩展立方体

  • 软件架构扩展模型

扩展立方体.png

数据库扩展模型

数据库扩展.png

规范模型

管理模型

  • 架构设计:TOGAF
  • 项目管理:PMP
  • 数据治理:DAMA

    数仓模型

    数仓模型.png

    垂直拆分

    淘宝拆分

    垂直拆分.png

    优缺点

  • 优点

    • 单库单表变小,便于管理和维护
    • 对性能和容量有提升
    • 改造后,系统和数据复杂度降低
    • 可作为微服务改造的基础
  • 缺点

    • 库变多,管理变复杂
    • 对业务系统有较强的侵入性
    • 改造过程复杂,容易出故障
    • 拆分到一定程度就无法继续拆分

      一般步骤

  • 梳理清楚拆分范围和影响范围

  • 检查评估和重构影响到的服务
  • 准备新的数据库集群复制数据
  • 修改系统配置并发布新版上线

垂直拆分.png

水平拆分

分类

  • 分库
  • 分表
  • 分库分表

水平拆分.png

优缺点

  • 优点
    • 解决容量问题
    • 比垂直拆分对系统影响小
    • 部分提升性能和稳定性
  • 缺点

    • 集群规模大,管理复杂
    • 复杂SQL支持问题(业务侵入性,性能)
    • 数据迁移问题
    • 一致性问题
      • 解决思路要使用相同的路由规则保证主表和子表尽量在同一个数据库中

        一般步骤

  • 直接对数据进行分片,有分库、分表两种方式,都是降低单节点容量,不改变数据本身结构,也就不会对业务系统做特别大的改动,甚至可以基于一些中间件做到透明

  • 常用模式

    • 按主键分库分表,通常是取模处理,分配到不同的库、不同的表,改造后查询时都需要指定哪个库哪个表
    • 按时间分库分表
    • 自定义算法

      相关框架和中间件

      选择

  • 一般情况下,如果数据库本身的读写压力比较大,磁盘IO是瓶颈,则优先考虑分库,并行提升IO性能

  • 相反情况下,考虑分表,降低单表的数据量,从而减少单表操作的时间
  • 有些中间件只支持分库,不支持分表,DBA也建议分库,不建议分表
  • 原因

    • 分库才解决容量和IO的问题
    • 分库可以代替分表

      数据分类

  • 热数据:查询比较频繁的,需要放到数据库和内存

  • 温数据:放到数据库,提供正常的查询操作
  • 冷数据:归档到磁盘,用户需要提交工单或邮件来查询,导出后发回
  • 冰数据:备份到磁带,不提供任何查询操作

    Java框架

  • TDDL

  • ApacheShardingSphere-JDBC

    中间件

  • ApacheShardingSphere-Proxy

  • MyCat
  • 优势

    • 业务系统无侵入
    • 不限定上层框架

      分布式数据库

  • OceanBase

  • PolarDB

    数据网格

  • ShardingSphere-Sidecar

    如何做数据迁移

    最重要也最容易出故障的一环

  • 设计新系统容易,但是我们处理的都是老系统和历史诗句

  • 平滑的迁移旧数据到新的数据库和系统
  • 达到数据准确、速度快、对业务影响小

    方式1:全量

  • 全量数据导出和导入

    • 业务系统停机
    • 数据库迁移,导入新库时可以先把索引、约束等去除,只导入数据,然后再加索引和约束,提高效率
    • 校验一致性(库、表、记录行)
    • 然后业务系统升级,接入新数据库
    • 直接复制的话,可以dump后全量导入
    • 如果是异构数据,需要用程序来处理
  • 优点:简单
  • 不足:需要停机

    方式2:全量+增量

  • 依赖于数据本身的时间戳

    • 先同步数据到最近的某个时间戳
    • 然后在发布升级时停机维护
    • 再同步最后一段事件(通常是一天)的变化数据
    • 最后升级业务系统,接入新数据库
  • 优点:降低停机时间

    方式3:binlog+全量+增量(推荐)

  • 通过主库或从库的binlog来解析和重新构造数据,利用主从复制实现扩展迁移

  • 一般需要中间件工具的支持
  • 可以实现多线程,断点续传,全量历史和增量数据同步
  • 继而可以做到

    • 实现自定义复杂异构数据结构
    • 实现自动扩容和缩容,比如分库分表到单库单表,单库单表到分库分表,分4个库表到分64个库表

      方式4:shardingSphere-scaling

  • 支持数据全量和增量同步

  • 支持断点续传和多线程数据同步
  • 支持数据库异构复制和动态扩容
  • 具有UI界面,可视化配置