能过数据库的读写分离和使用NoSQL,以及搜索引擎后,能够降低主库的压力,解决数据存储方面的问题,不过随着业务的继续发展,我们的数据库主库还是会遇到性能瓶颈,所以为了减小数据库主库的压力,我们有数据库垂直拆分和水平拆分两种方式。

数据库拆分

数据库拆分有两种方法,垂直拆分和水平拆分。

垂直拆分

垂直拆分的意思是把数据库中不同业务的数据拆分到不同的数据库中。比如我们商旅系统中原来将机票,酒店和火车票的订单放在一个库中,如果是垂直拆分的话,就是将机票,酒店和火车票拆分到不同的数据库中。

这种方式解决了把所有业务数据放在一个数据库中的压力问题,但是同时会带来两个问题:

1,应用需要配置多个数据源。

2,如何处理原来单机的跨业务的事务问题,常用的解决方案是使用分布式事务,而另一种解决方案是,去掉事务或者不去追求强事务支持。

那么,使用垂直拆分后的架构如下图:

 

水平拆分

水平拆分一般是在某个数据表的数据量达到了单个数据库的瓶颈,这时可以把这个数据表拆分到两个或多个数据库中。

数据库水平拆分与数据库读写分离的区别是,读写分离解决的是读压力大的问题,对于数据量大或者更新量大的情形并不会有效果,数据库水平拆分与垂直拆分的区别是,垂直拆分是把不同的数据表拆分到不同的数据库中,而水平拆分是把同一个表拆分到不同的数据库中。

水平拆分解决了单表数据量过大的问题,但同时带来了以下几个问题:

1,要解决sql路由的问题,比如现在用户信息被分在了两个数据库中,在进行数据库操作的时候需要知道数据在哪个数据库中。

2,数据表主键的处理问题,原来使用自增字段作为主键的现在变得不适用了,因为有可能重复。

3,当某个查询需要从两个或多个数据库中获取数据时,就比较难处理了。

先来看下使用水平拆分后的架构图:

总结:

1,数据库垂直拆分一般与应用(业务)拆分同步进行的。

2,数据库垂直拆分会衍生两个问题:一是跨业务的事务问题。二是应用需要配置多个数据源。对于跨业务的事务问题,一般可采用二阶段提交的方式或是分布式事务容器来实现分布式事务。

3,数据库水平拆分会衍生三个问题:一是sql路由的问题。二是数据表主键重复的问题。三是一个查询跨多个数据库的问题。

 

posted on 2017-07-25 10:45  永远的麦子  阅读(1077)  评论(0编辑  收藏  举报