MySql 水平和垂直 拆分

当咱们使用读写分离、缓存后,数据库的压力仍是很大的时候,这就须要使用到数据库拆分了。前端

        数据库拆分简单来讲,就是指经过某种特定的条件,按照某个维度,将咱们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。数据库

        切分模式: 垂直(纵向)拆分、水平拆分。后端

垂直拆分缓存

        专库专用架构

        一个数据库由不少表的构成,每一个表对应着不一样的业务,垂直切分是指按照业务将表进行分类,分布到不一样的数据库上面,这样也就将数据或者说压力分担到不一样的库上面,以下图:并发

        

优势:分布式

        1. 拆分后业务清晰,拆分规则明确。高并发

        2. 系统之间整合或扩展容易。性能

        3. 数据维护简单。大数据

缺点:

        1. 部分业务表没法join,只能经过接口方式解决,提升了系统复杂度。

        2. 受每种业务不一样的限制存在单库性能瓶颈,不易数据扩展跟性能提升。

        3. 事务处理复杂。

水平拆分

        垂直拆分后遇到单机瓶颈,可使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不一样的表拆到不一样的数据库中,而水平拆分是把同一个表拆到不一样的数据库中。

        相对于垂直拆分,水平拆分不是将表的数据作分类,而是按照某个字段的某种规则来分散到多个库之中,每一个表中包含一部分数据。简单来讲,咱们能够将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其余的数据库中,主要有分表,分库两种模式,如图:

                

 

        

优势:

        1. 不存在单库大数据,高并发的性能瓶颈。

        2. 对应用透明,应用端改造较少。     

        3. 按照合理拆分规则拆分,join操做基本避免跨库。

        4. 提升了系统的稳定性跟负载能力。

缺点:

        1. 拆分规则难以抽象。

        2. 分片事务一致性难以解决。

        3. 数据屡次扩展难度跟维护量极大。

        4. 跨库join性能较差。

拆分的处理难点

两张方式共同缺点

        1. 引入分布式事务的问题。

        2. 跨节点Join 的问题。

        3. 跨节点合并排序分页问题。

针对数据源管理,目前主要有两种思路:

        A. 客户端模式,在每一个应用程序模块中配置管理本身须要的一个(或者多个)数据源,直接访问各个 数据库,在模块内完成数据的整合;

        优势:相对简单,无性能损耗。   

        缺点:不够通用,数据库链接的处理复杂,对业务不够透明,处理复杂。

       B. 经过中间代理层来统一管理全部的数据源,后端数据库集群对前端应用程序透明;   

        优势:通用,对应用透明,改造少。   

        缺点:实现难度大,有二次转发性能损失。

拆分原则

        1. 尽可能不拆分,架构是进化而来,不是一蹴而就。(SOA)

        2. 最大可能的找到最合适的切分维度。

        3. 因为数据库中间件对数据Join 实现的优劣难以把握,并且实现高性能难度极大,业务读取  尽可能少使用多表Join -尽可能经过数据冗余,分组避免数据垮库多表join。

        4. 尽可能避免分布式事务。

        5. 单表拆分到数据1000万之内。

切分方案

        范围、枚举、时间、取模、哈希、指定等

相关文章
相关标签/搜索