了解数据切分
-
何为数据(系统)切分?
- 简单来说,就是通过某个特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。
- 切分模式 :
- 垂直(纵向)切分。
- 水平切分。
-
垂直切分
一个数据库由多个表构成,每个表对应着不同的业务,垂直切分是按照业务将表进行分类,分布到不同的数据上面,这样也就将数据访问的压力分担到不同的多个库上。如下图:
优点:
---- 拆分后业务清晰,拆分原则明确。
---- 系统之间整合或扩展容易。
---- 数据维护简单。
缺点:
---- 部分业务表无法进行 JOIN 操作,只能通过接口方式解决,提高了系统的复杂度。
---- 受某种业务不同的限制存在单库性能瓶颈,不易于数据扩展和性能提高。
---- 事务处理复杂,涉及到分布式事务问题。
-
水平切分
相对于垂直切分来讲,水平切分不是将表表的数据做分类,而是按照某个字段的某种规则来分散到多个库中,每个库的每个表中都包含一部分数据。简单来说,我们可以将数据的水平切分理解成按照数据行进行切分,比如 1 ~ 100W 行在 database1 库中的 table 表,200W ~ 300W 行在 database2 库中的 table 表 (这是采用分库的方式),主要有分表,分库两种模式。如图:
优点 :
---- 不存在单库的大数据,高并发的性能瓶颈。
---- 对应用透明,应用端改造较少。
---- 按照合理的拆分规则拆分,JOIN 操作基本避免垮库。
---- 提高了系统的稳定性跟负载能力。
缺点 :
---- 拆分规则难以抽象。
---- 分片事务一致性难以解决。
---- 数据多次扩展难度跟维护量较大。
---- 跨库 JOIN 性能差。
-
切分的处理难点
- 引入了分布式事务问题
- 跨节点 JOIN 问题
- 跨节点合并排序分页问题
-
针对数据源管理目前主要有两种思路
- 客户端模式,在每个应用中配置管理自己需要的一个或多个数据源,直接访问指定的各个数据库,在应用内完成数据的整合。
- 优点:相对简单,无性能损耗。
- 缺点 :不够通用,数据库连接的处理复杂,对业务不透明,处理复杂。
- 通过中间代理层来统一管理所有的数据源,后端数据库集群对应用透明
- 优点 : 通用,对应用透明,改造少。
- 缺点 : 实现难度大,既然是代理就有二次转发的性能损失。
- 客户端模式,在每个应用中配置管理自己需要的一个或多个数据源,直接访问指定的各个数据库,在应用内完成数据的整合。
-
切分原则
- 尽量不切分,架构是进化来的,不是一蹴而就的。
- 最大可能的找到最合适的切分维度。
- 由于数据库中间件对于数据的 JOIN 实现的优劣难以把握,而且实现高性能难度大,业务读取尽量少使用多表 JOIN
- 尽量通过冗余,分组避免跨库的多表 JOIN
- 尽量避免分布式事务
- 单表切分数据 1000W 以内。