了解数据切分

3 月,跳不动了?>>> 了解数据切分

  • 何为数据(系统)切分?

    • 简单来说,就是通过某个特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。
    • 切分模式 :
      • 垂直(纵向)切分。
      • 水平切分。
  • 垂直切分

    一个数据库由多个表构成,每个表对应着不同的业务,垂直切分是按照业务将表进行分类,分布到不同的数据上面,这样也就将数据访问的压力分担到不同的多个库上。如下图:

                                    了解数据切分

          优点:

                ---- 拆分后业务清晰,拆分原则明确。

                ---- 系统之间整合或扩展容易。                               

                ---- 数据维护简单。

        缺点:

                ---- 部分业务表无法进行 JOIN 操作,只能通过接口方式解决,提高了系统的复杂度。

                ---- 受某种业务不同的限制存在单库性能瓶颈,不易于数据扩展和性能提高。

                ---- 事务处理复杂,涉及到分布式事务问题。

  • 水平切分

    相对于垂直切分来讲,水平切分不是将表表的数据做分类,而是按照某个字段的某种规则来分散到多个库中,每个库的每个表中都包含一部分数据。简单来说,我们可以将数据的水平切分理解成按照数据行进行切分,比如 1 ~ 100W 行在 database1 库中的 table 表,200W ~ 300W 行在 database2 库中的 table 表 (这是采用分库的方式),主要有分表,分库两种模式。如图:

  了解数据切分       了解数据切分

        优点 :

                ---- 不存在单库的大数据,高并发的性能瓶颈。

                ---- 对应用透明,应用端改造较少。

                ---- 按照合理的拆分规则拆分,JOIN 操作基本避免垮库。

                ---- 提高了系统的稳定性跟负载能力。

        缺点 :

                ---- 拆分规则难以抽象。

                ---- 分片事务一致性难以解决。

                ---- 数据多次扩展难度跟维护量较大。

                ---- 跨库 JOIN 性能差。

  • 切分的处理难点

    • 引入了分布式事务问题
    • 跨节点 JOIN 问题
    • 跨节点合并排序分页问题
    • 针对数据源管理目前主要有两种思路

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

      •  尽量不切分,架构是进化来的,不是一蹴而就的。
      • 最大可能的找到最合适的切分维度。
      • 由于数据库中间件对于数据的 JOIN 实现的优劣难以把握,而且实现高性能难度大,业务读取尽量少使用多表 JOIN
      • 尽量通过冗余,分组避免跨库的多表 JOIN
      • 尽量避免分布式事务
      • 单表切分数据 1000W 以内。