问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

C-JDBC能集群SQL吗

发布网友 发布时间:2022-04-08 19:50

我来回答

1个回答

热心网友 时间:2022-04-08 21:19

使用 C-JDBC 给 Mysql 集群
一、前言
cjdbc 是一个open source的数据库集群中间件,任何基于jdbc的应用都可以通过它透明地访问数据库集群,它可以进行各个节点之间的数据复制,并且可以实现各个节点的查询负载均衡。通过这样的软件,偶们可以方便的实现RAIDb - Rendant 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>
<RequestScheler>
<RAIDb-1Scheler level="passThrough"/>
</RequestScheler>
<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 环境搭建成功。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
婴儿用什么做枕头好 宝宝枕什么枕头比较好 婴儿使用什么枕头 新生儿用枕头用什么牌子好 婴儿枕头用什么做好 用什么做婴儿枕头最好 长白山在哪个城市 长白山地理位置 100%山羊绒毛衣可以水洗吗 山羊绒毛衣怎么洗怎么洗山羊绒毛衣 专升本怎么能升一个好二本? 魔百盒不小心播了一下收费节目,还停留了几秒 收费吗? 移动魔百盒恶意扣费在哪投诉? 中国移动魔百盒在手机月账单中扣钱吗? 移动魔百盒被别人偷去用了 而且还被扣费了 我该怎么办? 移动魔百盒恶意扣费在哪投诉?自动开通会员!一个月扣40元 一个月扣60元!无任何信息提醒! 移动魔百盒看电视上的腾讯VIP视频要不要收费啊?我点进去直接能看了,是不是直接收费了? 怎样样才能知道图片是否是ps过的? 你好,移动魔百盒乱扣费吗?家里孩子不小心点到扣费会需要输入短信验证码吗?还是直接就扣费了? 华为mate8下载的美图秀秀怎样无缝拼接照片 微信被严重警告,要过多久才能恢复正常? 微信被举报有那个警告怎么弄走 怎么证明sec^2x+csc^2x不等于1 啊? 2sec2x等于什么,关于tanx的 sec2x的积分是怎么推导 就是基本的积分公式,可以用换元法么?就是secx的平方,也就是cos 微信被通知售假警告怎么办 sec^2x/2等于什么 闲鱼法庭赢了 退货给卖家,卖家拒收会怎么样 x=0 sec2x=?(2为平方) 如题 sec^2x等价无穷小 sec2x等于cos2x分之一吗 一个线圈的互感M的计算方法,要计算公式及其中各字母代表的意义! 电脑开机显示广告哪里可以关闭 关于涉密文件的保密管理 国家秘密定密管理暂行规定 保密文件保管表格如何制作? 耦合电感电路的M是什么,怎么算 模数计算公式是什么? m=ρv是什么公式? 计算方程式m代表 天体计算中两种求m的公式有什么区别 100万 字节相当于多少M?计算公式是什么 里氏震级M的计算公式为:M=lyA-lyAj,其中A是测震仪记录的地震曲线的最o振幅,Aj是相应的标准地震的振幅 地震震级M(里氏震级)的计算公式为M=lgA-lgA0(其中A是被测地震最大振幅,常数A0是“标准地震”的振幅) 根据下面的公式计算m的具体值: m&#178;=(最小的素数的平方×最小的奇素数)&#47;(最小的合数)。 纪梵希4G散粉的粉扑怎么清洗?多久需要清理一次? 化妆刷呢?同上面两个... 炖鲅鱼头的做法步骤图,炖鲅鱼头怎么做好吃 鲅鱼头怎么做才更美味 鲅鱼头怎么做才好吃? 鲅鱼头怎么做汤好喝 鲅鱼头能吃吗
  • 焦点

最新推荐

猜你喜欢

热门推荐