当前位置: 首页 > 工具软件 > C-JDBC > 使用案例 >

C-JDBC:可扩展的数据库集群中间件

萧永望
2023-12-01

  摘要:多层软件结构中已经成功地应用了集群,但在后台数据库上还缺乏这种工具,所以当数据库层出现瓶颈时,就得在硬件上花费高额的费用。开源数据库集群中间件——C-JDBC解决了上述问题。它通过JDBC接口引进了一个虚拟数据库,只要基于拥有JDBC驱动的数据库上面的应用程序,程序无须任何改动就能运行。C-JDBC具有灵活的体系结构,支持大型复杂的数据库集群体系结构,为数据库集群提供的高性能、强容错能力、易用的平台。
  关键词:Java数据库连接;集群;中间件;数据库
  中图分类号:TP319文献标志码:A
  文章编号:1001-3695(2007)05-0094-03
  
  在科学计算中,由普通机器组成的集群已经在很大程度上代替了大型机。这是因为集群有着出众的性价比,这已经在Web服务器和应用服务器上的应用很好地体现出来了。在数据服务环境中,虽然集群也提供了高性能和强容错能力,但是这方面的工具就少得多,并且主要是面向大企业的解决方案。商务解决方案如Oracle Real Application Clusters,已经开始从事应用共享存储系统;IBM的DB2 Integrated Cluster环境中应用了网络共享存储;而在开源阵营的数据库集群方面,MySQL复制技术应用主从机制来实现。这些技术一个明显的缺点就是为了实现集群的特性,必须扩展数据库引擎,所以应用程序要用一些额外的API,并且这些不同技术的不同实现,很难相互协作。
  C-JDBC是一个开源的、建立在普通硬件上的数据库集群中间件,它隐藏了集群的复杂性,为应用程序提供一个单一的数据库视图。客户端程序不用修改,就可透明地访问数据库集群;只要RDBMS提供了JDBC驱动,C-JDBC就可以工作;分布式装载、错误容忍、错误恢复全部由C-JDBC来处理;其具有可塑的体系结构,能支持分布式大型异质的数据库集群,对不同程度的性能、错误容忍度和高效性进行协调。
  本文从体系结构、容错能力、所支持的集群结构、性能对比这几个方面对C-JDBC进行了研究。
  
  1C-JDBC体系结构
  
  1.1功能总览
  C-JDBC是基于JDBC的数据库集群Java中间件,它能使一系列不同质的数据库转换成一个统一的虚拟数据库(Virtual Database)。在集群中数据同步时,数据拷贝的方式有完全拷贝、部分拷贝,复制的程度和定位都是以表为基本单位。但是,目前在详细查询中,表必须存在于一个后台数据中,不能让一个表拆分成两个部分存储到两个后台数据库中。
  数据操作时,依据Read-one Write-all的原则,由C-JDBC统一向各个后台数据库分配操作;C-JDBC有多种平衡装载策略,并且用户可以重载这些策略;利用查询结果Cache机制,提高性能;可对多种容错机制进行选择。C-JDBC还提供了其他服务,如监控和日志等功能,管理平台通过JMX来实现监控。而对于那些大型高性能的系统,还可以实现C-JDBC嵌套集群。
  
  1.2体系结构
  图1是C-JDBC的总体结构图。它实现了数据库规范中所规定的JDBC驱动并且提供了与JDBC相同的接口,客户端通过C-JDBC和C-JDBC控制器(Controller)进行交互。C-JDBC 控制器是一个Java组件,是介于C-JDBC驱动与数据库后台之间的代理。控制器为C-JDBC驱动和应用程序提供一个虚拟数据库。一个控制器可以包含多个虚拟数据库,每个虚拟数据库拥有一个请求管理器(Request Manager)用来调度请求和实现装载平衡策略。而数据库后台则是通过它们本身的JDBC驱动来实现访问的。即使本身的驱动没有实现连接池的功能,C-JDBC也可以通过提供一个连接管理器来实现连接池的功能。
  这里将深入研究C-JDBC体系结构的关键组件,即C-JDBC驱动和请求管理器,而其他组件如授权管理、链接管理、配置支持等不作讨论。
  
  1.3C-JDBC驱动
  C-JDBC驱动混合了类型3和类型4的JDBC驱动,它实现了JDBC 2.0规范和JDBC 3.0规范中一些扩展的功能。在驱动端执行的功能都已经内置到C-JDBC驱动中了。比如,当一条SQL语句在一个后台执行时,所返回的结果被序列化成C-JDBC驱动的结果集。当被序列化的结果集被送到C-JDBC驱动反序列化处理后,客户端才能浏览。
  所有与数据库相关的操作都被转发到C-JDBC控制器处,由控制器转发到数据库原生驱动器来处理。C-JDBC驱动器对于不同结构的数据库集群的错误恢复都是透明的。
  
  1.4请求管理
  请求管理包含了C-JDBC控制器的核心功能。它由调度组件、装载平衡组件以及两个可选组件(即恢复日志组件和结果缓存组件)所组成。
  1.4.1调度器
  每当C-JDBC驱动发出一个请求,请求在虚拟数据库的配合之下,通过请求管理器决定执行操作。例如,新建事务、提交或者是取消操作;发送读操作到一个后台;更新所有受影响的后台;对一部分或是对全部的后台数据库进行部分拷贝或完全拷贝;对于含有rand()或now()的SQL查询语句进行计算,而保证各后台数据库数据一致性。只有当请求管理器收到所有后台数据库对操作发回正确的回应时,才会向客户端发出一条响应。
  当执行更新操作时,如果某一后台出错或者取消操作时,对于集群来说,这一操作就是无效的。应当注意的是,C-JDBC不是用的两阶段锁协议,而是它提供了一个能在虚拟数据库中自动恢复错误的工具。
  1.4.2查询结果缓存机制
  查询结果缓存机制可以用来存放查询结果,以此来辅助每一次查询。查询结果缓存机制减少了查询响应的时间。缓存机制具有灵活的机制来确保数据一致性。换句话说,C-JDBC在查询缓存中执行了更新操作后,将对缓存实体打上无效的标志。灵活性体现在缓存的一致性的原则由用户来定义。为了满足不同性能要求,可以定义查询操作在某一限定的时间内可用缓存中的数据,即使它是陈旧的数据;还可以定义缓存实体在什么条件下被标志成无效。这些条件可以是当数据库变动、表变动和列变动三种不同的粒度。

  1.4.3装载平衡器
  当缓存中没有所需要装载的数据时,或者缓存中的数据无效时,请求就转发到装载平衡器处。
  C-JDBC控制器根据设定的复制方式来提供不同的装载平衡。完全复制是一种易于处理的方法。虽然各个后台数据库都能够处理查询,但是当数据库更新时,就必须对各个后台就行操作,当后台数据库增多时就会遭遇到性能上的瓶颈。所以这种方式并不是最好的方式。为了解决这个问题,C-JDBC提供了基于用户自定义的数据库表复制的部分复制机制。装载平衡通过操作请求的解析,并依据由后台数据库同步而来的数据结构(Schema)来达到部分复制的功能。C-JDBC控制器动态收集后台数据库的数据结构。当后台可用时,C-JDBC控制器就会调用JDBC中的方法,通过数据库生产商提供的驱动程序读取数据库元数据。当SQL语句中执行了Create、Drop等语句正确地反映在各个后台时,数据库结构信息就会动态更新。
  C-JDBC控制器依据动态装载算法,选择后台数据库来执行操作语句。目前C-JDBC上所实现的动态装载算法有:循环选择和权重循环。
  
  2容错性

  C-JDBC为了提高容错能力,对客户端屏蔽容错功能,在C-JDBC控制器中提供了检查点(Checkpoint)和恢复日志两种工具。当后台数据库发生错误时,或者某一后台数据库执行备份后,可以结合检查点和恢复日志自动使后台数据库重新达到正确的状态。
  
  2.1检查点
  检查点就是虚拟数据库在执行时的某一时刻。检查点可由管理人员设置也可由系统依据时间规则自动设置。
  在后台数据库执行备份时,C-JDBC会要求这个后台停止运行,所以这段期间就不能对该后台进行更新操作。但是其他后台仍然要服务于客户端。由于在同一个虚拟数据库中的不同后台需要保持一致性,在备份一个后台时,该后台要求锁住所有的表,进入只读的模式,挂起该后台所有的更新操作。但这种情况对于进行一次备份需要几个小时的大型数据库来说是不可行的。C-JDBC引进检查点的概念,就是在执行备份或者在特定设定的时间点时,在恢复日志中插入一个所谓检查点的标志;然后,所有对该后台数据库操作就会被记录下来。当该后台数据库重新启动时,就会从这一个检查点开始,依次执行所有操作,从而恢复到一致的状态。
  
  2.2恢复日志
  C-JDBC提供了恢复日志。恢复日志实体记录了操作的起始、提交、取消以及更新的各种细节,日志实体中还包括了用户标志符、事务标志符和SQL语句。日志可以以文件的形式存储,当然也可以通过JDBC存储到数据库中。当错误发生时,以创建好的容错日志传输给C-JDBC的虚拟数据库,进行日志更新,从而更正错误。
  
  3C-JDBC扩展方式
  
  单一的C-JDBC控制器还是存在潜在的出错可能性。横向扩展C-JDBC控制器就降低了这种潜在的可能性。当然也提供了垂直扩展来建立一种多层次的后台,以满足拥有大量数据库后台的系统。
  
  3.1C-JDBC横向扩展
  横向扩展提高了C-JDBC控制器的容错能力。C-JDBC应用JGroup来同步不同控制器中的虚拟数据库。当一个虚拟数据库被一个控制器装载时,虚拟数据库被赋予一个组名,分布在不同控制器中的虚拟数据库就依据组名来交换信息。在初始阶段,各个控制器之间交换各自的后台数据库配置信息。如果有一个控制器失败,则后台必须重新执行同步。而C-JDBC依靠JGroup消息来同步Write请求和划分事务。
  
  3.2C-JDBC垂直扩展
  有时可能需要在C-JDBC控制器中嵌套使用控制器。例如,第一级的控制器部分复制了三个后台数据库,这三个后台数据库都是由其他C-JDBC控制器实现的虚拟数据库。在第一级控制器对数据库访问时,第二级的C-JDBC驱动被当做原生驱动了。垂直扩展可应用于大量数据库后台的情况。
  当然,还可以进行横向与垂直混合的扩展。总的来说,任意结构的C-JDBC控制器树都是可以创建的。但是这种情况需要考虑JVM对外连接数目以及性能问题。
  
  4性能测试
  
  基于对C-JDBC结构的了解,以下用具体的实验数据来分析C-JDBC集群的性能。搭建了测试环境,对测得的不同实验数据进行分析。
  
  4.1测试实验
  测试数据为每条记录600 Bytes,客户端分别采用三种不同方式访问数据库:①ODBC直连方式访问一台Oracle数据库;②ODBC线性方式访问三台Oracle数据库;③ODBC-JDBC 桥接加C-JDBC方式访问三台Oracle数据库。其中C-JDBC测试中所采用的控制器结构为单控制器结构,就是一个控制器下连接着三台Oracle数据库。
  
  4.2测试环镜
  
  4.3测试结果分析
  从表1中的测试数据,可以得到以下结论:
  (1)使用ODBC直连方式访问单台数据库的速度是最理想的。
  (2)使用ODBC直连方式线性访问三台数据库的速度基本上是访问单台数据库的速度叠加。
  (3)使用C-JDBC方式将三台Oracle数据库组成集群。C-JDBC控制器的多播方式将插入请求分发到三台数据库,速度位于前两种方式之间。随着插入数据量的增大,这种方式的插入速度更加理想,逐渐靠近使用ODBC直接访问单台数据库的性能。
  在实验中,C-JDBC不会消耗系统太多的资源。在测试中,随着插入数据量的增大,内存的使用率也稳定在2.7%。但实验中也暴露了一些有待解决的问题。C-JDBC和Oracle Blob不兼容;Oracle的Blob实现采取了特别的设计;只有在获得Cursor后才可以对Blob插入,这一点与标准JDBC的setBlob方法不兼容;再则就是多控制器的数据同步时还不稳定,有时数据会出现错误。

  5结束语
  
  C-JDBC是一个易扩展、高效率的数据库集群中间件。通过使用标准的JDBC接口,使用C-JDBC而无须修改应用程序、数据库引擎。C-JDBC混合了水平和垂直扩展,从而使数据库可以分布在多个节点并能进行数据部分复制,很好地解决了大型数据库复制的问题;不仅如此,C-JDBC还可以平衡这些节点之间的查询负载,提高了查询速度,改进了查询性能,能很好地应用于研究和工业领域。
  
  参考文献:
  [1]CECCHET E, MARGUERITE J,PELTIER M,et al.C-JDBC user’s guide [R].[S.l.]:French National Institute for Research in Computer Science and Control (INRIA) Emic Networks,2005:1-77.
  [2]BORNHVD C, ALTINEL M, MOHAN C,et al.Adaptive database caching with DBCache [J]. Data Engineering,2004,27(2):11-18. 
  [3]CECCHET E. C-JDBC:a middleware framework for database clustering [J].Data Engineering,2004,27(2):19-26.
  [4][EB/OL].[2006-02].http://www.objectweb.org/.
  [5]LIN Yi,KEMME B,PATINO-MARTINEZ M,et al. Middleware based data replication providing snapshot isolation[EB/OL].[2005-06].http://acm.lib.tsinghua.edu.cn.
  [6]SIVASUBRAMANIAN S,ALONSO G,PIERRE G,et al.GlobeDB: autonomic data replication for Web applications[EB/OL].[2005-03].http://acm.lib.tsinghua.edu.cn.

 类似资料: