MyCat:取代Cobar数据库中间件

Cobar 是阿里巴巴开源的一个数据库中间件,为了解决相似proxy这类的问题。目前同类型的有奇虎360开源的Atlas。相似的有基本在线上用起来很不爽,问题多多的好比MySQL Proxy和SQL Relay,基本能够忽略。 html


Cobar  下载:https://github.com/alibaba/cobar 前端

Atlas 下载:https://github.com/Qihoo360/Atlas java



=============================================================== node


MyCat:取代Cobar数据库中间件 mysql



什么是MyCAT?简单的说,MyCAT就是: 一个完全开源的,面向企业应用开发的“大数据库集群” 支持事务、ACID、能够替代Mysql的增强版数据库 ? 一个能够视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群 ? 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server ? 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 ? 一个新颖的数据库中间件产品。 git

目标

低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增加状况下的数据瓶颈问题。 github

关键特性

支持 SQL 92标准 支持Mysql集群,能够做为Proxy使用 支持JDBC链接ORACLE、DB二、SQL Server,将其模拟为MySQL Server使用 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群,自动故障切换,高可用性 ,支持读写分离,支持Mysql双主多从,以及一主多从的模式 ,支持全局表,数据自动分片到多个节点,用于高效表关联查询 ,支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询多平台支持,部署和实施简单。 算法

优点

基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能,以及众多成熟的使用案例使得MyCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,咱们能看到更远。普遍吸收业界优秀的开源项目和创新思路,将其融入到MyCAT的基因中,使得MyCAT在不少方面都领先于目前其余一些同类的开源项目,甚至超越某些商业产品。MyCAT背后有一只强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了MyCAT的产品质量。 MyCAT并不依托于任何一个商业公司,所以不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。 sql

长期规划

在支持Mysql的基础上,后端增长更多的开源数据库和商业数据库的支持,包括原生支持PosteSQL、FireBird等开源数据库,以及经过JDBC等方式间接支持其余非开源的数据库如Oracle、DB二、SQL Server等实现更为智能的自我调节特性,如自动统计分析SQL,自动建立和调整索引,根据数据表的读写频率,自动优化缓存和备份策略等实现更全面的监控管理功能与HDFS集成,提供SQL命令,将数据库装入HDFS中并可以快速分析集成优秀的开源报表工具,使之具有必定的数据分析的能力。 数据库


MyCat架构




MyCat官网:http://mycat.org.cn/

MyCat 下载:https://github.com/MyCATApache/Mycat-Server

MyCat文档:https://github.com/MyCATApache/Mycat-doc




延伸阅读:

一步一步编写mysql中间件(学习Cobar和MyCat)

第一篇---初步了解和搭建AIO  http://blog.csdn.net/crazy_hunter/article/details/41047215

第二篇--了解MySQL协议和分析方式   http://blog.csdn.net/crazy_hunter/article/details/41074939

第三篇----MySQL第一个包分析和处理HandshakePacket   http://blog.csdn.net/crazy_hunter/article/details/41120381

第四篇----实现伪MySQL服务器,基于MySQL协议的HelloWorld  http://blog.csdn.net/crazy_hunter/article/details/41309131



=========================================================



Alibaba的Cobar真是强大.



最近好不容易抽空研究了下Cobar,感受这个产品确实很不错(在文档方面比Amoeba强多了),特此推荐给你们。Cobar是阿里巴巴研发的关系型数据的分布式处理系统,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均天天处理近50亿次的SQL执行请求。


首先,使用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上。

一、环境准备

操做系统: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:dbtest一、dbtest二、dbtest3,table:tb一、tb2,SQL以下:
[sql]  view plain copy
  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));  

三、配置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)。
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE cobar:schema SYSTEM "schema.dtd">  
  3. <cobar:schema xmlns:cobar="http://cobar.alibaba.com/">  
  4.    
  5.   <!-- schema定义 -->  
  6.   <schema name="dbtest" dataNode="dnTest1">  
  7.     <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" />  
  8.   </schema>  
  9.    
  10.   <!-- 数据节点定义,数据节点由数据源和其余一些参数组织而成。-->  
  11.   <dataNode name="dnTest1">  
  12.     <property name="dataSource">  
  13.       <dataSourceRef>dsTest[0]</dataSourceRef>  
  14.     </property>  
  15.   </dataNode>  
  16.   <dataNode name="dnTest2">  
  17.     <property name="dataSource">  
  18.       <dataSourceRef>dsTest[1]</dataSourceRef>  
  19.     </property>  
  20.   </dataNode>  
  21.   <dataNode name="dnTest3">  
  22.     <property name="dataSource">  
  23.       <dataSourceRef>dsTest[2]</dataSourceRef>  
  24.     </property>  
  25.   </dataNode>  
  26.    
  27.   <!-- 数据源定义,数据源是一个具体的后端数据链接的表示。-->  
  28.   <dataSource name="dsTest" type="mysql">  
  29.     <property name="location">  
  30.       <location>192.168.0.1:3306/dbtest1</location> <!--注意:替换为您的MySQL IP和Port-->  
  31.       <location>192.168.0.1:3306/dbtest2</location> <!--注意:替换为您的MySQL IP和Port-->  
  32.       <location>192.168.0.1:3306/dbtest3</location> <!--注意:替换为您的MySQL IP和Port-->  
  33.     </property>  
  34.     <property name="user">test</property> <!--注意:替换为您的MySQL用户名-->  
  35.     <property name="password">test</property> <!--注意:替换为您的MySQL密码-->  
  36.     <property name="sqlMode">STRICT_TRANS_TABLES</property>  
  37.   </dataSource>  
  38. </cobar:schema>  
咱们注意到,上述配置实际上已经把图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中找到,代码以下:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE cobar:rule SYSTEM "rule.dtd">  
  3. <cobar:rule xmlns:cobar="http://cobar.alibaba.com/">  
  4.   
  5.   <!-- 路由规则定义,定义什么表,什么字段,采用什么路由算法。-->  
  6.   <tableRule name="rule1">  
  7.     <rule>  
  8.       <columns>id</columns>  
  9.       <algorithm><![CDATA[ func1(${id})]]></algorithm>  
  10.     </rule>  
  11.   </tableRule>  
  12.   
  13.   <!-- 路由函数定义,应用在路由规则的算法定义中,路由函数能够自定义扩展。-->  
  14.   <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">  
  15.     <property name="partitionCount">2</property>  
  16.     <property name="partitionLength">512</property>  
  17.   </function>  
  18. </cobar:rule>  
结合schema.xml中的内容,咱们能够看出分表的规则是,按照id字段把tb2表中的数据分配到dnTest2和dnTest3两个分区中,其中id小于512的数据会被放到dnTest2库的分区中,而其他的会被放到dnTest3库的分区中,更多路由算法能够参考《 路由文档 》。最后,咱们来看一下server.xml的配置,代码以下。
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE cobar:server SYSTEM "server.dtd">  
  3. <cobar:server xmlns:cobar="http://cobar.alibaba.com/">  
  4.    
  5.   <!--定义Cobar用户名,密码-->  
  6.   <user name="root">  
  7.     <property name="password">passwd</property>  
  8.     <property name="schemas">dbtest</property>  
  9.   </user>  
  10. </cobar:server>  
这里的server.xml配置比较简单,只配置了本地Cobar服务的数据库结构、用户名和密码。在启动Cobar服务以后,使用用户名root和密码passwd就能够登陆Cobar服务。

四、运行Cobar

启动Cobar服务很简单,运用bin目录下的start.sh便可(中止使用shutdown.sh)。启动成功以后,能够在logs目录下的stdout.log中看到以下日志:
[html]  view plain copy
  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为一、二、513的3条记录。而实际上,这3条记录存储在不一样的物理数据库上的,你们能够到物理库上验证一下。

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

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

一、在配置数据节点的时候,咱们须要使用心跳检测来探测数据节点的运行情况。Cobar中使用执行SQL的方式来进行探测,简单且实用。例如,咱们能够把前面实例中的schema.xml中的dataNode配置成下面的样子。
[html]  view plain copy
  1. ... ...  
  2.   <!-- 数据节点定义,数据节点由数据源和其余一些参数组织而成。-->  
  3.   <dataNode name="dnTest1">  
  4.     <property name="dataSource">  
  5.       <dataSourceRef>dsTest[0]</dataSourceRef>  
  6.     </property>  
  7.     <!--Cobar与后端数据源链接池大小设置-->  
  8.     <property name="poolSize">256</property>  
  9.     <!--Cobar经过心跳来实现后端数据源HA,一旦主数据源心跳失败,便切换到备数据源上工做-->  
  10.     <!--Cobar心跳是经过向后端数据源执行一条SQL语句,根据该语句的返回结果判断数据源的运行状况-->  
  11.     <property name="heartbeat">select user()<property>  
  12.   </dataNode>  
  13. ... ...  
二、当咱们须要对Cobar做集群(cluster),进行负载均衡的时候,咱们也须要用到心跳机制。不过此处的配置则是在server.xml中,代码以下:
[html]  view plain copy
  1. ... ...  
  2.   <!--组建一个Cobar集群,只需在cluster配置中把全部Cobar节点(注意:包括当前Cobar自身)都配置上即可-->  
  3.   <cluster>  
  4.     <!--node名称,一个node表示一个Cobar节点,一旦配置了node,当前Cobar便会向此节点按期发起心跳,探测节点的运行状况-->  
  5.     <node name="cobar1">  
  6.       <!--Cobar节点IP, 表示当前Cobar将会向192.168.0.1上部署的Cobar发送心跳-->  
  7.       <property name="host">192.168.0.1</property>  
  8.       <!--节点的权重,用于客户端的负载均衡,用户能够经过命令查询某个节点的运行状况以及权重-->  
  9.       <property name="weight">1</property>  
  10.     </node>  
  11.     <!--当前Cobar将会向192.168.0.2上部署的Cobar发送心跳-->  
  12.     <node name="cobar2">  
  13.       <property name="host">192.168.0.2</property>  
  14.       <property name="weight">2</property>  
  15.     </node>  
  16.     <!--当前Cobar将会向192.168.0.3上部署的Cobar发送心跳-->  
  17.     <node name="cobar3">  
  18.       <property name="host">192.168.0.3</property>  
  19.       <property name="weight">3</property>  
  20.     </node>  
  21.     <!--用户还能够将Cobar节点分组,以便实现schema级别的细粒度负载均衡-->  
  22.     <group name="group12">  
  23.       <property name="nodeList">cobar1,cobar2</property>  
  24.     </group>  
  25.      <group name="group23">  
  26.       <property name="nodeList">cobar2,cobar3</property>  
  27.     </group>  
  28.   </cluster>  
  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站点的下载页面(http://code.alibabatech.com/wiki/display/cobar/release)获取该项目的源码,真是太周到了,让咱们为富有开源精神的阿里人掌声鼓励一下!


来源:http://blog.csdn.net/crazy_hunter/article/details/40826737

相关文章
相关标签/搜索