Mysql分布式中间件:Cobar server
  Mysql分布式中间件:Cobar server
杨肥麻 发表于3个月前
  Mysql分布式中间件:Cobar server
  • 发表于 3个月前
  • 阅读 30
  • 收藏 0
  • 点赞 0
  • 评论 0

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逻辑层次图

 

* 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

 

1) 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。
2) tb1表的数据被映射到物理数据库dbtest1的tb1上。
3) tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。

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

 

3.数据准备

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

 

4.配置Cobar

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

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

 

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

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

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

 

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

 

(6)修改配置文件

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

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

Server.xml

5.运行Cobar

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

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

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

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

(3)SQL执行例子 

执行结果:

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

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

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

导入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

 <dependency>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-resources-plugin</artifactId>

    <version>2.4.3</version>

</dependency>

 

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();

                }

            }

        }

    }

}

 

共有 人打赏支持
粉丝 2
博文 42
码字总数 18644
×
杨肥麻
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: