C-JDBC(Java™ 数据库连接群集)作为开发源码的数据库群集中间件,可以让任何应用程序通过JDBC能够透明的访问数据库群集。数据库可以分布在多个节点并可以进行数据复制,C-JDBC能够均衡在这些节点之间的查询负载。 C-JDBC通过软件来实现RAIDb(廉价数据库冗余阵列)。C-JDBC是GNU LGPL许可证下的ObjectWeb项目
使用 C-JDBC 给 Mysql 集群
|
润名,Thursday Twentieth Of April
|
|
一、前言
|
cjdbc ( ) 是一个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,内容如下:
2、在 /usr/local/c-jdbc/config/controller 目录中创建 C-JDBC controller 配置文件,并把它命名为 uud-controller-distributed.xml,内容如下:
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 里定义的 // user=boss&password=boss 是在 文件 mysql-raidb1-distribution.xml 里定义的 // // // 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;iString 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 环境搭建成功。 | |
|
关于作者
|
| 网名:润名 E-mail: winsonhrh@gmail.com
现从事于 21cn 公司,从事 J2EE 架构设计,有五年 J2EE工作经验。热衷研究各种 Open Source Framework 的技术 | | |
Sequoia 开发小组宣布 发布 Sequoia 2.5.
Sequoia是一个能够为任何提供群集,负载平衡和容错服务的中间件。Sequoia是C-JDBC项目的扩展。
C-JDBC是一个集成方式,包括同步、复制、备份和集群等,Sequoia的出现 也说明了C-JDBC的成熟性,在这里万分感觉INRIA公司,一个法兰西的公司
C-JDBC(Java 连接群集)是一个集成方式,包括同步、复制、备份和集群等。 可以分布在多个节点并可以进行数据复制,C-JDBC能够均衡在这些节点之间的查询负载。 C-JDBC是GNU LGPL许可证下的ObjectWeb项目。
Sequoia 2.5 新版本包括:
1。一系列的bug fixed
2。Jgroup 升级
3。Recovery速度提升
4。PreparedStatement 序列化改进
阅读(4357) | 评论(0) | 转发(0) |