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 ="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???????

          posted on 2007-03-05 20:42 cerulean 閱讀(1420) 評論(2)  編輯  收藏 所屬分類: DB

          評論

          # re: C-JDBC 2014-03-24 13:56 woshibobo

          你好,我參照著你的這篇文章現在用C-jdbc做一個數據庫集群,有寫問題想問你,1.現在是不是沒有linux版本的二進制安裝包了?去官網都沒又找到。
          2.所以我用windows版本的,安裝配置完以報錯Cannot find C-JDBC home directory. Please set the CJDBC_HOME environment variable.可是我已經設置過cIDBC_HOME 的啊。
          3.還有,現在 是不是都不用C——jdbc做集成了,畢竟時間這么久了。。網上也沒找到多少資料。。
          希望你看到后能給我答復!謝謝!  回復  更多評論   

          # re: C-JDBC 2014-04-16 22:49 cerulean

          @woshibobo
          抱歉,這個確實時間太久太久了,實在不確定這個還有沒有用了。應該有更流行的方案吧。
          如果單就CJDBC_HOME這個環境變量的設置問題來說,你在windows上可以再檢查一下echo %CJDBC_HOME%看看到底設置成功沒有。  回復  更多評論   

          導航

          <2014年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新竹县| 石家庄市| 根河市| 凤台县| 美姑县| 六枝特区| 洮南市| 青龙| 扎鲁特旗| 义马市| 景宁| 萍乡市| 泸州市| 古浪县| 诏安县| 安仁县| 惠水县| 图片| 阿合奇县| 旅游| 苗栗县| 巴青县| 黄梅县| 建湖县| 东台市| 安图县| 镇安县| 开阳县| 来安县| 和静县| 宜宾市| 平陆县| 五华县| 江华| 仙居县| 监利县| 拉孜县| 大宁县| 缙云县| 拉萨市| 呼和浩特市|