`
jiagou
  • 浏览: 2594728 次
文章分类
社区版块
存档分类
最新评论

数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

 
阅读更多

本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sharding缺少基本的了解,请参考我另一篇从基础理论全面介绍sharding的文章:数据库Sharding的基本思想和切分策略


第一部分:实施策略




图1.数据库分库分表(sharding)实施策略图解(点击查看大图)


1.准备阶段

对数据库进行分库分表(Sharding化)前,需要开发人员充分了解系统业务逻辑和数据库schema.一个好的建议是绘制一张数据库ER图或领域模型图,以这类图为基础划分shard,直观易行,可以确保开发人员始终保持清醒思路。对于是选择数据库ER图还是领域模型图要根据项目自身情况进行选择。如果项目使用数据驱动的开发方式,团队以数据库ER图作为业务交流的基础,则自然会选择数据库ER图,如果项目使用的是领域驱动的开发方式,并通过OR-Mapping构建了一个良好的领域模型,那么领域模型图无疑是最好的选择。就我个人来说,更加倾向使用领域模型图,因为进行切分时更多的是以业务为依据进行分析判断,领域模型无疑更加清晰和直观。

2.分析阶段

1. 垂直切分

垂直切分的依据原则是:将业务紧密,表间关联密切的表划分在一起,例如同一模块的表。结合已经准备好的数据库ER图或领域模型图,仿照活动图中的泳道概念,一个泳道代表一个shard,把所有表格划分到不同的泳道中。下面的分析示例会展示这种做法。当然,你也可以在打印出的ER图或模型图上直接用铅笔圈,一切取决于你自己的喜好。

2. 水平切分
垂直切分后,需要对shard内表格的数据量和增速进一步分析,以确定是否需要进行水平切分。

2.1若划分到一起的表格数据增长缓慢,在产品上线后可遇见的足够长的时期内均可以由单一数据库承载,则不需要进行水平切分,所有表格驻留同一shard,所有表间关联关系会得到最大限度的保留,同时保证了书写SQL的自由度,不易受join、group by、order by等子句限制。

2.2 若划分到一起的表格数据量巨大,增速迅猛,需要进一步进行水平分割。进一步的水平分割就这样进行:

2.2.1.结合业务逻辑和表间关系,将当前shard划分成多个更小的shard,通常情况下,这些更小的shard每一个都只包含一个主表(将以该表ID进行散列的表)和多个与其关联或间接关联的次表。这种一个shard一张主表多张次表的状况是水平切分的必然结果。这样切分下来,shard数量就会迅速增多。如果每一个shard代表一个独立的数据库,那么管理和维护数据库将会非常麻烦,而且这些小shard往往只有两三张表,为此而建立一个新库,利用率并不高,因此,在水平切分完成后可再进行一次“反向的Merge”,即:将业务上相近,并且具有相近数据增长速率(主表数据量在同一数量级上)的两个或多个shard放到同一个数据库上,在逻辑上它们依然是独立的shard,有各自的主表,并依据各自主表的ID进行散列,不同的只是它们的散列取模(即节点数量)必需是一致的。这样,每个数据库结点上的表格数量就相对平均了。

2.2.2. 所有表格均划分到合适的shard之后,所有跨越shard的表间关联都必须打断,在书写sql时,跨shard的join、group by、order by都将被禁止,需要在应用程序层面协调解决这些问题。

特别想提一点:经水平切分后,shard的粒度往往要比只做垂直切割的粒度要小,原单一垂直shard会被细分为一到多个以一个主表为中心关联或间接关联多个次表的shard,此时的shard粒度与领域驱动设计中的“聚合”概念不谋而合,甚至可以说是完全一致,每个shard的主表正是一个聚合中的聚合根!

3.实施阶段


如果项目在开发伊始就决定进行分库分表,则严格按照分析设计方案推进即可。如果是在中期架构演进中实施,除搭建实现sharding逻辑的基础设施外(关于该话题会在下篇文章中进行阐述),还需要对原有SQL逐一过滤分析,修改那些因为sharding而受到影响的sql.

第二部分:示例演示

本文选择一个人尽皆知的应用:jpetstore来演示如何进行分库分表(sharding)在分析阶段的工作。由于一些个人原因,演示使用的jpetstore来自原ibatis官方的一个Demo版本,SVN地址为:http://mybatis.googlecode.com/svn/tags/java_release_2.3.4-726/jpetstore-5。关于jpetstore的业务逻辑这里不再介绍,这是一个非常简单的电商系统原型,其领域模型如下图:



图2. jpetstore领域模型


由于系统较简单,我们很容易从模型上看出,其主要由三个模块组成:用户,产品和订单。那么垂直切分的方案也就出来了。接下来看水平切分,如果我们从一个实际的宠物店出发考虑,可能出现数据激增的单表应该是Account和Order,因此这两张表需要进行水平切分。对于Product模块来说,如果是一个实际的系统,Product和Item的数量都不会很大,因此只做垂直切分就足够了,也就是(Product,Category,Item,Iventory,Supplier)五张表在一个数据库结点上(没有水平切分,不会存在两个以上的数据库结点)。但是作为一个演示,我们假设产品模块也有大量的数据需要我们做水平切分,那么分析来看,这个模块要拆分出两个shard:一个是(Product(主),Category),另一个是(Item(主),Iventory,Supplier),同时,我们认为:这两个shard在数据增速上应该是相近的,且在业务上也很紧密,那么我们可以把这两个shard放在同一个数据库节点上,Item和Product数据在散列时取一样的模。根据前文介绍的图纸绘制方法,我们得到下面这张sharding示意图:



图3. jpetstore sharding示意图


对于这张图再说明几点:


1.使用泳道表示物理shard(一个数据库结点)

2.若垂直切分出的shard进行了进一步的水平切分,但公用一个物理shard的话,则用虚线框住,表示其在逻辑上是一个独立的shard。

3.深色实体表示主表

4.X表示需要打断的表间关联



分享到:
评论

相关推荐

    数据库分库分表(sharding)的技术

    **数据库分库分表(Sharding)**是一种常见的数据库优化技术,主要用于解决大规模数据存储和高并发访问带来的性能瓶颈问题。它通过将单一数据库中的数据分散到多个数据库或表中,从而提高系统的整体性能和可扩展性。...

    数据库+分库分表+sharding-jdbc

    Sharding-JDBC是阿里巴巴开源的一款轻量级的Java框架,用于实现数据库的水平拆分,它是基于JDBC的中间件,可以在不修改业务代码的情况下,透明地实现数据分片和读写分离。 1. 数据库分库分表概念: 分库是指将一个...

    多数据源+数据库分库分表

    分库分表采用sharding-jdbc 数据库连接池管理是alibaba的druid-spring-boot-starter 项目使用springboot搭建,junit测试,为了方便实现对数据库操作继承了mybatisplus,为了少些get、set 引入lombok

    sharding + mybatis-plus 分库分表

    总的来说,“Sharding + Mybatis-Plus 分库分表”是一种有效的解决大数据量场景下的数据库扩展策略,它通过Java的中间件技术,实现了数据库层面的水平扩展,结合Mybatis-Plus的便利性,降低了开发复杂度,提升了系统...

    sharding分库分表demo

    本示例通过整合一系列技术,包括SpringBoot、ShardingSphere、Swagger和MyBatis-Plus,来演示如何在实际应用中实现分库分表的操作。 首先,SpringBoot是一个基于Spring框架的轻量级启动器,它简化了初始化和配置...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    ShardingJDBC作为一个轻量级的Java库,能够在不修改现有数据库架构和业务代码的情况下,仅通过配置即可实现分库分表。它具备良好的兼容性,可以与任何Java应用无缝集成,包括但不限于Spring、MyBatis等。在本项目中...

    mysql分库分表sharding-jdbc-sharding-jdbc-demo.zip

    这个"mysql分库分表sharding-jdbc-sharding-jdbc-demo.zip"压缩包提供的就是一个使用Sharding-JDBC进行数据库分库分表的示例项目。 Sharding-JDBC的工作原理是通过透明化的JDBC层,将数据路由、分片规则、读写分离...

    分库分表Sharding中间件Kamike.divide.zip

    开源个人参考淘宝的TDDL分库分表思路写的一个分库分表中间件Kamike.divide. 分库分表这个是8月份左右跟淘宝的数据分析部门的架构师离哲交流的时候产生的想法,离哲推荐采用TDDL进行分库分表。 回去一看,却...

    集成sharding-jdbc实现分库分表.zip

    分库分表是将一个大的数据库拆分成多个小的数据库,将一张大表拆分成多张小表,以减轻单个数据库和表的压力。Sharding-JDBC通过规则配置,可以根据特定的分片策略(如取模、范围等)将数据分布到不同的数据库和表上...

    数据库分库分表原理与实践方案-大厂精品培训ppt.pptx

    培训数据库分库分表,以及分布式数据库搭建各种问题解决方案 1.数据库分片原理 2.Mycat与Sharding-JDBC 对比 3.分布式数据库问题解决方案,包括分配、一致性、事务控制等

    ShardingJDBC分库分表mysql数据库实战小滴新版

    接着深入探讨了分库分表的各种方式,如垂直分表、垂直分库、水平分表和水平分库,并对其进行了总结。还讲解了 MySQL 数据库水平分库分表的常见策略,如 range、hash 取模等。 课程对常见的分库分表中间件进行了介绍...

    当当开源sharding-jdbc-轻量级数据库分库分表中间件

    总之,Sharding-JDBC以其简单高效的设计理念、高度兼容性以及出色的性能表现,在数据库分库分表领域内占据了一席之地,对于需要解决大规模数据处理问题的企业来说,是一个值得关注和尝试的选择。

    sharding-jdbc按月分表样例2

    在Java开发中,面对大数据量的数据库操作时,分库分表成为一种常见的解决方案,以提高数据读写性能和系统可用性。Sharding-JDBC作为阿里巴巴开源的轻量级Java框架,是实现分库分表的一种优秀选择。本文将深入探讨...

    4-Sharding-JDBC分库分表.pdf

    分库分表的概念、垂直拆分与水平拆分、分片策略和分片算法是Sharding-JDBC中核心的知识点,下面将对这些概念进行详细的解释。 ### 分库分表概念 分库分表是为了解决随着业务数据量的不断增长,单库单表模式面临的...

    Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离.docx

    1. 数据库分库分表:Sharding-JDBC可以将一个大型数据库拆分成多个小型数据库,每个数据库都包含所有数据的一部分。 2. 读写分离:Sharding-JDBC可以将读操作和写操作分离到不同的数据库,减少数据库的压力和提高...

    sharding-jdbc分库分表

    总结,Sharding-JDBC作为一个优秀的数据库中间件,通过分库分表和读写分离技术,为Java开发者提供了强大的数据库扩展能力。通过深入学习和实践"shanjupay"项目,我们可以更好地理解和运用这一技术,以应对日益增长的...

    分库分表shardingjdbc

    ### 分库分表shardingjdbc知识点详述 #### 一、简介 Apache ShardingSphere 是一个分布式的数据库中间件项目,旨在提供简单易用、高度可扩展的数据分片解决方案。ShardingSphere 支持多种模式,包括 JDBC 模式、...

    数据库分库分表(sharding).doc

    数据库分库分表(sharding)

Global site tag (gtag.js) - Google Analytics