目前大多互联网 公司 数据,随着时间流逝,单实例数据没办法支撑 海量数据的读写。
拆分规则: 垂直和水平。
1. 垂直拆分: 降低业务耦合度,可以将不同业务模块所使用表分拆到不同库中,根据不同类型表来进行拆分,对应用程序影响也更小。
2. 水平拆分: 分为库内分表和分库。水平拆分是根据垂直拆分出来的块进行的再次拆分,而不是针对所有表进行的。另一方面,一些负载较高的系统,即使仅仅只是单个表都无法通过单台数据库主机来支持其负载,意味着需要将垂直和水平拆分联合使用。针对热点数据选着性做水平切分。将整个数据库切分整一个分布式矩阵。
3. 水平拆分所引起的问题:
a1. 事物问题
一. 使用分布式事务
优点: 交由数据库管理,简单。
缺点: 当shard越来越多时,性能代价高。
二 由程序和数据库共同控制
原理:将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的 小事务,并通过应用程序来总控各个小事务。
优点:性能上有优势
缺点:需要应用程序在事务控制上做灵活设计。如果使用了spring的事务管理, 改动起来会面临一定的困难。
a2. 跨节点join问题
只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可 以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一 次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数 据。
a3. 跨节点的count,order by,group by以及聚合函数问题
这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都 不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个 节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可 以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很 大,对应用程序内存的消耗是一个问题。