设为首页 收藏本站
查看: 838|回复: 0

[经验分享] C-JDBC

[复制链接]

尚未签到

发表于 2016-11-22 06:26:14 | 显示全部楼层 |阅读模式
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 ="postgres"  rPassword ="abcde" >
  < RandomWaitPoolConnectionManager  poolSize ="20" />
       </ ConnectionManager >
     </ DatabaseBackend >

     < RequestManager >
       < RequestScheduler >
          < RAIDb-1Scheduler  level ="passThrough" />   
       </ RequestScheduler >

       < RequestCache >
          < MetadataCache  maxNbOfMetadata ="10000"  maxNbOfField ="0" />
          < ParsingCache  backgroundParsing ="false"  maxNbOfEntries ="5000" />   
          < ResultCache  granularity ="table"  maxNbOfEntries ="100000"  pendingTimeout ="0" >
        < ResultCacheRule  queryPattern ="default"  timestampResolution ="1000" >
              < EagerCaching />
          </ ResultCacheRule >
          </ ResultCache >
       </ RequestCache >

       < LoadBalancer >
          < RAIDb-1 >
          < RAIDb-1-LeastPendingRequestsFirst />   
          </ RAIDb-1 >
       </ LoadBalancer >         
     </ RequestManager >
   </ VirtualDatabase >
</ C-JDBC >
  在c-jdbc-2.0.2-bin/config/controller目录中创建一个c-jdbc controller的配置文件。
试验时,创建的配置文件为:uud-controller-distributed.xml

<? xml version="1.0" encoding="UTF8"  ?>
<! DOCTYPE C-JDBC-CONTROLLER PUBLIC "-//ObjectWeb//DTD C-JDBC-CONTROLLER 2.0.2//EN"  "http://c-jdbc.objectweb.org/dtds/c-jdbc-controller-2.0.2.dtd" >
< C-JDBC-CONTROLLER >
   < Controller  port ="25322" >
     < Report />
     < JmxSettings >
       < RmiJmxAdaptor  port ="1091" />
     </ JmxSettings >
     < VirtualDatabase  configFile ="postgresql-raidb1-distribution.xml"  virtualDatabaseName ="myDB"  autoEnableBackends ="true"  checkpointName ="Initial_empty_recovery_log" />
   </ Controller >
</ C-JDBC-CONTROLLER >  注意:Controller和VirtualMachine的配置文件不能采用相同的文件名
启动:
在c-jdbc-2.0.2-bin\bin目录下,运行controller.bat -f ../config/controller/uud-controller-distributed.xml
unix用户使用controller.sh来启动controller
截图:(下回补)
凑合看一下吧,控制台的正常输出:
C:\software\c-jdbc-2.0.2-bin\bin>controller.bat -f ../config/controller/uud-cont
roller-distributed.xml
2007-03-07 15:16:44,017 INFO  controller.core.Controller C-JDBC controller (2.0.
2)
2007-03-07 15:16:44,439 INFO  controller.core.Controller Loading configuration f
ile: ../config/controller/uud-controller-distributed.xml
2007-03-07 15:16:44,752 INFO  controller.core.Controller JMX is enabled
2007-03-07 15:16:44,830 INFO  controller.core.Controller Starting JMX server on
host: 10.10.0.155
2007-03-07 15:16:46,376 INFO  backend.DatabaseBackend.postgreSQLNode114 Adding c
onnection manager for virtual user "boss"
2007-03-07 15:16:46,501 INFO  backend.DatabaseBackend.postgreSQLNode155 Adding c
onnection manager for virtual user "boss"
2007-03-07 15:16:46,642 INFO  controller.RequestManager.myDB Request manager wil
l parse requests with the following granularity: TABLE
2007-03-07 15:16:46,657 WARN  controller.virtualdatabase.myDB No recovery log ha
s been configured, enabling backend without checkpoint.
2007-03-07 15:16:48,641 INFO  backend.DatabaseBackend.postgreSQLNode114 Detected
backend as: PostgreSQL
2007-03-07 15:16:49,063 WARN  backend.DatabaseBackend.postgreSQLNode114 Statemen
t.getGeneratedKeys not supported.
2007-03-07 15:16:49,579 INFO  backend.DatabaseBackend.postgreSQLNode114 Gatherin
g database schema
2007-03-07 15:16:49,782 INFO  controller.RequestManager.myDB Setting new virtual
database schema.
2007-03-07 15:16:49,782 INFO  cjdbc.controller.cache Setting new database schema
.
2007-03-07 15:16:49,782 INFO  controller.loadbalancer.RAIDb1 Adding blocking tas
k worker thread for backend postgreSQLNode114
2007-03-07 15:16:49,797 INFO  controller.loadbalancer.RAIDb1 Adding non blocking
task worker thread for backend postgreSQLNode114
2007-03-07 15:16:49,797 INFO  controller.RequestManager.myDB Database backend po
stgreSQLNode114 is now enabled
2007-03-07 15:16:50,922 INFO  backend.DatabaseBackend.postgreSQLNode155 Detected
backend as: PostgreSQL
2007-03-07 15:16:51,328 WARN  backend.DatabaseBackend.postgreSQLNode155 Statemen
t.getGeneratedKeys not supported.
2007-03-07 15:16:52,172 INFO  backend.DatabaseBackend.postgreSQLNode155 Gatherin
g database schema
2007-03-07 15:16:52,390 INFO  controller.RequestManager.myDB Virtual database sc
hema merged with new schema.
2007-03-07 15:16:52,390 INFO  cjdbc.controller.cache Merging new database schema
  2007-03-07 15:16:52,390 INFO  controller.loadbalancer.RAIDb1 Adding blocking tas
k worker thread for backend postgreSQLNode155
2007-03-07 15:16:52,390 INFO  controller.loadbalancer.RAIDb1 Adding non blocking
task worker thread for backend postgreSQLNode155
2007-03-07 15:16:52,406 INFO  controller.RequestManager.myDB Database backend po
stgreSQLNode155 is now enabled
2007-03-07 15:16:52,422 WARN  VirtualDatabaseWorkerThread.myDB.metadata Metadata
key [getMaxColumnsInIndex] is not compatible. (Backends are: [jdbc:postgresql:/
/10.10.0.114:5432/clusterdb] and [jdbc:postgresql://10.10.0.155:5432/clu
sterdb] ; Values are:[32] and [0])
2007-03-07 15:16:52,422 INFO  controller.core.Controller Adding VirtualDatabase
myDB
2007-03-07 15:16:52,437 INFO  controller.core.Controller Waiting for connections
on 0.0.0.0:25322
2007-03-07 15:16:52,469 INFO  controller.core.Controller Controller started on 2
007.03.07 10 at 03:16:52 下午 GMT+08:00
2007-03-07 15:16:52,484 INFO  controller.core.Controller Controller 10.10.0.
155:25322 ready, listening to requests ...
  
遇到过的问题:
1、
刚启动没一会儿,就看到config文件读取错误,控制台信息也就此结束。
解决方法:controller.bat -f filename中filename的相对路径和文件名竟然都写错了,汗。。。。
2、
启动时,控制台抛出ERROR以及exception,大意是connection failed, IP没有配置到pg_hba.conf中
解决方法:虽然是连本机的一个数据库,但是由于数据库连接的url里面写的是IP地址,所以仍然要把本机的IP地址配置到pg_hba.conf以允许其访问。
3、
还是启动时抛错了,Connection test failed(org.postgresql.util.PSQLException:Backend start-up failed:FATAL:role "boss_user" does not exist.)
解决方法:原来是在自己写的.xml配置文件中,DatabaseBackend标签里面写的用户名和密码需要是真实数据库的真实用户名和密码。
  最后都整好了,但是遇到一个warn的log:
backend.DatabaseBackend.postgreSQLNode155 Statement.getGeneratedKeys not supported
至今不知道是什么问题,有什么影响.
代码部分:
只需要修改应用程序用到的jdbc driver的配置,把c-jdbc/drivers/目录下的c-jdbc-driver.jar拷贝到应用程序的工程里,并加入到class-path中。
之前是使用 Class.forName("com.somevendor.jdbcDriver.Driver") 去连接某特定的数据库
现在是使用 Class.forName("org.objectweb.cjdbc.driver.Driver") 统一处理。
连接字符串:DriverManager.getConnection("jdbc:cjdbc://localhost:25322/mycjdbc") 取得数据库连接。
  c-jdbc server称为c-jdbc controller,聆听请求们
其他所有通过c-jdbc来访问的DB们称为db backends.
  jdbc:cjdbc://host1:port1,host2:port2/database
host是指跑着c-jdbc controller的机器IP,port是指controller监听客户端链接的端口,默认端口号:25322
注意,不仅真正的DB安装多个在多个机器上,c-jdbc controller也可以安在不同的机器上,这样可以防止一个c-jdbc 坏掉带来的风险。
例如:

Class.forName( " org.objectweb.cjdbc.driver.Driver " );
DriverManager.getConnection( " jdbc:cjdbc://c1.objectweb.org,c2.objectweb.org/tpcw " );  // 不验证用户名密码
DriverManager.getConnection( " jdbc:cjdbc://host/db?user=me&password=secret " ) // 验证用户名密码的写法1
DriverManager.getConnection( " jdbc:cjdbc://host/db;user=me;password=secret " ) // 验证用户名密码的写法2  然后可以在代码中insert/update几个记录,再单独到各个数据库中去查一下,应该都受到影响就对了。
问题:
1、管理C-JDBC,不知道C-JDBC需要啥管理,不过好像是已經有一個簡單的 Desktop Application 可以控制相關的 administration 介面, 最重要的是, 他結合了 JMX , 可以讓整個監控的環境更完整.. (等待尝试)
2、不知道通过C-JDBC来操作速度如何
3、RAIdb的3种类型,采取哪个更好?把表分开在不同server上对联表查应该不会有影响吧?
其他:
1、Configuring C-JDBC with Jakarta Tomcat
Copy the c-jdbc-driver.jar file to the lib directory of your web application (for example: $TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib).
There are many ways to obtain connections from a Tomcat application. Just ensure that you are using org.objectweb.cjdbc.driver.Driver as the driver class name and that the JDBC URL is a C-JDBC URL
  2、Configuring C-JDBC with Hibernate
C-JDBC just has to be defined as any JDBC driver in Hibernate, leaving the syntax set to the proper database. Here is a configuration example to use Hibernate with a C-JDBC cluster made of Sybase backends:
## C-JDBC
hibernate.dialect                 net.sf.hibernate.dialect.SybaseDialect
hibernate.connection.driver_class org.objectweb.cjdbc.driver.Driver
hibernate.connection.username     user
hibernate.connection.password     pass
hibernate.connection.url          jdbc:cjdbc://localhost:25322/test

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303620-1-1.html 上篇帖子: 什么是Unix时间戳?(转载) 下篇帖子: Unix时间戳(Unix timestamp)转换
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表