分布式mysql cobar_Mysql分布式中间件:Cobar server

Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求。)(github上面的是源码,大家下来需要自己用maven2编译后运行、者放Eclipse里面运行

一.Cobar的核心功能

1.分布式:

Cobar的分布式主要是通过将表放入不同的库来实现:

1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分

2. Cobar也支持将不同的表放入不同的库

3. 多数情况下,用户会将以上两种方式混合使用

这里需要强调的是,Cobar不支持将一张表,例如test表拆分成test_1, test_2, test_3.....放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。

2.HA:

在用户配置了MySQL心跳的情况下,Cobar可以自动向后端连接的MySQL发送心跳,判断MySQL运行状况,一旦运行出现异常,Cobar可以自动切换到备机工作。但需要强调的是:

1. Cobar的主备切换有两种触发方式,一种是用户手动触发,一种是Cobar的心跳语句检测到异常后自动触发。那么,当心跳检测到主机异常,切换到备机,如果主机恢复了,需要用户手动切回主机工作,Cobar不会在主机恢复时自动切换回主机,除非备机的心跳也返回异常。

2. Cobar只检查MySQL主备异常,不关心主备之间的数据同步,因此用户需要在使用Cobar之前在MySQL主备上配置双向同步,详情可以参阅MySQL参考手册。

3.其次,我们也需要注意Cobar的功能约束:

1) 不支持跨库情况下的join、分页、排序、子查询操作。

2) SET语句执行会被忽略,事务和字符集设置除外。

3) 分库情况下,insert语句必须包含拆分字段列名。

4) 分库情况下,update语句不能更新拆分字段的值。

5) 不支持SAVEPOINT操作。

6) 暂时只支持MySQL数据节点。

7) 使用JDBC时,不支持rewriteBatchedStatements=true参数设置(默认为false)。

8) 使用JDBC时,不支持useServerPrepStmts=true参数设置(默认为false)。

9) 使用JDBC时,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法设置参数。

4.Cobar逻辑层次图

added130ddc669985a7af62a36d752c1.png

* dataSource:数据源,表示一个具体的数据库连接,与物理存在的数据库schema一一对应。

* dataNode:数据节点,由主、备数据源,数据源的HA以及连接池共同组成,可以将一个dataNode理解为一个分库。

* table:表,包括拆分表(如tb1,tb2)和非拆分表。

* tableRule:路由规则,用于判断SQL语句被路由到具体哪些datanode执行。

* schema:cobar可以定义包含拆分表的schema(如schema1),也可以定义无拆分表的schema(如schema2)。

Cobar支持的数据库结构(schema)的层次关系具有较强的灵活性,用户可以将表自由放置不同的datanode,也可将不同的datasource放置在同一MySQL实例上。在实际应用中,我们需要通过配置文件(schema.xml)来定义我们需要的数据库服务器和表的分布策略,这点我们将在后面的安装和配置部分中介绍到。

二.Cobar的安装和配置步骤

1.数据库schema

15567cc6a674dda0d4244fdeba4bb84e.png

1) 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。

2) tb1表的数据被映射到物理数据库dbtest1的tb1上。

3) tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。

2.到https://github.com/alibaba/cobar网址去下载Cobar server

58280a003e4861c8f7aa2ca1cb9287e9.png

3.数据准备

MySQL中们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,SQL如下:

bededdc233a1e2d909612f21f2acbf46.png

4.配置Cobar

(1)解压下载的安装包,此时的项目还不能直接运行cobar-master\server\assembly\bin\startup.bat(windows下是运行startup.bat,linux下是运行starup.sh文件)

因为此项目还不完整,缺少Jar包。

9d18371be1a52d9b0a6fcffc53c1f658.png

(2)将项目以maven的形式将server的文件夹导入Eclipse.

(3)执行Update Project Configuraction获取jar包,如果有jar包获取不到,去http://maven.apache.org/网站看下是否有这个版本。

(4)然后打包Maven Install打包成jar,此时jar包会在D:\cobar-master\server\target目录下。

d6c617df6bfe26450e0768a86e0cd825.png

(5)将cobar-server-1.2.7.tar.gz解压,解压后的目录:

3b32c130db5723363c23fd07dc7718b5.png

(6)修改配置文件

schema.xml中配置数据库结构(schema)、数据节点(dataNode)、以及数据源(dataSource)。

6b391e3f026807ba35f38442a69d3070.png

dbtest主要映射的是dbTest1,而其中的tb2表则是按照规则rule1,被分配到dbtest2库和dbTest3库(中,以下Rule.xml

37b14cef8f08b488955df65946168d58.png

Server.xml

33ef4cb869c4c78726672cf57a90b6cc.png

1c3ea4e0c4eb3bda9c9296cf23e78cee.png

5.运行Cobar

(1)执行startup.bat,执行成功否可以从logs的stdout.log文件中看出。出现下边的信息说明执行成功。

fb16b076847f1c8c9501b653d23943fa.png

(2)以登陆mysql形式登陆cobar,如图所示:

Cmd=>执行mysql -h127.0.0.1 -utest -ptest -P8066 -Ddbtest

说明:即:ip,corbar用户名,cobar密码,端口,连接的数据库

89ad947405bc6385ba10b0801cb5f42a.png

0148555555389d2f3c57217259b8a80c.png

(3)SQL执行例子

执行结果:

(1)dbtest1的tb1表的数据如下:

5e80285136d4ade5014f494320815d97.png

(2)dbtest2的tb2表的数据如下:

0e777b34d827204e0066720606e887f4.png

(3)dbtest3的tb2表的数据如下:

698fd9f9f21289dc818bb1ee5c1a2596.png

导入eclipse后出现的问题:

1. Build errors for cobar-server; org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project cobar-server: Compilation failure

解决方案:将以下代码拷贝到pom.xml

org.apache.maven.plugins

maven-resources-plugin

2.4.3

2.注意项目的编码改成“UTF-8”

三.JDBC访问Cobar

如下类:

package com.test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

class TestCobar{

public static void main(String[] args){

String url = "jdbc:mysql://localhost:8066/dbtest";

String driver = "com.mysql.jdbc.Driver";

String user = "test";

String pwd = "test";

Connection con = null;

ResultSet rs = null;

String sql = "SELECT * FROM tb2 ";

try {

Class.forName(driver).newInstance();

con = DriverManager.getConnection(url, user, pwd);

Statement stmt = con.createStatement();

rs = stmt.executeQuery(sql);

//5.处理ResultSet

while(rs.next()){

//rs.get+数据库中对应的类型+(数据库中对应的列别名)

int id = rs.getInt("id");

String val = rs.getString("val");

System.out.println(id);

System.out.println(val);

}

stmt.close();

} catch (Exception e) {

// ...

} finally {

if (con != null) {

try {

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值