一、什么是Cobar
Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。
1) 该产品在阿里巴巴B2B公司已经稳定运行了3+年;
2) 目前已经接管了3000+个MySQL数据库的schema,为应用提供数据服务;
3) 据统计cobar集群目前平均每天处理近50亿次的SQL执行请求。
1)系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。
2)tb1表的数据被映射到物理数据库dbsdtv1的tb1上。
3)tb2表的一部分数据被映射到物理数据库dbsdtv2的tb2上,另外一部分数据被映射到物理数据库dbsdtv3的tb2上。
如下图1.1所示:
图1.1模型图
三、实施步骤
操作系统: Linux(CentOS5.8)
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)
MySQL所在服务器IP为10.0.211.5,192.168.202.83,192.168.202.84,端口为3306,用户名为root,密码为123abc,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2。创建脚本如下:
1、在10.0.211.5服务器上创建数据库dbsdtv1;
create database dbsdtv1;
use dbsdtv1;
create table tb1( id int not null, gmt datetime);
2、在192.168.202.83服务器上创建数据库dbsdtv2;
create database dbsdtv2;
use dbsdtv2;
create table tb2( id int not null, val varchar(256));
3、在192.168.202.84服务器上创建数据库dbsdtv2;
create database dbsdtv2;
use dbsdtv2;
create table tb2( id int not null, val varchar(256));
- 部署Cobar
1)#安装JDK1.6以上版本程序
./ jdk-6u37-linux-x64.bin
2)#配置JAVA环境变量
echo “JAVA_HOME=/usr/local/jdk1.6.0_37
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CLASSPATH” >>/etc/profile
source /etc/profile
退出ssh再重新登录输入命令java –version 验证jre环境是否以正确配置
3)下载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四个目录
4)schema.xml配置如下(注:schema.xml包含MySQL的IP、端口、用户名、密码等配置,您需要按照注释替换为您的MySQL信息)
<?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.202.83:3306/dbsdtv1</location>
<!--注意:替换为您的MySQL IP和Port--> <location>192.168.202.84:3306/dbsdtv2</location>
<!--注意:替换为您的MySQL IP和Port--> <location>192.168.202.85:3306/dbsdtv3</location>
<!--注意:替换为您的MySQL IP和Port-->
</property>
<property name="user">root</property>
<!--注意:替换为您的MySQL用户名-->
<property name="password">123abc</property> <!--注意:替换为您的MySQL密码--> <property
name="sqlMode">STRICT_TRANS_TABLES</property> </dataSource> </cobar:schema>
5)rule.xml配置如下(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cobar:rule SYSTEM "rule.dtd"> <cobar:rule xmlns:cobar="http://cobar.alibaba.com/">
<!-- 路由规则定义,定义什么表,什么字段,采用什么路由算法。-->
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm><![CDATA[ func1(${id})]]></algorithm>
</rule>
</tableRule>
<!-- 路由函数定义,应用在路由规则的算法定义中,路由函数可以自定义扩展。-->
<function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong"> <property name="partitionCount">2</property>
<!—配置需要分发到几个分区上(服务器)-->
<property name="partitionLength">512</property>
<!- -分发数据的长度 -->
</function>
</cobar:rule>
6)server.xml配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cobar:server SYSTEM "server.dtd">
<cobar:server xmlns:cobar="http://cobar.alibaba.com/">
<!--定义Cobar用户名,密码-->
<user name="test">
<property name="password">test</property>
<property name="schemas">dbtest</property>
</user>
</cobar:server>
- 启动和使用Cobar
./startup.sh #Cobar进程名为CobarStartup
#使用lsof –i :8066查看进程是否存在如果存在该进程则证明cobar以正常启动
#一般情况下首次启动会报错这时需要调整startup.sh脚本中的xss参数,将该参数调大一些。
· 如何访问Cobar
访问Cobar同访问MySQL的方式相同,常用访问方式如下(注意:本文将Cobar部署在10.0.0.11这台机器上,否则请替换为您的Cobar所在IP,其他信息不变)
mysql -h10.0.0.11 -utest -ptest -P8066 -Ddbtest
#JDBC(建议5.1以上的mysql driver版本)
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:// 10.0.0.11:8066/dbtest", "test", "test"); ......
- 测试与验证Cobar功能
mysql>insert into tb1 (id, gmt) values (1, now()); #向表tb1插入一条数据
mysql>insert into tb2 (id, val) values (1, "part1"); #向表tb2插入一条数据
mysql>insert into tb2 (id, val) values (2, "part1"), (513, "part2");
#向表tb2同时插入多条数据
#此次根据rule.xml的设计规则id小于512的均插入分区1.大于512的插入分区2(服务器2)
mysql>select * from tb1; #查询表tb1,验证数据被成功插入
mysql>select * from tb2; #查询tb2,验证数据被成功插入
查看后端MySQL数据库dbsdtv1,dbsdtv2和dbsdtv3#验证数据分布在不同的库中
from : http://blog.chinaunix.net/uid-25723371-id-3444220.html