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

数据库分切设计

    博客分类:
  • java
阅读更多

最近讨论db shard的帖子比较多,感觉很多都是在参考hibernate shard的思路,但hibernate分表真的那么好吗?我觉得它最少有2个问题:

1. 改成shard后,代码的API调用要变。代码改动很大。
2. 设计很复杂,不清晰,逻辑关系难以理解。

hibernate shard基本上就是为了shard而对hibernate做的增增补补,凑合用还行,根本不具备设计上的参考价值。

对数据库分切方面,到目前为止,我觉得还是guzz的设计最清晰,如果我说的不对,欢迎理性讨论。不管您是否使用guzz,但是guzz在数据库分切方面的设计,对于清晰的设计模式,比hibernate shard更具有借鉴意义。

guzz垂直切分

垂直切分是指将不同的表分别存储到不同的数据库中。guzz默认配置级支持,不需要写任何代码,可以在任何时候,在需要时,将每张表存储到自己单独的一组服务器上,应该说是垂直分切的极限了。而且设计上,无论什么时候怎么分切,都不需要你改动代码。开发时你可以让所有表在一个库上;部署时,分到多个库上;以后业务增加了,再更加分散的放。

垂直分切简单配置方式:

1. 声明你要用多少台数据库,数据库之间什么关系。

Xml代码 复制代码
  1. <dialect class="org.guzz.dialect.H2Dialect"></dialect>  
  2. <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" />  
  3. <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" />  
  4.   
  5. <tran>  
  6.         <dbgroup name="default" masterDBConfigName="masterDB" />  
  7.         <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" />  
  8.         <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" />  
  9. </tran>   
        <dialect class="org.guzz.dialect.H2Dialect"></dialect>
        <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" />
        <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" />
        
        <tran>
                <dbgroup name="default" masterDBConfigName="masterDB" />
                <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" />
                <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" />
        </tran> 

这里我们声明了3组数据库,而且数据库类型还不一样。

2. 对每张表,配置应该存储到那个库里

Xml代码 复制代码
  1. <a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" />  
  2. <a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" />  
  3. <a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />  
	<a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" />
	<a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" />
	<a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />

简单的配置,将三个对象分别存储到3台不同的数据库中,完成垂直分切。

guzz水平切表

水平切表是指将一张大表,分切成许多小表。guzz的设计是当需要水平分表时,原先代码不变,为每个需要分切的表编写一个分表策略类,配置到系统中。然后在调用前,声明分表策略即可。
 
  整个过程只需要新写一个类,在调用出增加一行代码即可,对原始系统入侵非常小,风险可控。

  流程总比hibernate shard要清晰很多,具体可以看http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans


数据库主从分离

从垂直分切部分可以看到,guzz也是配置性的原生支持读写分离。如果需要增加从数据库,可以随时加上,不需要改任何代码。不需要改动代码,而且配置也不复杂,应该算是设计上的极限了吧?

你只需要在dbgroup中增加一个属性“slaveDBConfigName”,然后在一个properties文件中加上所有你需要的从数据库连接池配置即可,从数据库可以有许多台。

这个hibernate shard根本就没有涉及到。而且guzz允许程序控制读写库选取,和proxy模式的中间件路由各有优势,毕竟更加容易控制。如果你做过内容提前审核再允许发布的系统,就会明白proxy中间件解决不了全部问题,有些读操作不允许延迟,只能读主库,而是也是读事务,proxy中间件会很尴尬。

异构数据库

这个hibernate以及ibatis之类的更没有了。而且也是对应用透明的,你可以随时选择增加一种数据库,然后把某些表放到上面,如增加一个H2做应用端缓存数据库,自己完成类似Timesten + oracle的架构。

配置方式在上面的垂直分切小节也可以看到。

数据库连接池配置

随着表垂直和水平切分的进行,数据库会越来越多,数据源配置也会越来越多。guzz的设计是配置分组管理,类似Mysql的配置文件。每个数据源配置都在一个组内,无论增加多少都清晰了然,不会名字相互冲突。

示例:
Properties代码 复制代码
  1. [masterDB]   
  2. guzz.identifer=blogMasterDB   
  3. guzz.IP=localhost   
  4. guzz.maxLoad=120  
  5. driverClass=com.mysql.jdbc.Driver   
  6. jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8&amp;useServerPrepStmts=true   
  7. user=root   
  8. password=root   
  9. acquireIncrement=10  
  10. idleConnectionTestPeriod=60  
  11.   
  12. [updateMasterDB]   
  13. guzz.identifer=incUpdateDB1   
  14. guzz.IP=localhost   
  15. guzz.maxLoad=20  
  16. driverClass=com.mysql.jdbc.Driver   
  17. jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&amp;characterEncoding=UTF-8  
  18. user=slowupdate   
  19. password=slowupdate   
  20. acquireIncrement=10  
  21. idleConnectionTestPeriod=60  
  22.   
  23. [logMasterDB]   
  24. ....  
[masterDB]
guzz.identifer=blogMasterDB
guzz.IP=localhost
guzz.maxLoad=120
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8&amp;useServerPrepStmts=true
user=root
password=root
acquireIncrement=10
idleConnectionTestPeriod=60

[updateMasterDB]
guzz.identifer=incUpdateDB1
guzz.IP=localhost
guzz.maxLoad=20
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&amp;characterEncoding=UTF-8
user=slowupdate
password=slowupdate
acquireIncrement=10
idleConnectionTestPeriod=60

[logMasterDB]
....

如果一些数据库对某些连接池支持更好,guzz设计上还允许为不同的数据源指定不同的连接池实现。

如果您需要分表,还是放弃hibernate shard或ibatis的设计模式吧,哪些只是临时拼凑出来的东西,设计上根本就不怎么样!
分享到:
评论

相关推荐

    利用arcpy按区域分切规划数据库

    在arcigs10.1中,利用arcpy按区域分切规划数据库,便于分镇数据库处理

    卷筒纸分切机x_t_零件图_机械工程图_机械三维3D设计图打包下载.zip

    在这个压缩包文件“卷筒纸分切机x_t_零件图_机械工程图_机械三维3D设计图打包下载.zip”中,我们能够获取到该设备的详细零件图和三维3D设计图,这对于理解和分析机器的构造、工作原理以及进行维修或改进具有极大的...

    行业文档-设计装置-纸卷入库分切系统中的入库分切分支装置.zip

    本设计装置专注于入库分切分支装置,其在纸卷的处理流程中扮演着至关重要的角色。 一、入库分切系统概述 入库分切系统通常包括几个主要部分:入库输送、分切装置、分支装置以及出库储存。系统的主要目标是确保纸卷...

    行业文档-设计装置-防止双面胶纸卷分切变形的分切机.zip

    为了确保产品质量和生产效率,设计一种能有效防止双面胶纸卷在分切过程中发生变形的分切机至关重要。本文将深入探讨这种特殊设计的分切机及其工作原理、主要结构、优势以及在实际操作中的应用。 首先,我们要理解为...

    自动分切系统

    1. **高效性**:该系统采用了先进的技术和设计,能够在短时间内完成分切刀的设置工作,从而显著提高整体生产效率。 2. **高品质分切**:通过精准的控制系统,保证每一次分切都达到极高的精度标准,确保产品的一致性...

    行业文档-设计装置-原纸的分切收卷机.zip

    1. **机械设计**:原纸的分切收卷机通常由放卷机构、分切装置、收卷机构、张力控制系统等部分组成。放卷机构需确保纸卷稳定释放,而收卷机构则要保证收卷的质量和速度。分切装置则根据需求将大卷原纸切割成特定宽度...

    行业文档-设计装置-水松纸分切装置.zip

    分切装置的设计与性能直接关乎到生产效率和产品质量。 一、水松纸概述 水松纸,又称接装纸,是用特定的原纸经过染色、印刷、上胶等工艺处理后制成的,主要用于卷烟的滤嘴部分,起到美观和密封作用。它的材质要求...

    惠强隔膜分切机程序_LogicLab使用手册(中文)v0.1_分切_

    《惠强隔膜分切机程序_LogicLab使用手册(中文)v0.1_分切》是一款专为惠强隔膜分切机设计的操作软件,配合设备进行高精度的隔膜分切作业。该手册提供了详尽的指导,帮助用户理解和掌握LogicLab软件的各项功能,从而...

    行业文档-设计装置-原纸分切复卷机.zip

    设计原纸分切复卷机时,需考虑设备的稳定性、耐用性和易维护性。此外,设备应具备一定的灵活性,能够适应不同厚度、宽度和材质的原纸,以及快速更换刀具和调整参数的能力。考虑到环保因素,设备的能耗和噪声控制也是...

    薄膜分切机\分切机接触辊的水平状态对PET薄膜分切的影响

    薄膜分切机\分切机接触辊的水平状态对PET薄膜分切的影响,主要研究分切机收卷辊的水平状态对收卷品质的影响

    行业文档-设计装置-纸管分切机.zip

    本文将深入探讨纸管分切机的设计原理、结构组成、操作流程以及在实际生产中的应用。 一、设计原理 纸管分切机的核心设计原理基于材料的连续切割。它通常采用刀片旋转与纸管固定运动相结合的方式,确保切割过程的...

    行业文档-设计装置-卷筒纸分切机的切刀装置.zip

    其核心部件之一就是切刀装置,这一部分的设计与性能直接影响到分切的质量和效率。本文将深入探讨卷筒纸分切机的切刀装置,包括其工作原理、主要结构、关键技术和优化方法。 切刀装置的工作原理主要是通过高速旋转的...

    行业文档-设计装置-纸张分切装置.zip

    本文档深入探讨了纸张分切装置的设计原理、工作流程、设备组成以及相关的技术参数。 首先,设计装置的核心是理解纸张分切的基本原理。这通常涉及到物理切割力学,包括切割力的计算、切割边缘的质量控制以及切割速度...

    行业文档-设计装置-一种卷筒纸分切机.zip

    本文将深入探讨卷筒纸分切机的设计原理、工作流程、关键技术以及在实际生产中的应用。 设计装置的关键在于保证分切精度和效率。卷筒纸分切机通常由以下几个主要部分组成:放卷机构、分切系统、收卷机构、控制系统...

    行业文档-设计装置-水松纸分切机.zip

    接下来,我们将详述水松纸分切机的设计原理、主要组成部分、工作流程以及在实际生产中的应用特点。 一、设计原理 水松纸分切机的核心设计基于精密的机械传动和控制系统。通过电动机驱动,将大卷的水松纸平稳地展开...

    行业文档-设计装置-纸卷入库分切系统.zip

    《纸卷入库分切系统》是一份深入探讨造纸行业中的自动化设备设计与实施的专业文档。这份资料详尽地阐述了如何构建一个高效、精准的纸卷处理系统,以实现纸卷的入库、分切和管理过程。以下是该系统涉及的主要知识点:...

    打叶复烤烟叶分切加工设备设计与应用.docx

    打叶复烤烟叶分切加工设备是烟草行业中一种重要的技术装备,主要用于解决卷烟生产中原料质量和产量结构...在设计上注重设备的稳定性、精度和自动化,确保了烟叶分切的高效和一致性,是现代烟草加工技术的重要组成部分。

    行业文档-设计装置-分切机增加纸张尾吹气机构[1].zip

    随着技术的发展,为了提高生产效率和产品质量,分切机的设计也在不断优化和升级,其中,增加纸张尾吹气机构就是一个重要的改进措施。 纸张尾吹气机构是针对分切机在切割过程中可能出现的问题进行设计的,尤其是在...

    应用MATLAB对片基带分切机纵切刀架优化设计.pdf

    根据提供的文件信息,以下是关于应用MATLAB对片基带分切机纵切刀架优化设计的知识点: 1. 片基带分切机概念及作用: 片基带分切机是一种专门用于对片基带进行定规格裁剪的加工设备。其主要用途是将宽幅的片基带...

Global site tag (gtag.js) - Google Analytics