cobar技术与使用的相关介绍
阿里巴巴于2012年6月19日,正式对外开源的数据库中间件Cobar,前身是早已经开源的Amoeba,阿里巴巴内部考虑到Amoeba的稳定性、性能和功能支持,以及其他因素,重新设立了一个项目组并且更换名称为Cobar,开发语言是Java,一开始只支持MySQL数据库,并且用在新项目BRMMS(中文名称:商人社区)后来也支持Oracle数据库,因为阿里巴巴中文站的Offer数据库,需要从Oracle数据库+存储设备,迁移到MySQL+PC Server平台上,为保证用户数据的安全性,迁移过程是每128分之一切换的模式。Cobar开源对大家解决数据的垂直拆分和水平拆分,那是如虎贴翼,非常方便!
场景描述
Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下像传统数据库一样为您提供海量数据服务。以下是快速启动场景:
系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。
tb1表的数据被映射到物理数据库dbtest1的tb1上。
tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。
如下图所示:
步骤一:环境准备
软件准备
操作系统: Linux或者Windows (推荐在Linux环境下运行Cobar)
MySQL: http://www.mysql.com/downloads/ (推荐使用5.1以上版本)
JDK: http://www.oracle.com/technetwork/java/javase/downloads/ (推荐使用1.6以上版本)
Cobar: http://code.alibabatech.com/wiki/display/cobar/release/ (下载tar.gz或者zip文件)
数据准备
假设本文MySQL所在服务器IP为192.168.0.1,端口为3306,用户名为test,密码为空,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,脚本如下:
数据库创建脚本:
#创建dbtest1
drop database if exists dbtest1;
create database dbtest1;
use dbtest1;
#在dbtest1上创建tb1
create table tb1(
id int not null,
gmt datetime);
#创建dbtest2
drop database if exists dbtest2;
create database dbtest2;
use dbtest2;
#在dbtest2上创建tb2
create table tb2(
id int not null,
val varchar(256));
#创建dbtest3
drop database if exists dbtest3;
create database dbtest3;
use dbtest3;
#在dbtest3上创建tb2
create table tb2(
id int not null,
val varchar(256));
步骤二:部署和配置Cobar
请确保机器上设置了JAVA环境变量JAVA_HOME 下载Cobar压缩文件并解压,进入conf目录可以看到schema.xml, rule.xml, server.xml等相关的配置文件
wget http://code.alibabatech.com/mvn/releases/com/alibaba/cobar/cobar-server/1.2.4/cobar-server-1.2.4.tar.gz
tar zxf cobar-server-1.2.4.tar.gz
cd cobar-server-1.2.4 #可以看到bin,conf,lib,logs四个目录
<strong>schema.xml配置如下<span style=”color:</strong> #ff0000;”>(注意:schema.xml包含MySQL的IP、端口、用户名、密码等配置,您需要按照注释替换为您的MySQL信息。)
</span><strong>schema.xml 配置</strong>:<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE cobar:schema SYSTEM “schema.dtd”>
<cobar:schema xmlns:cobar=”http://cobar.alibaba.com/”>
<!– schema定义 –>
<schema name=”dbtest” dataNode=”dnTest1″>
<table name=”tb2″ dataNode=”dnTest2,dnTest3″ rule=”rule1″ />
</schema>
<!– 数据节点定义,数据节点由数据源和其他一些参数组织而成。–>
<dataNode name=”dnTest1″>
<property name=”dataSource”>
<dataSourceRef>dsTest[0]</dataSourceRef>
</property>
</dataNode>
<dataNode name=”dnTest2″>
<property name=”dataSource”>
<dataSourceRef>dsTest[1]</dataSourceRef>
</property>
</dataNode>
<dataNode name=”dnTest3″>
<property name=”dataSource”>
<dataSourceRef>dsTest[2]</dataSourceRef>
</property>
</dataNode>
<!– 数据源定义,数据源是一个具体的后端数据连接的表示。–>
<dataSource name=”dsTest” type=”mysql”>
<property name=”location”>
<location>192.168.0.1:3306/dbtest1</location> <!–注意:替换为您的MySQL IP和Port–>
<location>192.168.0.1:3306/dbtest2</location> <!–注意:替换为您的MySQL IP和Port–>
<location>192.168.0.1:3306/dbtest3</location> <!–注意:替换为您的MySQL IP和Port–>
</property>
<property name=”user”>test</property> <!–注意:替换为您的MySQL用户名–>
<property name=”password”></property> <!–注意:替换为您的MySQL密码–>
<property name=”sqlMode”>STRICT_TRANS_TABLES</property>
</dataSource>
</cobar:schema><strong>rule.xml配置如下<span style=”color: #ff0000;”>(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中。)</span></strong>
在我们报表中连接连接系统对外提供的数据库dbtest,即:
这样我们就可以在分布式的数据库服务环境中,设计报表了。
在进行取数查询的时候 是没有问题的,
但是在我们进行count的时候,却遇到了问题,
可以看到 实际应该取得4 的时候,却得到了两个2 ,说明上面的db1 和db2 中的表中各有两条记录。
这样的count方式就直接影响到我们的更新,导致我们在解析更新的时候会出问题,
所以对于这个问题,我们处理的建议由两个,
1 处理更新的时候使用自定义更新类,取得对应位置的参数,通过api进行更新,
2 通过cobar接口,实现对数据库的统一计算 ,即上例中的count结果变成4而不是两个2,这样就能避免我们的更新计算错误,正确进行更新。