`
myreligion
  • 浏览: 203987 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库分切设计何必纠结于hibernate shard模式,应该简单化了

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

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

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

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

guzz垂直切分

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

垂直分切简单配置方式:

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

        <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. 对每张表,配置应该存储到那个库里

	<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的配置文件。每个数据源配置都在一个组内,无论增加多少都清晰了然,不会名字相互冲突。

示例:
[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的设计模式吧,哪些只是临时拼凑出来的东西,设计上根本就不怎么样!
分享到:
评论

相关推荐

    Mongodb shard 简介

    MongoDB shard 是一种水平方向的多节点数据分散存储技术,它可以将大量数据分布到多个服务器上,以提高数据库的存储能力和查询效率。下面是 MongoDB shard 的一些特性和部署架构: Shard 的定义 Shard 指的是水平...

    分布式数据库模式与反模式介绍.pptx

    分布式数据库模式与反模式在当前IT环境中至关重要,随着开源化趋势的发展和微服务模式的兴起,分布式数据库成为了应对大数据量和高并发需求的主要解决方案。然而,这也带来了诸多挑战,如如何弹性扩展、保证系统可用...

    Mongodb数据库

    MongoDB 分布式数据库集群是一种可以水平扩展的模式,它可以满足大规模应用的需求。在这种架构中,数据被分配到多个服务器上,每个服务器都是一个独立的mongod实例。这种架构可以提供高可用性和高性能,非常适合大...

    shard-源码.rar

    本文将深入探讨Shard-源码,揭示其背后的设计思想和技术实现,帮助读者理解如何在实际项目中运用ShardingSphere等开源框架进行数据库分片。 一、Sharding的基本原理 Sharding的核心思想是将一个庞大的数据库分为多...

    数据库内核深植于场景需求混布数据库:Hubble.pdf

    4. **数据价值变化**:数据的实时性越来越重要,从仅用于决策层的离线分析到服务于整个业务流程的实时分析,数据的价值得以最大化。 二、Hubble的HTAP特性 Hubble作为HTAP数据库的代表,实现了在同一个系统中同时...

    Polygon_unity3d_多边形shard_

    在Unity3D游戏引擎中,"Polygon_unity3d_多边形shard_"这个主题主要涉及到了如何创建和操作多边形图形。多边形是3D图形的基础元素,通常用于构建复杂的3D模型。在Unity3D中,我们可以使用各种技术来生成和编辑多边形...

    nosql分布式数据库期末考试题.docx

    - **非关系数据库**: 指的是不采用表格形式来组织数据的数据库类型,通常用于处理大量非结构化或半结构化数据。 **2. 数据库语言分类** - **数据定义语言 (DDL)**: 用于定义数据库结构的语言,如创建、修改和删除...

    elasticsearch数据库

    作为NoSQL数据库的一种,Elasticsearch设计之初的目标就是实现分布式、可扩展且具有高可用性的搜索解决方案。其核心功能包括全文检索、结构化搜索、数据分析和实时数据流处理。 ### 1. 全文检索 Elasticsearch对...

    Ruby-ActiveRecordTurntable是一个数据库分片的ActiveRecord扩展

    **Ruby-ActiveRecord Turntable:数据库分片的ActiveRecord扩展** 在现代的Web应用程序中,随着数据量的增长,单个数据库可能无法满足高效处理和存储的需求。这时,数据库分片技术应运而生,它将数据分布在多个...

    mysql 分库分表查询工具-shard.zip

    而 shard.zip 文件中包含的 "shard" 工具,正是为了帮助开发者在分库分表的环境中进行高效查询而设计的。 Shard 工具的核心功能在于提供了一种方式来管理和协调跨多个数据库和表的查询。它通过特定的路由规则,将...

    一步步搭建基于RedHat 7 Oracle 12c Sharding

    - Shard目录(Shard Catalog):一个Oracle数据库,支持自动化的shard部署,集中管理分片数据库,以及多shard查询。 - Sharding导演器(Shard Directors):网络监听器,允许基于分片键的高性能连接路由。 - 连接池...

    shard-testtesttesttest

    在IT行业中,"shard"一词通常与数据库分片技术相关,这是一项用于扩展数据库性能和可伸缩性的策略。"test"标签可能表明这是一个测试环境或涉及测试过程的项目。"sendinfo-paas-shared"可能是项目中的一个模块或者...

    cloud-shard-jdbc:SpringCloud实现基于Shard-jdbc分库分表模式下,数据库扩容解决办法

    阅读标签 【】【】【】【】【】 【】【】【】【】【】 【】【】【 】 参考文章 序号 文章标题 01 02 微服务基础:Ribbon和Feign组件,实现请求负载均衡 ...基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方

    android shard分享

    在Android开发中,"android shard分享"涉及到的是应用内实现社交分享功能的技术。"shard"在这里可能是"shared"的误拼,指的是共享或分享。ShareSDK是为Android开发者提供的一种便捷的社交分享解决方案,它整合了众多...

    混布数据库Hubble技术概述.pptx

    混布数据库Hubble是一种针对现代数据处理挑战而设计的创新技术,它主要解决了大数据时代下数据量级、种类和价值的变化。Hubble的核心在于混合事务分析处理(HTAP),这使得它能够在同一份数据上同时支持在线事务处理...

    金山云分布式数据库DragonBase架构详解和实践.pptx

    该产品在设计上遵循了数据库系统的发展趋势,包括云原生、分布式、多模计算以及软硬一体化。 1. **分布式数据库发展背景** - **商业进阶**(1980~1990):这一阶段,大型数据库管理系统如Oracle、IBM DB2、SQL ...

    mongoDB分布式文件存储的数据库

    `db.copyDatabase()`和`mongoshard`命令则用于数据库的复制和分片操作。 在提供的`mongodb_demo.php`文件中,我们可以看到PHP对MongoDB的操作示例。PHP的MongoDB驱动允许开发者通过PHP代码与MongoDB进行交互。例如...

    分布式数据库的架构分析.docx

    MPP 数据库设计用于执行复杂的分析查询,而 Sharding 更侧重于提高在线事务处理 (OLTP) 的性能。 - **Oracle 的技术路径** Oracle 认为其现有的 RAC 技术足以应对大多数 OLTP 需求,并通过引入 In-Memory DB 来...

Global site tag (gtag.js) - Google Analytics