cerulean

C-JDBC

C-JDBC(Java 数据库连接群集)作为开发源码的数据库群集中间件,可以让任何应用程序通过JDBC能够透明的访问数据库群集。数据库可以分布在多个节点并可以进行数据复制,C-JDBC能够均衡在这些节点之间的查询负载。 C-JDBC通过软件来实现RAIDb(廉价数据库冗余阵列)。C-JDBC是GNU LGPL许可证下的ObjectWeb项目。
http://c-jdbc.objectweb.org/网站上的C-JDBC-Brochure-EN.pdf写的内容挺好。(C-JDBC)tutorial.pdf内容也挺翔实。

大型应用随着用户量访问越来越大,增加数据库存储和做好数据库冗余可以增加系统的可靠性和性能。

无需修改客户端应用程序,无需变更应用服务器或数据库服务器软件。C-JDBC的JDBC driver把SQL请求转给C-JDBC controller(负责在databases之间做负载均衡)
The database is distributed and replicated among several nodes and C-JDBC load balances the queries between these nodes.
就这一句话就太诱人了!

上周的某一个上午,搞定C-JDBC的安装配置啦~
主要根据官方的user guide和这篇好文: http://huaronghu.spaces.live.com/blog/cns!B9A68E1C1CA857AD!288.entry


准备工作:
环境:windows,postgreSQL,JDK
建立数据库“们”,安装若干db在若干server上,所以如果使用商业数据库的话,就会需要好几套的钱哪。
安装C-JDBC:
下载了binary版的c-jdbc-2.0.2-bin.zip,解压到作为C-JDBC server的机器上(e.g. C:\software\c-jdbc-2.0.2-bin),
设置环境变量,新增系统变量:CJDBC_HOME =C:\software\c-jdbc-2.0.2-bin
把实际使用的数据库的JDBC driver(例如mysql-connector-java-3.1.12-bin.jar ,postgresql-8.0.309.jdbc2.jar)拷贝到c-jdbc/drivers 中

配置文件:
在c-jdbc-2.0.2-bin/config/virtualdatabase目录中创建虚拟数据库配置文件。
里面DatabaseBackend 标签中定义的就是被集群的数据库。
试验时,创建了文件:postgresql-raidb1-distribution.xml,使用了2个postgreSQL数据库,采用了全复制的方法。
注意,如果采用全复制,所以在2个数据库上建库、建表的全部脚本都要完全相同,否则将会报出mismatch的错误。
目前感觉配置里面最有用的配置就是<AuthenticationManager>,<DatabaseBackend>和<LoadBalancer>(还没有仔细看)。
配置时可以参考已经提供的例子,c-jdbc-2.0.2-bin/config/RAIDb-1-full-example.xml,里面对每一个属性都有比较详细的注释,DatabaseBackend中还有各个开源数据库连接的例子,挺贴心的。

<? xml version="1.0" encoding="UTF8" ?>
<! DOCTYPE C-JDBC PUBLIC "-//ObjectWeb//DTD C-JDBC 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-2.0.2.dtd" >

< C-JDBC >
  
  
< VirtualDatabase  name ="myDB"  maxNbOfConnections ="20"  minNbOfThreads ="1"  maxNbOfThreads ="20"  blobEncodingMethod ="hexa" >
    
< AuthenticationManager >
      
< Admin >
       
< User  username ="admin"  password ="c-jdbc" />
      
</ Admin >  
      
< VirtualUsers >
        
< VirtualLogin  vLogin ="boss"  vPassword ="boss" />
      
</ VirtualUsers >
    
</ AuthenticationManager >

   
< DatabaseBackend  name ="postgreSQLNode114"  driver ="org.postgresql.Driver"  url ="jdbc:postgresql://10.10.0.114:5432/clusterdb"  connectionTestStatement ="select now()" >
 
< DatabaseSchema  dynamicPrecision ="column" />
      
< ConnectionManager  vLogin ="boss"  rLogin ="postgres9"  rPassword ="12345" >
 
< RandomWaitPoolConnectionManager  poolSize ="20" />
      
</ ConnectionManager >
    
</ DatabaseBackend >

    
< DatabaseBackend  name ="postgreSQLNode155"  driver ="org.postgresql.Driver"  url ="jdbc:postgresql://10.10.0.155:5432/clusterdb"  connectionTestStatement ="select now()" >
 
< DatabaseSchema  dynamicPrecision ="column" />
      
< ConnectionManager  vLogin ="boss"  rLogin