原文地址: 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">
    <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>
  • rule.xml配置如下(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中。)
    rule.xml 配置
    <?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>
  • server.xml配置如下

    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

    • 启动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 关系型数据的分布式处理系统的更多相关文章

  1. 关系型数据的分布式处理系统:Cobar

    Cobar简介 Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下像传统数据库一样为您提供海量数据服务. Github:https://github.com/alibaba/cobar 整 ...

  2. 关系型数据的分布式处理系统MyCAT(转载)

      ——概述和基本使用教程 日期:2014/12/24 文:阿蜜果 1.   MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建 ...

  3. 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 文章索引::"机器学 ...

  4. 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比

    一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库.    关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型.    简单来说,关系模型指的 ...

  5. ELK +Nlog 分布式日志系统的搭建 For Windows

    前言 我们为啥需要全文搜索 首先,我们来列举一下关系型数据库中的几种模糊查询 MySql : 一般情况下LIKE 模糊查询  SELECT * FROM `LhzxUsers` WHERE UserN ...

  6. 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训

    原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...

  7. 分布式追踪系统dapper

    http://www.cnblogs.com/LBSer/p/3390852.html 最近单位需要做自己的分布式监控系统,因此看了一些资料,其中就有google的分布式追踪系统dapper的论文:h ...

  8. 分布式消息系统:Kafka

    Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...

  9. Kafka——分布式消息系统

    Kafka——分布式消息系统 架构 Apache Kafka是2010年12月份开源的项目,采用scala语言编写,使用了多种效率优化机制,整体架构比较新颖(push/pull),更适合异构集群. 设 ...

随机推荐

  1. (组合数学3.1.2.2)POJ 2084 Game of Connections(卡特兰数公示的实现)

    package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class POJ_2084 ...

  2. [ffmpeg 扩展第三方库编译系列] frei0r mingw32 下编译问题

    在编译安装frei0r的时候遇到两个错误地方, 两个都是在install的时候. 一开始编译都很顺利,输入了 make install之后就走开了,回来一看,报错误. 提示mkdir -p //usr ...

  3. Android开发之动画(转)

    activity跳转的过渡效果,很漂亮,很全 注意,切换方法overridePendingTransition只能在startActivity和finish方法之后调用. 第一个参数为第一个Activ ...

  4. 设计模式 - interpreter

    interpreter模式在GOF中的定义是:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 定义看起来是非常晦涩.简单来讲,解释器模式通常用于处理特 ...

  5. (转载)关于gcd的8题

    发现其实有关gcd的题目还是挺多的,这里根据做题顺序写出8题. [bzoj2818: Gcd] gcd(x,y)=质数, 1<=x,y<=n的对数 做这题的时候,懂得了一个非常重要的转化: ...

  6. spring+springMVC+JPA配置详解(使用缓存框架ehcache)

    SpringMVC是越来越火,自己也弄一个Spring+SpringMVC+JPA的简单框架. 1.搭建环境. 1)下载Spring3.1.2的发布包:Hibernate4.1.7的发布包(没有使用h ...

  7. 【转】Android开发20——单个监听器监听多个按钮点击事件

    原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...

  8. HDU 3007 Buried memory & ZOJ 1450 Minimal Circle

    题意:给出n个点,求最小包围圆. 解法:这两天一直在学这个神奇的随机增量算法……看了这个http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066之后自己写了好久 ...

  9. POJ3616 Milking Time 简单DP

    注意0,1,.....,N是时间点,i~i+1是时间段 然后就是思路:dp[i]代表到时间点 i 获得的最大价值, 1:dp[i]=max(dp[i],dp[s-r]+e),表示有以s为开头,i为结尾 ...

  10. 第四章:ARP 地址解析协议

    网络接口有一个硬件地址,48bit的值,在硬件层次上进行的数据帧交换必须有正确的接口地址.tcp/ip有自己的地址,32bit的IP地址. 但是知道主机的IP地址并不能让内核发送一帧数据给主机.内核( ...