`

MySQL垂直和水平切分

阅读更多

replication的限制:一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈。数据切分(sharding):通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。。数据的切分同时还可以提高系统的总体可用性,因为单台设备Crash之后,只有总体数据的某部分不可用,而不是所有的数据。

 

数据的切分(Sharding)模式

 

一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

 

垂直切分:

 

一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。

 

一般来说,如果是一个负载相对不是很大的系统,而且表关联又非常的频繁,那可能数据库让步,将几个相关模块合并在一起减少应用程序的工作的方案可以减少较多的工作量,这是一个可行的方案。一个垂直拆分的例子:

1.用户模块表:user,user_profile,user_group,user_photo_album

2.群组讨论表:groups,group_message,group_message_content,top_message

3.相册相关表:photo,photo_album,photo_album_relation,photo_comment

 

4.事件信息表:event

   *群组讨论模块和用户模块之间主要存在通过用户或者是群组关系来进行关联。一般关联的时候都会是通过用户的id或者nick_name以及group的id来进行关联,通过模块之间的接口实现不会带来太多麻烦;

   *相册模块仅仅与用户模块存在通过用户的关联。这两个模块之间的关联基本就有通过用户id关联的内容,简单清晰,接口明确;

 

   *事件模块与各个模块可能都有关联,但是都只关注其各个模块中对象的ID信息,同样可以做到很容易分拆。

垂直切分的优点:

数据库的拆分简单明了,拆分规则明确;

应用程序模块清晰明确,整合容易;

数据维护方便易行,容易定位;

 

垂直切分的缺点:

部分表关联无法在数据库级别完成,需要在程序中完成;

对于访问极其频繁且数据量超大的表仍然存在性能瓶颈,不一定能满足要求;

事务处理相对更为复杂;

切分达到一定程度之后,扩展性会遇到限制;

过读切分可能会带来系统过渡复杂而难以维护。

 

 

水平切分

 

将某个访问极其频繁的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。

对于上面的例子:所有数据都是和用户关联的,那么我们就可以根据用户来进行水平拆分,将不同用户的数据切分到不同的数据库中。现在互联网非常火爆的Web2.0类型的网站,基本上大部分数据都能够通过会员用户信息关联上,可能很多核心表都非常适合通过会员ID来进行数据的水平切分。而像论坛社区讨论系统,就更容易切分了,非常容易按照论坛编号来进行数据的水平切分。切分之后基本上不会出现各个库之间的交互。

 

水平切分的优点:

表关联基本能够在数据库端全部完成;

不会存在某些超大型数据量和高负载的表遇到瓶颈的问题;

应用程序端整体架构改动相对较少;

事务处理相对简单;

只要切分规则能够定义好,基本上较难遇到扩展性限制;

 

水平切分的缺点:

切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则;

后期数据的维护难度有所增加,人为手工定位数据更困难;

应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。

 

两种切分结合用:

 

一般来说,我们数据库中的所有表很难通过某一个(或少数几个)字段全部关联起来,所以很难简单的仅仅通过数据的水平切分来解决所有问题。而垂直切分也只能解决部分问题,对于那些负载非常高的系统,即使仅仅只是单个表都无法通过单台数据库主机来承担其负载。我们必须结合“垂直”和“水平”两种切分方式同时使用

 

每一个应用系统的负载都是一步一步增长上来的,在开始遇到性能瓶颈的时候,大多数架构师和DBA都会选择先进行数据的垂直拆分,因为这样的成本最先,最符合这个时期所追求的最大投入产出比。然而,随着业务的不断扩张,系统负载的持续增长,在系统稳定一段时期之后,经过了垂直拆分之后的数据库集群可能又再一次不堪重负,遇到了性能瓶颈。

 

如果我们再一次像最开始那样继续细分模块,进行数据的垂直切分,那我们可能在不久的将来,又会遇到现在所面对的同样的问题。而且随着模块的不断的细化,应用系统的架构也会越来越复杂,整个系统很可能会出现失控的局面。

 

这时候我们就必须要通过数据的水平切分的优势,来解决这里所遇到的问题。而且,我们完全不必要在使用数据水平切分的时候,推倒之前进行数据垂直切分的成果,而是在其基础上利用水平切分的优势来避开垂直切分的弊端,解决系统复杂性不断扩大的问题。而水平拆分的弊端(规则难以统一)也已经被之前的垂直切分解决掉了,让水平拆分可以进行的得心应手。

 

示例数据库:

 

假设在最开始,我们进行了数据的垂直切分,然而随着业务的不断增长,数据库系统遇到了瓶颈,我们选择重构数据库集群的架构。如何重构?考虑到之前已经做好了数据的垂直切分,而且模块结构清晰明确。而业务增长的势头越来越猛,即使现在进一步再次拆分模块,也坚持不了太久。

 

==>选择了在垂直切分的基础上再进行水平拆分。

 

==>在经历过垂直拆分后的各个数据库集群中的每一个都只有一个功能模块,而每个功能模块中的所有表基本上都会与某个字段进行关联。如用户模块全部都可以通过用户ID进行切分,群组讨论模块则都通过群组ID来切分,相册模块则根据相册ID来进切分,最后的事件通知信息表考虑到数据的时限性(仅仅只会访问最近某个事件段的信息),则考虑按时间来切分。

 

数据切分以及整合方案.

 

数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何来让这些数据源得到较好的整合,其中存在两种解决思路:

 

在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个数据库,在模块内完成数据的整合;

通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明;

 

第二种方案,虽然短期内需要付出的成本可能会相对更大一些,但是对整个系统的扩展性来说,是非常有帮助的。针对第二种方案,可以选择的方法和思路有:

 

1.利用MySQLProxy 实现数据切分及整合.

 

可用来监视、分析或者传输他们之间的通讯信息。他的灵活性允许你最大限度的使用它,目前具备的功能主要有连接路由,Query分析,Query过滤和修改,负载均衡,以及基本的HA机制等。MySQLProxy 本身并不具有上述所有的这些功能,而是提供了实现上述功能的基础。要实现这些功能,还需要通过我们自行编写LUA脚本来实现。

 

原理:MySQLProxy 实际上是在客户端请求与MySQLServer 之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy 进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer 上。对于多节点Slave集群,也可以起做到负载均衡的效果。

 

2.利用Amoeba实现数据切分及整合

 

Amoeba是一个基于Java开发的,专注于解决分布式数据库数据源整合Proxy程序的开源框架,Amoeba已经具有Query路由,Query过滤,读写分离,负载均衡以及HA机制等相关内容。Amoeba主要解决的以下几个问题:

 

数据切分后复杂数据源整合;

提供数据切分规则并降低数据切分规则给数据库带来的影响;

降低数据库与客户端的连接数;

读写分离路由;

 

AmoebaFor MySQL 主要是专门针对MySQL数据库的解决方案,前端应用程序请求的协议以及后端连接的数据源数据库都必须是MySQL。对于客户端的任何应用程序来说,AmoebaForMySQL 和一个MySQL数据库没有什么区别,任何使用MySQL协议的客户端请求,都可以被AmoebaFor MySQL 解析并进行相应的处理。

 

Proxy程序常用的功能如读写分离,负载均衡等配置都在amoeba.xml中进行。Amoeba已经支持了实现数据的垂直切分和水平切分的自动路由,路由规则可以在rule.xml进行设置。

 

3.利用HiveDB实现数据切分及整合

 

HiveDB同样是一个基于Java针对MySQL数据库的提供数据切分及整合的开源框架,只是目前的HiveDB仅仅支持数据的水平切分。主要解决大数据量下数据库的扩展性及数据的高性能访问问题,同时支持数据的冗余及基本的HA机制。

 

HiveDB的实现机制与MySQLProxy 和Amoeba有一定的差异,他并不是借助MySQL的Replication功能来实现数据的冗余,而是自行实现了数据冗余机制,而其底层主要是基于HibernateShards 来实现的数据切分工作。数据切分与整合中可能存在的问题

 

引入分布式事务的问题?

一旦数据进行切分被分别存放在多个MySQLServer中之后,不管我们的切分规则设计的多么的完美(实际上并不存在完美的切分规则),都可能造成之前的某些事务所涉及到的数据已经不在同一个MySQLServer 中了。

==>将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务,并通过应用程序来总控各个小事务。

 

跨节点Join的问题?

==>先从一个节点取出数据,然后根据这些数据,再到另一个表中取数据.

==>使用Federated存储引擎,问题是:乎如果远端的表结构发生了变更,本地的表定义信息是不会跟着发生相应变化的。

 

跨节点合并排序分页问题?

==>Join本身涉及到的多个表之间的数据读取一般都会存在一个顺序关系。但是排序分页就不太一样了,排序分页的数据源基本上可以说是一个表(或者一个结果集),本身并不存在一个顺序关系,所以在从多个数据源取数据的过程是完全可以并行的。这样,排序分页数据的取数效率我们可以做的比跨库Join更高,所以带来的性能损失相对的要更小。 

转载:http://www.blogjava.net/stevenjohn/archive/2015/03/24/423793.html

 

分享到:
评论

相关推荐

    mysql水平垂直切分PPT教案学习.pptx

    MySQL的水平和垂直切分是数据库优化的重要策略,主要用于应对数据量大、访问压力高的情况。这两种切分方法都是为了提高数据库的性能和可扩展性。 **垂直切分**是根据表中的字段来划分,目的是减小单个表的大小和...

    MYSQL学习资料

    mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with Memcached –安装 数据切分及整合方案 数据库水平切分的实现原理解析 innodb max dirty...

    数据切分方法

    MySQL Proxy支持多种切分策略,包括垂直切分和水平切分,并且可以实现读写分离等功能。虽然MySQL Proxy提供了丰富的功能,但它并不直接支持SQL语法,需要开发者自己编写Lua脚本来实现特定的逻辑,这在一定程度上增加...

    高可用MYSQL,主从复制,集群和负载平衡

    1.4 读写分离和数据库垂直、水平切分 读写分离是指将读写操作分离到不同的服务器上,以提高系统的处理能力和性能。数据库垂直切分是指将数据库分割成多个小的数据库,以便提高系统的可扩展性。水平切分是指将数据库...

    Mysql的水平分表与垂直分表的讲解

    MySQL数据库在处理大规模数据时,为了提升查询性能和管理效率,常常采用水平分表和垂直分表两种策略。这两种分表方法是数据库优化的重要手段,旨在解决单一表中数据量过大导致的性能瓶颈。 **水平分表(Horizontal ...

    数据库分库技巧

    数据切分可以分为水平切分和垂直切分两种: - **水平切分**(Horizontal Partitioning/Sharding):按照一定的规则将表中的行数据分布到不同的数据库实例中。这种方式适用于具有大量行数据的表。 - **垂直切分**...

    mycat权威指南.pdf

    Mycat 支持两种类型的数据库切分:垂直切分和水平切分。垂直切分是将数据库的 schema 切分成多个小型 schema,每个 schema 包含不同的数据表。水平切分是将数据库的数据表切分成多个小型数据表,每个数据表包含不同...

    Amoeba的使用及单机多MySQL数据库的配置(特别说明).pdf

    4. **数据切分配置**:在`rule.xml`中启用规则配置,指定垂直切分和水平切分的规则。 **注意事项** 除了Amoeba的配置,系统还需要对MySQL数据库进行主从同步的配置,以保持数据的一致性。主从同步通常涉及binlog...

    MySQL中如何进行分库分表的设计和实现?

    数据切分策略:根据具体业务需求选择合适的切分策略,常见的切分策略有水平切分、垂直切分和跨库查询。水平切分按照某个条件将数据行拆分到不同的数据库表中,例如按照用户 ID 的哈希值进行切分。垂直切分按照表的列...

    详解MySQL性能优化(二)

    可扩展性设计的一个策略是数据切分,分为垂直切分和水平切分。垂直切分是将数据库表按照列进行分割,将相关性强的列放在一起,以减少JOIN操作,提高查询效率。这种方式简化了数据库结构,但可能导致应用程序中需要...

    Linux下的MySQL调优

    - **垂直/水平切分**:通过垂直或水平切分服务器或数据表来分散负载。 - **MySQL复制**:利用MySQL复制技术实现读写分离,提高读取性能。 - **负载均衡**:在复制的基础上,可以通过多个从服务器实现负载均衡。 - **...

    Mysql海量数据存储和解决方案之-分布式DB方案.docx

    数据切分是分布式DB的核心,主要分为水平切分和垂直切分。水平切分是根据某个字段值将数据分散到多个数据库中,如上述日志应用中,根据`user_id`将文章分到不同的数据库。这样,每个数据库处理的数据量相对减少,...

    mysql-5.7.34-winx64.zip

    在MySQL中实现分库分表有多种方法,包括垂直分割和水平分割。 1. **垂直分割**:这种方法基于数据属性进行切分,将表中的列分为两个或更多个表。通常,我们将不常访问或者大容量的列移到另一个表中,这样可以减少主...

    mysql实战和优化视频教程

    - **分库分表**:通过水平切分或垂直切分的方式分散单个数据库的压力,提高系统扩展性和并发处理能力。 - **缓存策略**:利用Redis等缓存技术缓存热点数据,减少数据库访问次数。 ### 实战案例分享 #### 1. 高并发...

    php mysql分库分表实例

    分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决单一数据库性能瓶颈问题。垂直切分是根据业务逻辑将数据分散到多个数据库中,通常依据表的相关性或访问频率来进行。而水平切分则是按照某个字段(如用户...

    高性能mysql第三版

    书中解释了不同类型的分区(如范围分区、哈希分区)及其使用场景,同时也讨论了垂直切分和水平切分的分片策略。 6. **高可用性与容错**:MySQL的高可用性是通过多种手段实现的,包括复制、主备切换、集群等。书中...

    第17章分布式数据库与MySQL的运维.docx

    数据切分技术分为垂直切分和水平切分。垂直切分是根据业务逻辑将不同表或Schema分配到不同数据库,适用于耦合度低、独立性强的场景,易于管理和维护。水平切分则是将同一表中的数据依据特定条件分散到多个数据库,...

    MySQL原理分析与架构设计视频教程

    垂直切分通常基于业务功能,而水平切分则涉及分片键的选择,这需要考虑数据分布的均匀性和查询的路由策略。ShardingSphere、MyCAT等中间件可以帮助实现这些复杂操作。 SQL查询优化是提升数据库性能的重要环节。了解...

    分库分表+mysql+技术方案分享

    随着业务发展,单一数据库无法承受过多数据和操作,此时需要通过垂直切分或水平切分来分散负载。 - **垂直切分**:根据业务逻辑将表拆分到不同的数据库中,或者将表中的字段按活跃度拆分为主表和扩展表。这样可以...

    mysql集群工具macat

    1. 数据分片:Mycat支持水平分片和垂直分片。水平分片是将数据按照某个字段的值进行划分,每个分片存储一部分数据;垂直分片则是按照表的列进行切分,不同的分片存储不同列的数据。这种切分方式可以有效分散数据库的...

Global site tag (gtag.js) - Google Analytics