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中還有各個開源數據庫連接的例子,挺貼心的。





















































?
在c-jdbc-2.0.2-bin/config/controller目錄中創建一個c-jdbc controller的配置文件。
試驗時,創建的配置文件為:uud-controller-distributed.xml











?
注意: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 壞掉帶來的風險。
例如:




然后可以在代碼中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???????
posted on 2007-03-05 20:42 cerulean 閱讀(1420) 評論(2) 編輯 收藏 所屬分類: DB