C-JDBC能集群SQL吗

C-JDBC能集群SQL吗,第1张

使用 C-JDBC 给 Mysql 集群

一、前言

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,内容如下:

<?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=0i<numOfTestRecordsi++) {

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 group replication单主集群jdbc怎么配置

主从 就是 读写分离,主数据库负责写服务器,实时同步到从数据库(硬件和网络不同情况会有不同时间的延迟,阿里云主从数据库延迟几十毫秒), 从数据库负责提供读取服务器,创建只读账号 不能创建表和写入数据。

双主集群 没听过,你说的是不是Mysql的MMM架构,当一个主从挂掉了 自动切换到另外一个主从服务器,当这个恢复后自动把增加的数据拷贝 回来 并提供服务


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9985532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存