数据库拆分

2019 年 2 月 24 日 性能与架构

随着数据的增加,数据库的压力越来越大,通常就会进行数据库拆分。

分库,按照业务维度进行拆分,可以解决多个表之间的 IO 竞争、单机容量问题。

分表,对单表数据进行拆分,解决容量、磁盘/带宽 IO 压力。

什么时候拆分?

数据库拆分可以带来好处,例如:

  1. 便于水平扩容。

  2. 提升查询性能,因为某些查询如果在单一的巨型表中可能需要扫描的行数很多,而在分表中查询所涉及的行很少。

  3. 提升可用性,因为如果是单一的库,出现问题时会影响整个应用,而拆分后某块儿出现问题不会影响整体。

但拆分也会带来一些坏处,例如:

  1. 增加了开发、维度的复杂度。

  2. 拆分后数据库原本支持的一些功能就不可用了,例如 join、事务,后面还会细说。

所以,拆分要慎重,需要拆分的场景通常有以下几个:

  • 数据的增长超出了单库存储能力。

  • 数据读写的量太大,超出了单节点或者主从结构的掌控能力,导致响应时间变慢。

  • 网络带宽压力过大,导致数据返回过慢,甚至超时。

数据拆分方式

(1)基于 key

对指定的key进行hash计算,得到一个数字,这个值就是所在的分片。

这种方式很常用,无需维护数据与分片的映射关系,而且分布较为均匀,没有热点问题,不便之处在于服务器的增减场景,那时就需要重新计算来分配已有数据了。

(2)基于值范围

例如某列是数值形式(如价格),那么就可以按值的范围划分。

这种方式实现非常简单,但极有可能出现热点问题,数据集中在某个分片中,导致各服务器操作失衡。

(3)字典方式

创建维护一个数据字典表,根据指定的key到字典表中查看其在哪个分片上。

这种方式最大的好处是 灵活,可以随意指定数据位置,动态增减服务器也很方便。缺点就是总需要查询字典表,是一个性能瓶颈,而且存在单点风险。

拆分带来哪些问题?

下面是数据库拆分后的主要问题及解决思路:

1. 自增ID问题

可以通过不同表、不同自增步长、分布式ID生成器来解决。

2. 跨库/跨表 join 和排序分页问题

可以对所有表扫描后聚合,或者生成全局表,或者进行查询维度的数据异构,或者数据同步到 ES 搜索。

3. 分布式事务问题

可以考虑事务表、补偿机制、TCC模式(尝试/确认/取消)、Sagas 模式(拆分事务+补偿机制)等方式,业务尽量使用最终一致性,而不是强一致性。

对于一些问题,我们可以考虑 NoSQL 数据库,与关系数据库互补来解决问题。

点击👇阅读原文,查看文章列表

登录查看更多
0

相关内容

当数据库比较庞大,读写操作特别是写入操作过于频繁,很难由一台服务器支撑的时候,我们就要考虑进行数据库的切分。所谓数据库的切分,就是我们按照某些特定的条件,将一台数据库上的数据分散到多台数据库服务器上。因为使用多台服务器,所以当一台服务器宕机后,整个系统只有部分数据不可用,而不是全部不可用。因此,数据库拆分不仅能够用多台服务器分担数据库的负载压力,还可以提高系统的总体可用性。
【MIT-ICML2020】图神经网络的泛化与表示的局限
专知会员服务
42+阅读 · 2020年6月23日
注意力图神经网络的多标签文本分类
专知会员服务
111+阅读 · 2020年3月28日
腾讯推荐引擎组员工:谈谈推荐系统架构
腾讯大讲堂
14+阅读 · 2019年10月23日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
数据库之架构:主备+分库?主从+读写分离?
架构文摘
8+阅读 · 2019年4月23日
亿级订单数据的访问与储存,怎么实现与优化
ImportNew
11+阅读 · 2019年4月22日
每个架构师都应该培养业务思维
InfoQ
3+阅读 · 2019年4月21日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
使用 Canal 实现数据异构
性能与架构
20+阅读 · 2019年3月4日
谷歌Jeff Dean团队发文,探讨「学习模型」如何替代传统索引结构
北京思腾合力科技有限公司
5+阅读 · 2017年12月15日
Spark的误解-不仅Spark是内存计算,Hadoop也是内存计算
Area Attention
Arxiv
5+阅读 · 2019年5月23日
Logically-Constrained Reinforcement Learning
Arxiv
3+阅读 · 2018年12月6日
Arxiv
5+阅读 · 2018年3月28日
VIP会员
相关资讯
腾讯推荐引擎组员工:谈谈推荐系统架构
腾讯大讲堂
14+阅读 · 2019年10月23日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
数据库之架构:主备+分库?主从+读写分离?
架构文摘
8+阅读 · 2019年4月23日
亿级订单数据的访问与储存,怎么实现与优化
ImportNew
11+阅读 · 2019年4月22日
每个架构师都应该培养业务思维
InfoQ
3+阅读 · 2019年4月21日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
使用 Canal 实现数据异构
性能与架构
20+阅读 · 2019年3月4日
谷歌Jeff Dean团队发文,探讨「学习模型」如何替代传统索引结构
北京思腾合力科技有限公司
5+阅读 · 2017年12月15日
Spark的误解-不仅Spark是内存计算,Hadoop也是内存计算
Top
微信扫码咨询专知VIP会员