Cobar 关系型数据的分布式处理系统
原文地址: http://code.alibabatech.com/wiki/display/cobar/Home;jsessionid=779959E690AE94BBC8079BB8F7D8B244
概述
Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。
- 产品在阿里巴巴B2B公司已经稳定运行了3年以上。
- 目前已经接管了3000+个MySQL数据库的schema,为应用提供数据服务。
- 据最近统计cobar集群目前平均每天处理近50亿次的SQL执行请求。
快速启动
场景描述
- 系统对外提供的数据库名是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四个目录
- schema.xml配置如下(注意:schema.xml包含MySQL的IP、端口、用户名、密码等配置,您需要按照注释替换为您的MySQL信息。)
schema.xml 配置
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE cobar:schema SYSTEM "schema.dtd">
<!-- 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
>
- rule.xml配置如下(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中。)
rule.xml 配置
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE cobar:rule SYSTEM "rule.dtd">
<!-- 路由规则定义,定义什么表,什么字段,采用什么路由算法。-->
<
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
>
- server.xml配置如下
server.xml 配置
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE cobar:server SYSTEM "server.dtd">
<!--定义Cobar用户名,密码-->
<
user
name
=
"test"
>
<
property
name
=
"password"
>test</
property
>
<
property
name
=
"schemas"
>dbtest</
property
>
</
user
>
</
cobar:server
>
步骤三:启动和使用Cobar
- 启动Cobar,进入bin目录可以看到Cobar的启动、停止与重启脚本
.
/startup
.sh
#Cobar进程名为CobarStartup
- 查看logs目录下stdout.log, 启动成功日志如下
10
:
54
:
19
,
264
INFO ===============================================
10
:
54
:
19
,
265
INFO Cobar is ready to startup ...
10
:
54
:
19
,
265
INFO Startup processors ...
10
:
54
:
19
,
443
INFO Startup connector ...
10
:
54
:
19
,
446
INFO Initialize dataNodes ...
10
:
54
:
19
,
470
INFO dnTest1:
0
init success
10
:
54
:
19
,
472
INFO dnTest3:
0
init success
10
:
54
:
19
,
473
INFO dnTest2:
0
init success
10
:
54
:
19
,
481
INFO CobarManager is started and listening on
9066
10
:
54
:
19
,
483
INFO CobarServer is started and listening on
8066
10
:
54
:
19
,
484
INFO ===============================================
- 访问Cobar同访问MySQL的方式完全相同, 常用访问方式如下(注意:本文将Cobar部署在192.168.0.1这台机器上,否则请替换为您的Cobar所在IP,其他信息不变)
#命令行
mysql -h192.
168.0
.
1
-utest -ptest -P8066 -Ddbtest
#JDBC(建议
5.1
以上的mysql driver版本)
Class.forName(
"com.mysql.jdbc.Driver"
);
Connection conn = DriverManager.getConnection(
"jdbc:mysql://192.168.0.1:8066/dbtest"
,
"test"
,
"test"
);
......
- SQL执行示例,执行语句时与使用传统单一数据库无区别
mysql>show databases; #dbtest1、dbtest2、dbtest3对用户透明
+
----------+
|
DATABASE
|
+
----------+
| dbtest |
+
----------+
mysql>show tables; #dbtest中有两张表tb1和tb2
+
-------------------+
| Tables_in_dbtest1 |
+
-------------------+
| tb1 |
| tb2 |
+
-------------------+
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同时插入多条数据
mysql>
select
*
from
tb1; #查询表tb1,验证数据被成功插入
+
----+---------------------+
| id | gmt |
+
----+---------------------+
| 1 | 2012-06-12 15:00:42 |
+
----+---------------------+
mysql>
select
*
from
tb2; #查询tb2,验证数据被成功插入
+
-----+-------+
| id | val |
+
-----+-------+
| 1 | part1 |
| 2 | part1 |
| 513 | part2 |
+
-----+-------+
mysql>
select
*
from
tb2
where
id
in
(1, 513); #根据id查询
+
-----+-------+
| id | val |
+
-----+-------+
| 1 | part1 |
| 513 | part2 |
+
-----+-------+
- 查看后端MySQL数据库dbtest1,dbtest2和dbtest3,验证数据分布在不同的库中
Cobar 关系型数据的分布式处理系统的更多相关文章
- 关系型数据的分布式处理系统:Cobar
Cobar简介 Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下像传统数据库一样为您提供海量数据服务. Github:https://github.com/alibaba/cobar 整 ...
- 关系型数据的分布式处理系统MyCAT(转载)
——概述和基本使用教程 日期:2014/12/24 文:阿蜜果 1. MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建 ...
- 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 文章索引::"机器学 ...
- 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比
一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型. 简单来说,关系模型指的 ...
- ELK +Nlog 分布式日志系统的搭建 For Windows
前言 我们为啥需要全文搜索 首先,我们来列举一下关系型数据库中的几种模糊查询 MySql : 一般情况下LIKE 模糊查询 SELECT * FROM `LhzxUsers` WHERE UserN ...
- 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训
原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...
- 分布式追踪系统dapper
http://www.cnblogs.com/LBSer/p/3390852.html 最近单位需要做自己的分布式监控系统,因此看了一些资料,其中就有google的分布式追踪系统dapper的论文:h ...
- 分布式消息系统:Kafka
Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...
- Kafka——分布式消息系统
Kafka——分布式消息系统 架构 Apache Kafka是2010年12月份开源的项目,采用scala语言编写,使用了多种效率优化机制,整体架构比较新颖(push/pull),更适合异构集群. 设 ...
随机推荐
- hdr_beg(host) hdr_reg(host) hdr_dom(host)
case 1 测试hdr_beg(host) 的情况 acl zjtest7_com hdr_beg(host) -i zjtest7.com use_backend zjtest7_com if z ...
- JS判断是否出现滚动条
http://www.cnblogs.com/yazdao/archive/2010/12/06/1897742.html 该博文是想用JS检测浏览器是否出滚动条. 这边想到一个比较取巧的方法, 假如 ...
- WINCE6.0远程桌面显示修改
备注:用RDP表示远程桌面 WINCE6.0自带的远程桌面在我们显示屏分辨率为240*320上有一部分内容无法显示出来,所以就需要调整界面让这些内容可见. 1. PB6.0不支持对远程桌面资 ...
- git stash
https://git-scm.com/docs/git-stash NAME git-stash - Stash the changes in a dirty working directo ...
- chrome和火狐获取资源
获取网站数据: chrome下获取网站数据可以用如下方式去获取: 而火狐则可以按以下方式获取: 在该目录下找到你想要的数据. 获取本地的数据: chrome下获取本地的数据: firefox下获取本地 ...
- js2word/html2word的简单实现
js2word/html2word的简单实现 以C#描述如下: StringBuilder sb = new StringBuilder(); sb.Ap ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- vfp 操作excel
VFP全面控制EXCEL 收藏 VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作.比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功 ...
- python20151130
tab和空格混排是报错的 import os #如何获取当前路径 #当前路径可以用'.'表示,再用os.path.abspath()将其转换为绝对路径 print(os.path.abspath('. ...
- boostrap兼容ie及其案例
多梦网络 wordpress主题 http://www.dmeng.net/