http://hualong.iteye.com/blog/2102798

这几天研究了下Cobar, Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求。)(github上面的是源码,大家下来需要自己用maven2编译后运行、者放Eclipse里面运行,一开始我用maven3没有执行成功。)

首先,使用Cobar的核心功能如下:分布式:

Cobar的分布式主要是通过将表放入不同的库来实现:

1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分

2. Cobar也支持将不同的表放入不同的库

3. 多数情况下,用户会将以上两种方式混合使用

这里需要强调的是,Cobar不支持将一张表,例如test表拆分成test_1, test_2, test_3.....放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。

HA:

在用户配置了MySQL心跳的情况下,Cobar可以自动向后端连接的MySQL发送心跳,判断MySQL运行状况,一旦运行出现异常,Cobar可以自动切换到备机工作。但需要强调的是:

1. Cobar的主备切换有两种触发方式,一种是用户手动触发,一种是Cobar的心跳语句检测到异常后自动触发。那么,当心跳检测到主机异常,切换到备机,如果主机恢复了,需要用户手动切回主机工作,Cobar不会在主机恢复时自动切换回主机,除非备机的心跳也返回异常。

2. Cobar只检查MySQL主备异常,不关心主备之间的数据同步,因此用户需要在使用Cobar之前在MySQL主备上配置双向同步,详情可以参阅MySQL参考手册。

其次,我们也需要注意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()方法设置参数。

然后,我们来分析一下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的安装和配置步骤:

下面我们将使用一个最简单的分库分表的例子来说明Cobar的基本用法,数据库schema如下图(该实例也可参考:Cobar产品首页)。

1) 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。

2) tb1表的数据被映射到物理数据库dbtest1的tb1上。

3) tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。

1、环境准备

操作系统:Linux或者Windows (推荐在Linux环境下运行Cobar)

MySQL:http://www.mysql.com/downloads/ (推荐使用5.1以上版本)

JDK:http://www.oracle.com/technetwork/java/javase/downloads/ (推荐使用1.6以上版本)

Cobar:https://github.com/alibaba/cobar (下载tar.gz或者zip文件,特意说明下,阿里的开源全部移到github上去了,里面有很多阿里人的作品,当然包含著名的dubbo,地址是:https://github.com/alibaba/)

2、数据准备

假设本文MySQL所在服务器IP为192.168.0.1,端口为3306,用户名为test,密码为空,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,SQL如下:

1.  #创建dbtest1

2.  drop database if exists dbtest1;

3.  create database dbtest1;

4.  use dbtest1;

5.  #在dbtest1上创建tb1

6.  create table tb1(

7.  id    int not null,

8.  gmt   datetime);

9.

10.#创建dbtest2

11.drop database if exists dbtest2;

12.create database dbtest2;

13.use dbtest2;

14.#在dbtest2上创建tb2

15.create table tb2(

16.id    int not null,

17.val   varchar(256));

18.

19.#创建dbtest3

20.drop database if exists dbtest3;

21.create database dbtest3;

22.use dbtest3;

23.#在dbtest3上创建tb2

24.create table tb2(

25.id    int not null,

26.val   varchar(256));

3、配置Cobar

Cobar解压之后有四个目录:

bin/:可执行文件目录,包含启动(start)、关闭(shutdown)和重启(restart)脚本

lib/:逻辑类库目录,包含了Cobar所需的jar包

conf/:配置文件目录,下面会详细介绍

logs/:运行日志目录,最主要的log有两个:程序日志(stdout.log)和控制台输出(console.log)

配置文件的用法如下:

log4j.xml:日志配置,一般来说保持默认即可

schema.xml:定义了schema逻辑层次图中的所有元素,并利用这些元素以及rule.xml中定义的规则组建分布式数据库系统

rule.xml:定义了分库分表的规则

server.xml:系统配置文件

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

1.  <?xml  version="1.0" encoding="UTF-8"?>

2.  cobar:schema SYSTEM "schema.dtd">

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.      dsTest[0]

14.

15.

16.

17.

18.      dsTest[1]

19.

20.

21.

22.

23.      dsTest[2]

24.

25.

26.

27.

28.

29.

30.      192.168.0.1:3306/dbtest1

31.      192.168.0.1:3306/dbtest2

32.      192.168.0.1:3306/dbtest3

33.

34.    test

35.    test

36.    STRICT_TRANS_TABLES

37.

38.

我们注意到,上述配置实际上已经把图2中的数据库结构配置好了。dbtest主要映射的是dnTest1库(即192.168.0.1:3306/dbtest1库),而其中的tb2表则是按照规则rule1,被分配到dnTest2库(即192.168.0.1:3306/dbtest2库)和dnTest3库(即192.168.0.1:3306/dbtest3库)中。此外,规则rule1的定义可以在rule.xml中找到,代码如下:

1.  <?xml  version="1.0" encoding="UTF-8"?>

2.  cobar:rule SYSTEM "rule.dtd">

3.

4.

5.

6.

7.

8.        id

9.

10.

11.

12.

13.

14.

15.    2

16.    512

17.

18.

结合schema.xml中的内容,我们可以看出分表的规则是,按照id字段把tb2表中的数据分配到dnTest2和dnTest3两个分区中,其中id小于512的数据会被放到dnTest2库的分区中,而其余的会被放到dnTest3库的分区中,更多路由算法可以参考《路由文档》。最后,我们来看一下server.xml的配置,代码如下。

1.  <?xml  version="1.0" encoding="UTF-8"?>

2.  cobar:server SYSTEM "server.dtd">

3.

4.

5.

6.

7.      passwd

8.      dbtest

9.

10.

这里的server.xml配置比较简单,只配置了本地Cobar服务的数据库结构、用户名和密码。在启动Cobar服务之后,使用用户名root和密码passwd就可以登录Cobar服务。

4、运行Cobar

启动Cobar服务很简单,运用bin目录下的start.sh即可(停止使用shutdown.sh)。启动成功之后,可以在logs目录下的stdout.log中看到如下日志:

1.  10:54:19,264 INFO  ===============================================

2.  10:54:19,265 INFO  Cobar is ready to startup ...

3.  10:54:19,265 INFO  Startup processors ...

4.  10:54:19,443 INFO  Startup connector ...

5.  10:54:19,446 INFO  Initialize dataNodes ...

6.  10:54:19,470 INFO  dnTest1:0 init success

7.  10:54:19,472 INFO  dnTest3:0 init success

8.  10:54:19,473 INFO  dnTest2:0 init success

9.  10:54:19,481 INFO  CobarManager is started and listening on 9066

10.10:54:19,483 INFO  CobarServer is started and listening on 8066

11.10:54:19,484 INFO  ===============================================

接着,我们就可以使用“mysql -h127.0.0.1 -uroot -ppasswd -P8066 -Ddbtest”命令来登录Cobar服务了,再接下来的操作就和在其他MySQL Client中一样了。比如,我们可以使用“show databases”命令查看数据库,使用“show tables”命令查看数据表,如下图:

接着,我们按照下图中的SQL指定向数据表插入测试记录。

可以看到,这里的tb2中包含了id为1、2、513的3条记录。而实际上,这3条记录存储在不同的物理数据库上的,大家可以到物理库上验证一下。

至于Cobar的连接和使用方法和MySQL一样,Java程序中可以使用JDBC(建议5.1以上的版本),PHP中可以使用PDO。当然,Cobar还提供HA、集群等高级的功能,更多信息请参考其《产品文档》。此外,产品文档中还为我们提供了详细的PPT文档《Cobar原理及应用.ppt》来介绍Cobar在实际生产环境中的使用方法。

此外,特别解释一下大家可能比较关心的心跳检测问题,Cobar的心跳检测主要用在以下两个地方。

1、在配置数据节点的时候,我们需要使用心跳检测来探测数据节点的运行状况。Cobar中使用执行SQL的方式来进行探测,简单且实用。例如,我们可以把前面实例中的schema.xml中的dataNode配置成下面的样子。

1.  ... ...

2.

3.

4.

5.        dsTest[0]

6.

7.

8.      256

9.

10.

11.    select user()

12.

13.... ...

2、当我们需要对Cobar作集群(cluster),进行负载均衡的时候,我们也需要用到心跳机制。不过此处的配置则是在server.xml中,代码如下:

1.  ... ...

2.

3.

4.

5.

6.

7.        192.168.0.1

8.

9.        1

10.

11.

12.

13.      192.168.0.2

14.      2

15.

16.

17.

18.      192.168.0.3

19.      3

20.

21.

22.

23.      cobar1,cobar2

24.

25.

26.      cobar2,cobar3

27.

28.

29.... ...

最后,简单看一下Cobar的实现原理。

首先是系统模块架构。

从上图中可以看到,Cobar的前、后端模块都实现了MySQL协议;当接受到SQL请求时,会依次进行解释(SQL Parser)和路由(SQL Router)工作,然后使用SQL Executor去后端模块获取数据集(后端模块还负责心跳检测功能);如果数据集来自多个数据源,Cobar则需要把数据集进行组合(Result Merge),最后返回响应。整个过程应该比较容易理解,

下面是Cobar的网络通讯模块架构。

从上图中可以看出,Cobar采用了主流的Reactor设计模式来处理请求,并使用NIO进行底层的数据交换,这大大提升系统的负载能力。其中,NIOAcceptor用于处理前端请求,NIOConnector则用于管理后端的连接,NIOProcessor用于管理多线程事件处理,NIOReactor则用于完成底层的事件驱动机制,就是看起来和Mina和Netty的网络模型比较相似。如果有兴趣,大家还可以到Cobar站点的下载页面(https://github.com/alibaba/cobar)获取该项目的源码,感谢阿里人的付出!

最后说点题外话,目前国内关于mysql分布式中间有

但是还是阿里的cobar好些,因为他开源了,除了中间件本身,还开源提供驱动、管理器。

netty mysql 中间件_阿里开源Mysql分布式中间件:Cobar相关推荐

  1. mysql 分库分表中间件 mycat_阿里开源的分布式分库分表中间件之MyCat从入门到放弃...

    原标题:阿里开源的分布式分库分表中间件之MyCat从入门到放弃 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: 根据 tt_waybi ...

  2. seata xid是什么_阿里开源的分布式事务框架 Seata

    1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata ...

  3. 阿里云mysql 连接数_阿里云mysql最大连接数

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. mysql 回档_阿里云mysql回档

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. 阿里云 mysql 收费_阿里云MySQL云数据库价格表(收费标准) - 新手站长网

    阿里云RDS云数据库MySQL版收费标准,包括MySQL云数据库不同版本不同实例规格(高可用版.金融版.基础版和只读规格)的详细价格表,新手站长网分享阿里云数据库详细价格表及官网报价: 阿里云数据库收 ...

  6. 阿里 MySQL 规约_阿里手册 Mysql 数据库规约

    (一)建表规约 1. [强制]表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否). 说明:任何字段如果为非负数,必须是 u ...

  7. 阿里云 mysql主从_阿里云MySQL主从_Mater Slave_主备同步_MySQL主从_MySQL延迟-云栖社区-阿里云...

    1.背景 为了提高系统的可用性和数据保护,MySQL通常采用master-slave的部署结构,简单高效,master和slave之间使用binlog来复制数据. binlog支持statement和 ...

  8. 阿里云 mysql参数_阿里云MYSQL数据库怎么修改参数值?

    可以修改RDS实例的部分参数的值,以及查询参数修改记录.请在RDS控制台上查看可修改的具体参数. 说明 SQL Server 2012及以上版本的实例只能通过SQL命令设置实例参数,详情请参见使用SQ ...

  9. matlab 写入 MYSQL_阿里开源MySQL中间件Canal快速入门

    前言 距离上一篇文章发布又过去了两周,这次先填掉上一篇秒杀系统文章结尾处开的坑,介绍一下数据库中间件Canal的使用. 「Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能 ...

  10. 关于分布式事务: 阿里开源的分布式事务框架 Seata 和 LCN的分析

    之前使用过LCN分布式事务, 最近看到面试者简历中另一种方案 Seata, 通过它来在实战中解决分布式事务的问题.故 去简单了解了一下Seata是什么, 和LCN的区别在哪里, 如果是你 你怎么选择解 ...

最新文章

  1. 【回顾】紫丁香一队的故事
  2. nssl1478-题【dp】
  3. 我的iOS学习历程 - UISegmentedControl
  4. 从交换机分析网络风暴
  5. webpack的五个核心概念---webpack工作笔记002
  6. Android 柱状图(自定义View)
  7. BZOJ - 2819 Nim
  8. c# 数组不能直接=,需要clone
  9. matlab2015a安装秘钥_MATLAB2015a(2015b)安装教程
  10. Oracle 10g 安装教程
  11. 读《微波工程(第三版)》笔记 (9:传输线模型)
  12. 关于三极管的饱和与截止(失真)
  13. HMI车载开发:汽车与Android的关系:Android Automotive
  14. 你还不明白如何解决分布式Session?看这篇就够了!
  15. 开启微信悬浮窗权限有什么用_这个功能比微信自带的还好用
  16. MBA-day21 假言推理-练习题
  17. 什么区块链,统统都是骗局?
  18. 微信广告转化统计java,百度推广oCPC微信号复制转化次数统计系统数据接口
  19. 数据分析Power BI案例:职业教育经营分析看板
  20. Onload ‐ TCP

热门文章

  1. Myeclipse8.5 最新注册码以使用方法(可以用到2015年!!!)
  2. 把触发器说透(转载)
  3. HTML5 Guitar Tab Player
  4. STORM之ITridentSpout、FirstN(取Top N)实现、流合并和join
  5. MySQL错误ERROR 1786 (HY000)解决
  6. PostgreSQL数据保留窗口功能的使用
  7. re正则表达式7_{}
  8. iOS第三方开源库的吐槽和备忘
  9. OSChina 周六乱弹 —— 程序猿到底有多少个不解风情的瞬间?
  10. GitHub上README写法暨markdown语法解读