`
raymond2006k
  • 浏览: 293870 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HibernateShards-数据库水平分区解决方案

阅读更多
   HibernateShard
    多数据库水平分区解决方案。

1. 简介
     Hibernate 的一个扩展,用于处理多数据库水平分区架构。
     由google工程师 2007年 捐献给 Hibernate社区。 
     http://www.hibernate.org/414.html
     目前版本:   3.0.0 beta2, 未发GA版。
     条件:Hibernate Core 3.2, JDK 5.0

2. 水平分区原理
     一个库表如 Order 存在于多个数据库实例上。按特定的分区逻辑,将该库表的数据存储在这些实例中,一条记录的主键 PK,在所有实例中不得重复。
   
    水平分区在大型网站,大型企业应用中经常采用。
    目的出于海量数据分散存储,分散操作,分散查询以便提高数据处理量和整体数据处理性能。
  
    使用:
      google工程师的设计还是非常好的,完全兼容 Hibernate本身的主要接口。
      org.hibernate.Session
      org.hibernate.SessionFactory 
       org.hibernate.Criteria 
       org.hibernate.Query 

     因此程序员开发变化不大,甚至不需要关心后台使用了分区数据库。程序迁移问题不大。而且配置上比较简明。

3. 三种策略:
   1) ShardAccessStrategy, 查询操作时,到那个分区执行。
      默认提供两个实现:
      顺序策略:SequentialShardAccessStrategy, 每个query按顺序在所有分区上执行。
      平行策略:ParallelShardAccessStrategy, 每个query以多线程方式并发平行的在所有分区上执行。 此策略下,需要使用线程池机制满足特定的性能需要,java.util.concurrent.ThreadPoolExecutor。

   2) ShardSelectionStrategy, 新增对象时,存储到哪个分区。
         框架默认提供了一个轮询选择策略 RoundRobinShardSelectionStrategy, 但一般不这样使用。
        通常采用“attribute-based sharding”机制,基于属性分区。一般是用户根据表自己实现一个基于属性分区的策略类ShardSelectionStrategy ,例如,以下WeatherReport基于continent属性选择分区:
      public class WeatherReportShardSelectionStrategy implements ShardSelectionStrategy {
    public ShardId selectShardIdForNewObject(Object obj) {
        if(obj instanceof WeatherReport) {
            return ((WeatherReport)obj).getContinent().getShardId();
        }
        throw new IllegalArgumentException();
    }
}

 

   3) ShardResolutionStrategy, 该策略用于查找单个对象时,判断它在哪个或哪几个分区上。
      默认使用 AllShardsShardResolutionStrategy ,可以自定义例如:
public class WeatherReportShardResolutionStrategy extends AllShardsShardResolutionStrategy {
    public WeatherReportShardResolutionStrategy(List<ShardId> shardIds) {
        super(shardIds);
    }

    public List<ShardId> selectShardIdsFromShardResolutionStrategyData(
            ShardResolutionStrategyData srsd) {
        if(srsd.getEntityName().equals(WeatherReport.class.getName())) {
            return Continent.getContinentByReportId(srsd.getId()).getShardId();
        }
        return super.selectShardIdsFromShardResolutionStrategyData(srsd);
    }
}



4. 水平分区下的查询

   对于简单查询 HibernateShard 可以满足。

   水平分区下多库查询是一个挑战。主要存在于以下三种操作:
   1) distinct
         因为需要遍历所有shard分区,并进行合并判断重复记录。
   2) order by
         类似 1)
   3) aggregation
         count,sim,avg等聚合操作先分散到分区执行,再进行汇总。
         是不是有点类似于 MapReduce ? 呵呵。
  
   目前 HibernateShard 不支持 1), 2), 对 3) 部分支持

    HibernateShard 目前通过 Criteria 接口的实现对 聚合提供了较好的支持, 因为 Criteria 以API接口指定了 Projection 操作,逻辑相对简单。

    而HQL,原生 SQL 还不支持此类操作。

    
5. 再分区和虚拟分区
      当数据库规模增大,需要调整分区逻辑和数据存储时, 需要再分区。
      两种方式: 1)数据库数据迁移其他分区; 2) 改变记录和分区映射关系。这两种方式都比较麻烦。尤其“改变记录和分区映射关系”,需要调整 ShardResolutionStrategy。

     HibernateShard 提供了一种虚拟分区层。当需要调整分区策略时,只需要调整虚拟分区和物理分区映射关系即可。以下是使用虚拟分区时的配置创建过程:

 
  Map<Integer, Integer> virtualShardMap = new HashMap<Integer, Integer>();
virtualShardMap.put(0, 0);
virtualShardMap.put(1, 0);
virtualShardMap.put(2, 1);
virtualShardMap.put(3, 1);
ShardedConfiguration shardedConfig =
    new ShardedConfiguration(
        prototypeConfiguration,
        configurations,
        strategyFactory,
        virtualShardMap);
return shardedConfig.buildShardedSessionFactory();


6.  局限:
    1)HibernateShard 不支持垂直分区, 垂直+水平混合分区。

    2) 水平分区下 查询功能受到一定限制,有些功能不支持。实践中,需要在应用层面对水平分区算法进行更多的考虑。
    3) 不支持跨分区的 关系 操作。例如:删除A分区上的 s 表,B分区上的关联子表 t的记录无法进行参照完整性约束检查。 (其实这个相对 跨分区查询的挑战应该说小的多,也许google工程师下个版本会支持,呵呵)

    4) 解析策略接口似乎和对象ID全局唯一性有些自相矛盾,
AllShardsShardResolutionStrategy 的接口返回的是给定对象ID所在的 shard ID集合,按理应该是明确的一个 shard ID.

参考资料:HibernateShard 参考指南。
分享到:
评论
2 楼 raymond2006k 2009-09-30  
阿干就是牛, 推出的时机挺重要的。
还要和项目结合,能产生巨大的效果,就容易被大家认可。
1 楼 laurence_cao 2009-09-29  
我们天才的阿干同学N年前就写了一个iBatis sharding,只不过后来没有更多的需求,就没有往下走……

相关推荐

    快狗打车-数据库架构典型设计方案.rar

    为了有效处理这些大数据,文档可能会介绍采用分布式数据库、流处理技术以及数据仓库等解决方案。 三、分布式数据库 分布式数据库是解决大数据存储和查询性能的有效手段。可能的方案包括使用分片技术将数据分布到多...

    本科-数据库课设

    这个"本科-数据库课设"项目旨在帮助学生深入理解数据库理论,掌握数据库管理系统(DBMS)的使用,并通过实际操作提升问题解决能力。下面将详细探讨涉及的知识点。 1. 数据库概念与模型: - 数据库(Database):是...

    高并发-高负载数据库解决方案(也有针对SQL)

    总的来说,高并发高负载数据库解决方案包括了从硬件优化、架构设计到特定技术的运用,每一步都是为了应对不断增长的访问压力,保证系统的稳定性和性能。在实际应用中,需要根据业务需求和资源限制灵活选择和组合这些...

    汽车销售系统-数据库

    《汽车销售系统数据库详解》 在信息技术日益发达的今天,汽车销售系统已经成为汽车行业不可或缺的一部分,它极大...通过VC++开发的前端与精心设计的数据库相结合,能够为汽车销售行业提供高效、可靠的信息化解决方案。

    57710-数据库原理及应用教程(MySQL版)-习题答案及解析.docx(1).rar

    《数据库原理及应用教程(MySQL版)-习题答案及解析》是一份针对数据库学习者的珍贵资源,尤其适合正在学习MySQL数据库原理与应用的...通过解决其中的习题,学习者可以全面提升自己在数据库领域的理论知识和实践能力。

    Oracle 24.7技术与技巧---数据库高可用

    Oracle RAC是一种集群解决方案,允许多台服务器共享同一个物理数据库,从而提高系统的可用性和性能。RAC通过全局缓存区和互斥机制确保数据的一致性,当一台服务器出现问题时,其他服务器能够无缝接管,实现故障切换...

    oralce数据库表分区介绍

    Oracle数据库中的表分区是一种优化大型数据表查询性能的技术,它将一个大表划分为多个较小、更易管理的部分,每个部分称为一个分区。通过分区,可以显著提高数据的存储、检索和维护效率。以下是关于Oracle数据库表...

    mysql 数据库表分区

    MySQL 数据库表分区是一种优化大数据查询的技术,尤其适用于存储海量数据的应用场景。通过将大表分成更小、更易管理的部分,分区可以提高查询性能,减少数据处理的时间,并且简化数据管理和备份过程。 1. **分区...

    高并发-高负载数据库解决方案(也有针对SQL).pdf

    在构建高并发、高负载的数据库解决方案时,随着WEB网站规模的增长,数据库面临的访问压力也随之增加。为了应对这种挑战,数据库架构需要逐步扩展,以确保系统的稳定性和性能。以下是几个关键的扩展步骤: 1. 单一...

    参考资料-数据库设计.zip

    例如,使用分布式数据库、分区、读写分离等技术来处理大数据量和高并发场景。 总的来说,"参考资料-数据库设计.docx"很可能包含了以上提到的各个方面的详细介绍和实例,是学习和理解数据库设计的宝贵资源。通过深入...

    基于Greenplum Hadoop- 分布式平台的大数据解决方案18.定义数据库对象(8)-创建和装载分区表.zip

    定义数据库对象(8)-创建和装载分区表”中,我们关注的核心概念是数据库对象的管理和利用,特别是如何有效地创建和加载分区表。分区表是一种优化数据管理的技术,尤其在处理大量数据时,能显著提高查询效率和系统性能...

    计算机软件-商业源码-数据库原理及应用系统开发.zip

    - 数据库垂直拆分和水平拆分:根据业务需求调整架构,提高系统的可扩展性。 在压缩包中的“数据库原理及应用系统开发”文件中,可能包含以上各个方面的实例代码、设计文档、教程或案例研究,对于深入理解和实践...

    DBCHM-master-数据库文档生成工具,支持SqlServerMySQLOraclePostgreSQLDB2SQLite

    总的来说,DBCHM-master是一个强大的数据库文档生成解决方案,适用于多种数据库环境,能够提高数据库管理和开发的效率,降低沟通成本,是数据库从业者不可或缺的辅助工具。通过它的使用,可以显著提升数据库设计的...

    东北大学课程PPT--数据库原理

    10. **分布式数据库**:简述分布式数据库的架构,如复制、分片和分区,以及相关的挑战和解决方案。 以上内容只是基于"数据库原理"这一主题的一般性概述,实际的PPT可能会更深入地探讨每个主题,并可能包含具体的...

    软件工程概要设计文档------数据库设计说明书

    物理结构设计关注数据库在特定数据库管理系统上的实现细节,包括表空间分配、索引设计、存储方式、分区策略等,以优化查询性能和存储效率。 综上所述,数据库设计说明书详细描述了数据库从需求分析到具体实现的整个...

    (学习笔记)软考-数据库系统工程师.zip

    理解分布式数据库的复制、分区、并行处理等特性,以及云数据库的服务模式、扩展性和高可用性解决方案。 【大数据与数据仓库】 大数据处理技术,如Hadoop和Spark,以及数据仓库的概念、架构和OLAP操作也是考察点。...

    电商-数据库详细设计说明书

    5. **数据分区与分库分表**:面对海量数据,数据库可能需要进行水平拆分,将数据分散到多个数据库或表中,以实现负载均衡和性能优化。 6. **事务处理与并发控制**:电商系统中,如订单支付、库存扣减等操作需要保证...

    数据库高可用和分区解决方案-MySQL篇.docx

    ### 数据库高可用和分区解决方案—MySQL篇 #### 一、引言 随着互联网业务规模的不断扩张,数据量呈指数级增长,这对数据库的稳定性、可靠性和性能提出了更高的要求。传统的单点数据库架构难以满足现代业务的需求,...

    深入解析Oracle-数据库架构设计与性能优化实践

    《深入解析Oracle-数据库架构设计与性能优化实践》是一本专注于Oracle数据库的深度解析书籍,由数据库专家盖国强(eygle...通过阅读本书,读者可以更好地理解Oracle的工作原理,设计出更加高效和稳定的数据库解决方案。

    全国计算机等级考试-四级教程-数据库工程师(2008年版)

    根据提供的信息,我们可以总结出以下相关的IT知识点,主要聚焦于全国计算机等级考试四级教程中的数据库...通过系统地学习这些知识点,并结合历年真题进行练习,考生能够全面提升自己的专业知识水平和解决问题的能力。

Global site tag (gtag.js) - Google Analytics