zoukankan      html  css  js  c++  java
  • 使用 CJDBC 给 Mysql 集群

    一、前言
             cjdbc ( http://c-jdbc.objectweb.org/ ) 是一个open source的数据库集群中间件,任何基于jdbc的应用都可以通过它透明地访问数据库集群,它可以进行各个节点之间的数据复制,并且可以实现各个节点的查询负载均衡。通过这样的软件,偶们可以方便的实现RAIDb - Redundant Array of Inexpensive Database 廉价数据库冗余阵列。
            大型应用随着用户量访问越来越大,增加数据库存储和做好数据库冗余可以增加系统的可靠性和性能。

            下面利用cjdbc,把两台对等的 Mysql 做 RAIDb,本文假定你已经搭建好两台对等的 Mysql环境并建好一个需要做集群冗余的数据库 clusterdb。
    二、配置环境
    Mysql: 5.0.19, 并使用 InnoDB 作为 Mysql 引擎

    C-jdbc: 2.0.2

    Jdk: 1.5
    三、选择合适的 C-JDBC RAIDb 机制

    cjdbc有几种RAIDb的机制可以选择,如RAIDb-0,RAIDb-1等等,可以根据不同的情况选择不同的RAIDb的机制。各种 RAIDb的机制详情请查看 cjdbc 的文档和 Demo。

    RAIDb-1有如下功能:
    完全镜像处理机制,每个节点上都有完整的数据库结构,这种方式提供了最好的容错处理,并且通过设置合理的Loading Balance策略,可以带来查询性能相当好的提高。但是由于对于任何的写操作(create/update/delete),需要在各个节点上进行传播复制,写操作就会比原来慢一些了,如下图:



    这里选择 RAIDb-1 做为 cjdbc RAIDb 机制。

    四、给两台对等的 Mysql 建表,假设两台 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 -p /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 中来

    这里我们使用 mysql-connector-java-3.1.12-bin.jar 驱动程序,把它放到
    /usr/local/c-jdbc/drivers 中

    七、配置 C-JDBC Controller
    1、在 /usr/local/c-jdbc/config/virtualdatabase 目录中创建 虚拟数据库配置文件,并把它命名为 mysql-raidb1-distribution.xml,内容如下:

    <?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 目录中创建 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="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 目录中创建启动 C-JDBC controller sh,并把它命名为 uud-distributed-raidb1-controller.sh,内容如下:

    #!/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 &

    八、启动 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 &

    如果启动正常,显示的信息如下: 

    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

    八、编写 C-JDBC 客户端程序
    1、把 C-JDBC Drivers(/usr/local/c-jdbc/drivers/c-jdbc-driver.jar) 放置到 CLASSPATH 中
    2、编写插入 10 条数据到 Mysql 中,程序如下:

    /**
    * @author 胡荣华
    * @Company 世纪龙 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、程序执行完毕后,分别到 Mysql Node 192.168.0.2 和 192.168.0.3 查询,看看是否已同步了数据,如果两个 Mysql Node 都有相同的数据,说明 C-JDBC 环境搭建成功。

  • 相关阅读:
    mysql查询版本
    mysql导出bug备注
    linux查找文件
    linux 编译式安装nginx
    linux文件校验
    linux 编译式安装apache
    网络层
    数据链路层
    物理层
    servlet过滤器
  • 原文地址:https://www.cnblogs.com/sunwei2012/p/1900405.html
Copyright © 2011-2022 走看看