`
liulanghan110
  • 浏览: 1078102 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

数据库的拆分

阅读更多

http://blog.csdn.net/bluishglc/article/details/6161475

 

本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 

 

一、基本思想

      Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题。不太严格的讲,对于海量数据的数据库,如果是因为表多而数据多,这时候适合使用垂直切分,即把关系紧密(比如同一模块)的表切分出来放在一个server上。如果表并不多,但每张表的数据非常多,这时候适合水平切分,即把表的数据按某种规则(比如按ID散列)切分到多个数据库(server)上。当然,现实中更多是这两种情况混杂在一起,这时候需要根据实际情况做出选择,也可能会综合使用垂直与水平切分,从而将原有数据库切分成类似矩阵一样可以无限扩充的数据库(server)阵列。下面分别详细地介绍一下垂直切分和水平切分.

      垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非
常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业
务模块所使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也
更小,拆分规则也会比较简单清晰。(这也就是所谓的”share nothing”)。



      水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆
分到不同的数据库中,对于应用程序来说,拆分规则本身就较根据表名来拆分更为复杂,后
期的数据维护也会更为复杂一些。



      让我们从普遍的情况来考虑数据的切分:一方面,一个库的所有表通常不可能由某一张表全部串联起来,这句话暗含的意思是,水平切分几乎都是针对一小搓一小搓(实际上就是垂直切分出来的块)关系紧密的表进行的,而不可能是针对所有表进行的。另一方面,一些负载非常高的系统,即使仅仅只是单个表都无法通过单台数据库主机来承担其负载,这意味着单单是垂直切分也不能完全解决问明。因此多数系统会将垂直切分和水平切分联合使用,先对系统做垂直切分,再针对每一小搓表的情况选择性地做水平切分。从而将整个数据库切分成一个分布式矩阵。

 

二、切分策略

      如前面所提到的,切分是按先垂直切分再水平切分的步骤进行的。垂直切分的结果正好为水平切分做好了铺垫。垂直切分的思路就是分析表间的聚合关系,把关系紧密的表放在一起。多数情况下可能是同一个模块,或者是同一“聚集”。这里的“聚集”正是领域驱动设计里所说的聚集。在垂直切分出的表聚集内,找出“根元素”(这里的“根元素”就是领域驱动设计里的“聚合根”),按“根元素”进行水平切分,也就是从“根元素”开始,把所有和它直接与间接关联的数据放入一个shard里。这样出现跨shard关联的可能性就非常的小。应用程序就不必打断既有的表间关联。比如:对于社交网站,几乎所有数据最终都会关联到某个用户上,基于用户进行切分就是最好的选择。再比如论坛系统,用户和论坛两个模块应该在垂直切分时被分在了两个shard里,对于论坛模块来说,Forum显然是聚合根,因此按Forum进行水平切分,把Forum里所有的帖子和回帖都随Forum放在一个shard里是很自然的。

      对于共享数据数据,如果是只读的字典表,每个shard里维护一份应该是一个不错的选择,这样不必打断关联关系。如果是一般数据间的跨节点的关联,就必须打断。

 

      需要特别说明的是:当同时进行垂直和水平切分时,切分策略会发生一些微妙的变化。比如:在只考虑垂直切分的时候,被划分到一起的表之间可以保持任意的关联关系,因此你可以按“功能模块”划分表格,但是一旦引入水平切分之后,表间关联关系就会受到很大的制约,通常只能允许一个主表(以该表ID进行散列的表)和其多个次表之间保留关联关系,也就是说:当同时进行垂直和水平切分时,在垂直方向上的切分将不再以“功能模块”进行划分,而是需要更加细粒度的垂直切分,而这个粒度与领域驱动设计中的“聚合”概念不谋而合,甚至可以说是完全一致,每个shard的主表正是一个聚合中的聚合根!这样切分下来你会发现数据库分被切分地过于分散了(shard的数量会比较多,但是shard里的表却不多),为了避免管理过多的数据源,充分利用每一个数据库服务器的资源,可以考虑将业务上相近,并且具有相近数据增长速率(主表数据量在同一数量级上)的两个或多个shard放到同一个数据源里,每个shard依然是独立的,它们有各自的主表,并使用各自主表ID进行散列,不同的只是它们的散列取模(即节点数量)必需是一致的。(

本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 


1.事务问题:
解决事务问题目前有两种可行的方案:分布式事务和通过应用程序与数据库共同控制实现事务下面对两套方案进行一个简单的对比。
方案一:使用分布式事务
    优点:交由数据库管理,简单有效
    缺点:性能代价高,特别是shard越来越多时
方案二:由应用程序和数据库共同控制
     原理:将一个跨多个数据库的分布式事务分拆成多个仅处
           于单个数据库上面的小事务,并通过应用程序来总控
           各个小事务。
     优点:性能上有优势
     缺点:需要应用程序在事务控制上做灵活设计。如果使用   
           了spring的事务管理,改动起来会面临一定的困难。
2.跨节点Join的问题
      只要是时行切分,跨节点Join的问明是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。

3.跨节点的count,order by,group by以及聚合函数问题
      这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。

 

参考资料:

《MySQL性能调优与架构设计》

 

注:本文图片摘自《MySQL性能调优与架构设计》一 书

分享到:
评论

相关推荐

    架构师修炼笔记 MySQL架构设计之数据库拆分技术方法 共45页.pptx

    【MySQL架构设计之数据库拆分技术方法】 在数据库架构设计中,数据库拆分是一种常见的解决高并发、大数据量问题的策略。本篇笔记主要探讨了MySQL数据库的拆分技术,包括CAP原则、可扩展性原则以及垂直拆分和水平...

    数据库拆分经验

    数据库拆分经验,总结的很好,虽然描述的比较简单,但是很值得一看,

    微服务:如何拆分共享数据库?

    在分解单体应用程序到微服务体系架构时,重点考虑独立数据库拆分是很重要的。您需要想出一个可靠的策略,将您的数据库分割为多个与应用程序对齐的小型数据库。简而言之,您需要将您的应用程序/服务从使用单一的共享...

    Access中利用拆分后端数据库保存不同数据

    数据库拆分是指将一个大型数据库拆分成多个小型数据库,每个小型数据库保存特定的数据集。这样可以减少数据库的大小,提高数据的存储和检索效率。在 Access 中,我们可以通过将数据库拆分成多个文件,每个文件保存...

    关于数据库表拆分.docx

    为了解决这个问题,又拍网采用了数据库拆分策略。数据库拆分分为垂直拆分和水平拆分。垂直拆分是根据功能模块将表分布到不同数据库,例如将群组相关表与照片相关表分开,这种方式简单但可能无法完全解决问题。相比之...

    拆分数据库中某列某行的数据,大量处理

    本文将深入探讨如何在三层架构中拆分数据库中的某列某行数据,并根据任意字符进行拆分和更新,以实现高效的数据处理。 首先,让我们理解什么是三层架构。三层架构是一种常见的软件设计模式,它将应用分为三个主要...

    一分钟掌握数据库垂直拆分

    其中,数据库拆分是常用的一种手段,它能够有效减轻单一数据库的压力。本文将详细介绍“一分钟掌握数据库垂直拆分”的相关内容,帮助读者快速了解垂直拆分的基本概念、应用场景及其实现原理。 #### 二、水平拆分与...

    数据库表拆分的三种解决方案.docx

    数据库表拆分是指将大型数据库拆分成多个小型数据库,以便提高数据库的性能和可扩展性。根据分库分表方案中实施切片逻辑的层次不同,我们可以将数据库分库分表的实现方案分为三大类:客户端分片、代理分片和支持事务...

    基于mybatis框架,数据库垂直、水平拆分及读写分离实现

    总结来说,基于MyBatis的数据库拆分和读写分离实现,涉及到对MyBatis框架的深入理解和扩展,包括对SqlSessionTemplate的改造、数据库拆分策略的设计(如垂直拆分和水平拆分的一致性哈希)、以及读写分离的路由机制。...

    数据库+分表分库+垂直拆分与水平拆分

    分表分库是指将一个大的数据表或数据库拆分成多个较小的数据表或数据库的过程。这种做法能够有效提升数据库的扩展性,并通过降低单个表的大小来提高查询效率。分表分库通常有两种方式:垂直拆分和水平拆分。 #### ...

    MySQL迁移、拆分技巧.pptx

    MySQL迁移与拆分是数据库管理中非常重要的技能,通过合理的设计和实现可以有效提升系统的性能和可用性。本文档详细介绍了迁移的分类、步骤以及拆分的方法和技巧,希望能为从事MySQL管理工作的技术人员提供帮助。在...

    MDB数据库编辑器2012汉化版

    《MDB数据库编辑器2012汉化版》是一款专为处理MDB格式数据库设计的高效工具,它在原版基础上进行了全面的汉化处理,使得中国用户能够更加方便地理解和操作,大大降低了使用门槛,提高了工作效率。这款编辑器在数据库...

    易语言数据库操作源码(易之表超强版)

    将一个易语言数据库拆分为两个数据库.6.Foxpro,Excel等数据库难以转换为易语言的数据库,用这个CSV通过转换器,可以非常方便的转换.7.可以将易语言数据库转换为CSV文件,或TXT文件.这个功能已大大加强,还可以预览结果...

    SQL数据库分割拆分工具

    SQL数据库分割拆分工具,体积小,非常好用,可以把大SQL文件自动分割成不同大小文件,方便导入数据库,文件大小可以自己设定,一般虚拟主机数据库导入限制2-8MB, 几百MB数据库没法一次导入,可以用这个分割成NN个,...

    scaner:扫描器是来自GitHub平台的开源扫描器的集合,包括子域枚举,数据库拆分扫描器,弱密码或信息泄漏扫描器,端口扫描器,指纹扫描器以及其他大规模扫描仪,模块扫描器等。对于其他著名的扫描工具,如:awvs,nmap,w3af将不包含在集合范围内-源码包

    扫描器是来自GitHub平台的开源扫描器的集合,包括子域枚举,数据库拆分扫描器,弱密码或信息泄漏扫描器,端口扫描器,指纹扫描器以及其他大规模扫描仪,模块扫描器等。对于其他著名的扫描工具,如:awvs,nmap,w3af...

    K3数据库工具.rar

    再者,分离数据库功能允许我们将一个正在使用的数据库拆分成两个部分,即数据文件和日志文件。这样做的好处在于,可以在不影响数据库服务的情况下,单独备份或移动某个数据库的部分组件。这对于数据库的迁移、升级或...

    MYSQL数据库数据拆分之分库分表总结

    MySQL数据库在面对大规模数据存储时,常常需要采取数据拆分策略,即分库分表,以应对性能瓶颈和存储限制。本文将详细讲解这一过程及其相关的知识点。 首先,单库单表是最基础的数据库设计模式,但随着用户数量的...

Global site tag (gtag.js) - Google Analytics