Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

          使用 C-JDBC 給 Mysql 集群

          原文:http://huaronghu.spaces.live.com/blog/cns!B9A68E1C1CA857AD!288.entry

          使用 C-JDBC 給 Mysql 集群 
          潤(rùn)名,Thursday Twentieth Of April    
          一、前言  
                   cjdbc ( http:
          //c-jdbc.objectweb.org/ ) 是一個(gè)open source的數(shù)據(jù)庫(kù)集群中間件,任何基于jdbc的應(yīng)用都可以通過(guò)它透明地訪問(wèn)數(shù)據(jù)庫(kù)集群,它可以進(jìn)行各個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)復(fù)制,并且可以實(shí)現(xiàn)各個(gè)節(jié)點(diǎn)的查詢負(fù)載均衡。通過(guò)這樣的軟件,偶們可以方便的實(shí)現(xiàn)RAIDb - Redundant Array of Inexpensive Database 廉價(jià)數(shù)據(jù)庫(kù)冗余陣列。
                  大型應(yīng)用隨著用戶量訪問(wèn)越來(lái)越大,增加數(shù)據(jù)庫(kù)存儲(chǔ)和做好數(shù)據(jù)庫(kù)冗余可以增加系統(tǒng)的可靠性和性能。

                  下面利用cjdbc,把兩臺(tái)對(duì)等的 Mysql 做 RAIDb,本文假定你已經(jīng)搭建好兩臺(tái)對(duì)等的 Mysql環(huán)境并建好一個(gè)需要做集群冗余的數(shù)據(jù)庫(kù) clusterdb。 
           
          二、配置環(huán)境  
          Mysql: 
          5.0.19, 并使用 InnoDB 作為 Mysql 引擎

          C
          -jdbc: 2.0.2

          Jdk: 
          1.5 
           
          三、選擇合適的 C
          -JDBC RAIDb 機(jī)制  
          cjdbc有幾種RAIDb的機(jī)制可以選擇,如RAIDb
          -0,RAIDb-1等等,可以根據(jù)不同的情況選擇不同的RAIDb的機(jī)制。各種 RAIDb的機(jī)制詳情請(qǐng)查看 cjdbc 的文檔和 Demo。

          RAIDb
          -1有如下功能:
          完全鏡像處理機(jī)制,每個(gè)節(jié)點(diǎn)上都有完整的數(shù)據(jù)庫(kù)結(jié)構(gòu),這種方式提供了最好的容錯(cuò)處理,并且通過(guò)設(shè)置合理的Loading Balance策略,可以帶來(lái)查詢性能相當(dāng)好的提高。但是由于對(duì)于任何的寫(xiě)操作(create
          /update/delete),需要在各個(gè)節(jié)點(diǎn)上進(jìn)行傳播復(fù)制,寫(xiě)操作就會(huì)比原來(lái)慢一些了,如下圖: 



          這里選擇 RAIDb
          -1 做為 cjdbc RAIDb 機(jī)制。
           
           
          四、給兩臺(tái)對(duì)等的 Mysql 建表,假設(shè)兩臺(tái) Mysql 的IP分別是 
          192.168.0.2和192.168.0.3  
          bash
          > mysql -h192.168.0.2 -uroot 
          bash
          > use clusterdb
          bash
          > create table user (id int(3) not null auto_increment primary key, name char(50) not null) engine innodb;
          bash
          > exit;

          bash
          > mysql -h192.168.0.3 -uroot 
          bash
          > use clusterdb
          bash
          > create table user (id int(3) not null auto_increment primary key, name char(50) not null) engine innodb;
          bash
          > exit;  
           
          五、在 Linux 下安裝 C
          -JDBC Controller  
          bash
          > mkdir -/usr/local/c-jdbc
          bash
          > cd /usr/local/c-jdbc
          bash
          > tar xvfz c-jdbc-2.0.2-bin.tar.gz
          bash
          > export CJDBC_HOME=/usr/local/c-jdbc
           
           
          六、把 Mysql JDBC Driver 放到 C
          -JDBC Controller 中來(lái)  
          這里我們使用 mysql
          -connector-java-3.1.12-bin.jar 驅(qū)動(dòng)程序,把它放到
          /usr/local/c-jdbc/drivers 中
           
           
          七、配置 C
          -JDBC Controller  
          1、在 /usr/local/c-jdbc/config/virtualdatabase 目錄中創(chuàng)建 虛擬數(shù)據(jù)庫(kù)配置文件,并把它命名為 mysql-raidb1-distribution.xml,內(nèi)容如下:
          <?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"> 

          <Distribution>
          </Distribution>

          <AuthenticationManager>
          <Admin>
          <User username="admin" password="c-jdbc"/>
          </Admin> 
          <VirtualUsers>
          <VirtualLogin vLogin="boss" vPassword="boss"/>
          </VirtualUsers>
          </AuthenticationManager> 

          <DatabaseBackend name="mysqlNode211" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://192.168.0.2/clusterdb" connectionTestStatement="select 1">
          <ConnectionManager vLogin="boss" rLogin="boss_user" rPassword="123456">
          <VariablePoolConnectionManager initPoolSize="10" minPoolSize="10" maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
          </ConnectionManager>
          </DatabaseBackend> 

          <DatabaseBackend name="mysqlNode213" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://192.168.0.3/clusterdb" connectionTestStatement="select 1">
          <ConnectionManager vLogin="boss" rLogin="boss_user" rPassword="123456">
          <VariablePoolConnectionManager initPoolSize="10" minPoolSize="10" maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
          </ConnectionManager>
          </DatabaseBackend> 

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

          <LoadBalancer>
          <RAIDb-1>
          <WaitForCompletion policy="first"/>
          <RAIDb-1-LeastPendingRequestsFirst/>
          </RAIDb-1>
          </LoadBalancer>
          </RequestManager> 

          </VirtualDatabase> 

          </C-JDBC>

           

          2、在 /usr/local/c-jdbc/config/controller 目錄中創(chuàng)建 C-JDBC controller 配置文件,并把它命名為 uud-controller-distributed.xml,內(nèi)容如下: <?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="25323">
          <JmxSettings>
          <RmiJmxAdaptor port="1091"/>
          </JmxSettings>
          <VirtualDatabase configFile="mysql-raidb1-distribution.xml" virtualDatabaseName="myDB" autoEnableBackends="true"/>
          </Controller>
          </C-JDBC-CONTROLLER>

           


          3、在 /usr/local/c-jdbc/config/demo 目錄中創(chuàng)建啟動(dòng) C-JDBC controller sh,并把它命名為 uud-distributed-raidb1-controller.sh,內(nèi)容如下: #!/bin/sh 

          export CJDBC_HOME
          =/usr/local/c-jdbc
          export JAVA_HOME
          =/opt/jdk1.5 

          cd $CJDBC_HOME
          /bin 

          echo 
          "Waiting for mysql servers to finish start up" 

          echo 
          "Starting Controller"
          .
          /controller.sh -f ../config/controller/uud-controller-distributed.xml &
           

           
           
          八、啟動(dòng) C
          -JDBC Controller  
          bash
          > cd /usr/local/c-jdbc/demo
          bash
          > chmod u+rwx uud-distributed-raidb1-controller.sh
          bash
          > ./uud-distributed-raidb1-controller.sh &

          如果啟動(dòng)正常,顯示的信息如下: 
          Waiting 
          for mysql servers to finish start up
          Starting Controller
          2006-04-20 10:32:21,126 INFO controller.core.Controller C-JDBC controller (2.0.2)
          2006-04-20 10:32:21,189 INFO controller.core.Controller Loading configuration file: ../config/controller/uud-controller-distributed.xml
          2006-04-20 10:32:21,278 INFO controller.core.Controller JMX is enabled
          2006-04-20 10:32:21,308 INFO controller.core.Controller Starting JMX server on host: 127.0.0.1
          2006-04-20 10:32:21,674 INFO backend.DatabaseBackend.mysqlNode211 Adding connection manager for virtual user "boss"
          2006-04-20 10:32:21,749 INFO backend.DatabaseBackend.mysqlNode213 Adding connection manager for virtual user "boss"
          2006-04-20 10:32:21,809 INFO controller.RequestManager.myDB Request manager will parse requests with the following granularity: NO_PARSING
          2006-04-20 10:32:21,814 INFO controller.virtualdatabase.myDB Configuring jgroups using: file:/usr/local/c-jdbc/config/jgroups.xml 

          -------------------------------------------------------
          GMS: address is 
          127.0.0.1:32773
          -------------------------------------------------------
          2006-04-20 10:32:26,476 INFO controller.virtualdatabase.myDB Group myDB connected to /127.0.0.1:32773[/127.0.0.1:32773]
          2006-04-20 10:32:26,476 INFO controller.virtualdatabase.myDB First controller in group myDB
          2006-04-20 10:32:26,477 WARN controller.virtualdatabase.myDB No recovery log has been configured, enabling backend without checkpoint. 

          [
          1]+ Done ./uud-distributed-raidb1-controller.sh
           
           
           
          八、編寫(xiě) C
          -JDBC 客戶端程序  
          1、把 C-JDBC Drivers(/usr/local/c-jdbc/drivers/c-jdbc-driver.jar) 放置到 CLASSPATH 中
          2、編寫(xiě)插入 10 條數(shù)據(jù)到 Mysql 中,程序如下: /**
          @author 胡榮華
          * @Company 世紀(jì)龍 21cn
          */

          package com.cjdbc.test; 

          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.DriverManager; 

          /**

          */

          public class GenerateSampleData 

          public void generate() {
          Connection conn 
          = null;
          PreparedStatement pstmt 
          = null;
          try {
          // 這是 c-jdbc drivers 的 Drivers class,注意不是 mysql 的 Drivers class
          Class.forName("org.objectweb.cjdbc.driver.Driver").newInstance();
          // 192.168.0.1 是 cjdbc controller 所在的 ip
          // myDB 是在 文件 mysql-raidb1-distribution.xml 里定義的 <VirtualDatabase name="myDB">
          // user=boss&password=boss 是在 文件 mysql-raidb1-distribution.xml 里定義的
          // <VirtualUsers>
          // <VirtualLogin vLogin="boss" vPassword="boss"/>
          // </VirtualUsers> 
          String url = "jdbc:cjdbc://192.168.0.1:25323/myDB?user=boss&password=boss"

          conn 
          = DriverManager.getConnection(url);

          try
          conn.setAutoCommit(
          false);
          pstmt 
          = conn.prepareStatement("insert into user values ('', ?)");

          int numOfTestRecords = 10;
          System.out.println(
          "Update Record Start.");
          for (int i=0;i<numOfTestRecords;i++{
          String newkey 
          = i + "-" + i;
          pstmt.setString(
          1"hua_" + newkey);
          pstmt.executeUpdate();

          }
           
          conn.commit();
          System.out.println(
          "Update Record Success.");
          }

          catch(Exception ex){
          conn.rollback();
          ex.printStackTrace();
          }

          finally{
          try {
          if( pstmt != null )
          pstmt.close();
          if( conn != null)
          conn.close();
          }

          catch(Exception e) {
          e.printStackTrace();
          }

          }

          }
           catch (Exception e) {
          e.printStackTrace();
          }

          }
           

          /**
          @param args
          */

          public static void main(String[] args) {
          // TODO Auto-generated method stub
          GenerateSampleData g = new GenerateSampleData();
          g.generate(); 

          }
           

          }


           

          3、程序執(zhí)行完畢后,分別到 Mysql Node 192.168.0.2 和 192.168.0.3 查詢,看看是否已同步了數(shù)據(jù),如果兩個(gè) Mysql Node 都有相同的數(shù)據(jù),說(shuō)明 C-JDBC 環(huán)境搭建成功。
           
           
           
          關(guān)于作者  
            網(wǎng)名:潤(rùn)名
          E
          -mail: winsonhrh@gmail.com

          現(xiàn)從事于 21cn 公司,從事 J2EE 架構(gòu)設(shè)計(jì),有五年 J2EE工作經(jīng)驗(yàn)。熱衷研究各種 Open Source Framework 的技術(shù) 
           
           

          posted on 2008-08-26 12:06 都市淘沙者 閱讀(542) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 山阳县| 台前县| 翼城县| 苏尼特右旗| 弋阳县| 隆子县| 南通市| 涡阳县| 枣阳市| 噶尔县| 会同县| 金湖县| 崇礼县| 永登县| 和田县| 黔南| 哈密市| 英吉沙县| 肥东县| 芦溪县| 平遥县| 和田市| 茂名市| 济阳县| 尼玛县| 义马市| 通辽市| 新河县| 北海市| 新乐市| 蓬莱市| 谢通门县| 饶阳县| 安远县| 镇远县| 蛟河市| 哈尔滨市| 昌乐县| 连城县| 肇东市| 卢湾区|