推荐阅读: mysql分库分表那些事
一、单一数据库的局限
- 性能: 由于关系型数据库大多采用 B+ 树类型的索引,在数据量超过阈值的情况下,索引深度的增加也将使得磁盘访问的 IO 次数增加,进而导致查询性能的下降
同时,高并发访问请求也使得集中式数据库成为系统的最大瓶颈
- 可用性: 服务化的无状态型,能够达到较小成本的随意扩容,这必然导致系统的最终压力都落在数据库之上。而单一的数据节点,或者简单的主从架构,已经越来越难以承担。数据库的可用性,已成为整个系统的关键
- 运维成本: 当一个数据库实例中的数据达到阈值以上,对于 DBA 的运维压力就会增大,数据备份和恢复的时间成本都将随着数据量的大小而愈发不可控
一般来讲,单一数据库实例的数据的阈值在 1TB 之内,是比较合理的范围
- 为什么不选择 NoSQL: NoSQL 对 SQL 的不兼容性以及生态圈的不完善
二、分库分表
1. 简介
数据分片: 指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果
数据分片的有效手段是对关系型数据库进行分库和分表
分库和分表可以避免由数据量超过可承受阈值而产生的查询瓶颈:
- 分库能够用于有效的分散对数据库单点的访问量
- 分表能够尽量将分布式事务转化为本地事务 ?
注意: 分表无法缓解数据库压力
- 使用多主多从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性
数据分片的拆分方式又分为垂直分片和水平分片
1. 垂直分片
- 垂直分片: 按照业务拆分的方式称为,核心理念是专库专用
- 拆分前,一个数据库由多个数据表构成,每个表对应着不同的业务
- 拆分后,按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库
垂直分片需要对架构和设计进行调整,来不及应对互联网业务需求快速变化,并且无法真正的解决单点瓶颈
垂直拆分的优点:
- 库表职责单一,复杂度降低,易于维护。
- 单库或单表压力降低。 相互之间的影响也会降低。
垂直拆分的缺点:
- 部分表关联无法在数据库级别完成,需要在程序中完成。
- 单表大数据量仍然存在性能瓶颈。
单表或单库高热点访问依旧对 DB 压力非常大。
事务处理相对更为复杂,需要分布式事务的介入。
拆分达到一定程度之后,扩展性会遇到限制
2. 水平分片
- 水平分片: 不再将数据根据业务逻辑分类,而是通过某个字段,根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分
例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表)
水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案
水平拆分的优点:
- 解决单表单库大数据量和高热点访问性能遇到瓶颈的问题
- 应用程序端整体架构改动相对较少
- 事务处理相对简单
- 只要切分规则能够定义好,基本上较难遇到扩展性限制
水平拆分缺点:
- 拆分规则相对更复杂,很难抽象出一个能够满足整个数据库的切分规则
- 后期数据的维护难度有所增加,人为手工定位数据更困难
- 产品逻辑将变复杂。比如按年来进行历史数据归档拆分,这个时候在页面设计上就需要约束用户必须要先选择年,然后才能进行查询