Cobar使用文档(可用作MySQL大型集群解决方案)

原文:http://blog.csdn.net/shagoo/article/details/8191346

项目已经迁移到Git上面,地址为:https://github.com/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上。

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:http://code.alibabatech.com/wiki/display/cobar/release/(下载tar.gz或者zip文件)

2、数据准备

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

[sql]view plaincopy

  1. #创建dbtest1
  2. dropdatabaseifexistsdbtest1;
  3. createdatabasedbtest1;
  4. usedbtest1;
  5. #在dbtest1上创建tb1
  6. createtabletb1(
  7. idintnotnull,
  8. gmtdatetime);
  9. #创建dbtest2
  10. dropdatabaseifexistsdbtest2;
  11. createdatabasedbtest2;
  12. usedbtest2;
  13. #在dbtest2上创建tb2
  14. createtabletb2(
  15. idintnotnull,
  16. valvarchar(256));
  17. #创建dbtest3
  18. dropdatabaseifexistsdbtest3;
  19. createdatabasedbtest3;
  20. usedbtest3;
  21. #在dbtest3上创建tb2
  22. createtabletb2(
  23. idintnotnull,
  24. valvarchar(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)。

[html]view plaincopy

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEcobar:schemaSYSTEM"schema.dtd">
  3. <cobar:schemaxmlns:cobar="http://cobar.alibaba.com/">
  4. <!--schema定义-->
  5. <schemaname="dbtest"dataNode="dnTest1">
  6. <tablename="tb2"dataNode="dnTest2,dnTest3"rule="rule1"/>
  7. </schema>
  8. <!--数据节点定义,数据节点由数据源和其他一些参数组织而成。-->
  9. <dataNodename="dnTest1">
  10. <propertyname="dataSource">
  11. <dataSourceRef>dsTest[0]</dataSourceRef>
  12. </property>
  13. </dataNode>
  14. <dataNodename="dnTest2">
  15. <propertyname="dataSource">
  16. <dataSourceRef>dsTest[1]</dataSourceRef>
  17. </property>
  18. </dataNode>
  19. <dataNodename="dnTest3">
  20. <propertyname="dataSource">
  21. <dataSourceRef>dsTest[2]</dataSourceRef>
  22. </property>
  23. </dataNode>
  24. <!--数据源定义,数据源是一个具体的后端数据连接的表示。-->
  25. <dataSourcename="dsTest"type="mysql">
  26. <propertyname="location">
  27. <location>192.168.0.1:3306/dbtest1</location><!--注意:替换为您的MySQLIP和Port-->
  28. <location>192.168.0.1:3306/dbtest2</location><!--注意:替换为您的MySQLIP和Port-->
  29. <location>192.168.0.1:3306/dbtest3</location><!--注意:替换为您的MySQLIP和Port-->
  30. </property>
  31. <propertyname="user">test</property><!--注意:替换为您的MySQL用户名-->
  32. <propertyname="password">test</property><!--注意:替换为您的MySQL密码-->
  33. <propertyname="sqlMode">STRICT_TRANS_TABLES</property>
  34. </dataSource>
  35. </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 plaincopy

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEcobar:ruleSYSTEM"rule.dtd">
  3. <cobar:rulexmlns:cobar="http://cobar.alibaba.com/">
  4. <!--路由规则定义,定义什么表,什么字段,采用什么路由算法。-->
  5. <tableRulename="rule1">
  6. <rule>
  7. <columns>id</columns>
  8. <algorithm><![CDATA[func1(${id})]]></algorithm>
  9. </rule>
  10. </tableRule>
  11. <!--路由函数定义,应用在路由规则的算法定义中,路由函数可以自定义扩展。-->
  12. <functionname="func1"class="com.alibaba.cobar.route.function.PartitionByLong">
  13. <propertyname="partitionCount">2</property>
  14. <propertyname="partitionLength">512</property>
  15. </function>
  16. </cobar:rule>

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

[html]view plaincopy

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEcobar:serverSYSTEM"server.dtd">
  3. <cobar:serverxmlns:cobar="http://cobar.alibaba.com/">
  4. <!--定义Cobar用户名,密码-->
  5. <username="root">
  6. <propertyname="password">passwd</property>
  7. <propertyname="schemas">dbtest</property>
  8. </user>
  9. </cobar:server>

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

4、运行Cobar

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

[html]view plaincopy

  1. 10:54:19,264INFO===============================================
  2. 10:54:19,265INFOCobarisreadytostartup...
  3. 10:54:19,265INFOStartupprocessors...
  4. 10:54:19,443INFOStartupconnector...
  5. 10:54:19,446INFOInitializedataNodes...
  6. 10:54:19,470INFOdnTest1:0initsuccess
  7. 10:54:19,472INFOdnTest3:0initsuccess
  8. 10:54:19,473INFOdnTest2:0initsuccess
  9. 10:54:19,481INFOCobarManagerisstartedandlisteningon9066
  10. 10:54:19,483INFOCobarServerisstartedandlisteningon8066
  11. 10:54:19,484INFO===============================================

接着,我们就可以使用“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配置成下面的样子。

[html]view plaincopy

  1. ......
  2. <!--数据节点定义,数据节点由数据源和其他一些参数组织而成。-->
  3. <dataNodename="dnTest1">
  4. <propertyname="dataSource">
  5. <dataSourceRef>dsTest[0]</dataSourceRef>
  6. </property>
  7. <!--Cobar与后端数据源连接池大小设置-->
  8. <propertyname="poolSize">256</property>
  9. <!--Cobar通过心跳来实现后端数据源HA,一旦主数据源心跳失败,便切换到备数据源上工作-->
  10. <!--Cobar心跳是通过向后端数据源执行一条SQL语句,根据该语句的返回结果判断数据源的运行情况-->
  11. <propertyname="heartbeat">selectuser()<property>
  12. </dataNode>
  13. ......

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

[html]view plaincopy

  1. ......
  2. <!--组建一个Cobar集群,只需在cluster配置中把所有Cobar节点(注意:包括当前Cobar自身)都配置上便可-->
  3. <cluster>
  4. <!--node名称,一个node表示一个Cobar节点,一旦配置了node,当前Cobar便会向此节点定期发起心跳,探测节点的运行情况-->
  5. <nodename="cobar1">
  6. <!--Cobar节点IP,表示当前Cobar将会向192.168.0.1上部署的Cobar发送心跳-->
  7. <propertyname="host">192.168.0.1</property>
  8. <!--节点的权重,用于客户端的负载均衡,用户可以通过命令查询某个节点的运行情况以及权重-->
  9. <propertyname="weight">1</property>
  10. </node>
  11. <!--当前Cobar将会向192.168.0.2上部署的Cobar发送心跳-->
  12. <nodename="cobar2">
  13. <propertyname="host">192.168.0.2</property>
  14. <propertyname="weight">2</property>
  15. </node>
  16. <!--当前Cobar将会向192.168.0.3上部署的Cobar发送心跳-->
  17. <nodename="cobar3">
  18. <propertyname="host">192.168.0.3</property>
  19. <propertyname="weight">3</property>
  20. </node>
  21. <!--用户还可以将Cobar节点分组,以便实现schema级别的细粒度负载均衡-->
  22. <groupname="group12">
  23. <propertyname="nodeList">cobar1,cobar2</property>
  24. </group>
  25. <groupname="group23">
  26. <propertyname="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)获取该项目的源码,真是太周到了,让我们为富有开源精神的阿里人掌声鼓励一下!

项目已经迁移到Git上面,地址为:https://github.com/alibaba/cobar

时间: 2024-09-17 04:24:37

Cobar使用文档(可用作MySQL大型集群解决方案)的相关文章

文档式数据库在Hadoop集群中的应用

2013年11月22-23日,作为国内唯一专注于Hadoop技术与应用分享的大规模行业盛会,2013 Hadoop中国技术峰会(China Hadoop Summit 2013)于北京福朋喜来登集团酒店隆重举行.来自国内外各行业领域的近千名CIO.CTO.架构师.IT经理.咨询顾问.工程师.Hadoop技术爱好者,以及从事Hadoop研究与推广的IT厂商和技术专家将共襄盛举. 在SQL&NoSQL专场,来自巨彬软件的CTO王涛做了<文档式数据库在Hadoop集群中的应用>演讲,从大数据

具备负载均衡功能MySQL服务器集群部署及实现

1. 引言 MySQL是一个高速度.高性能.多线程.开放源代码,建立在客户/服务器(Client/Server)结构上的关系型数据库管理系统(RDBMS).它始于1979年,最初是Michael Widenius为瑞典TcX公司创建的UNIREG数据库系统,当时的UNIREG没有SQL(Structured Query Language结构化查询语言)接口,限制了它的应用.1996年5月,Widenius开发出了MySQL的最初版本,开始在Internet上公开发行.MySQL的开发人员从一开始

对于一个偶尔高并发的活动页面(涉及db操作,db为mysql,集群部署),你怎么做

问题描述 对于一个偶尔高并发的活动页面(涉及db操作,db为mysql,集群部署),你怎么做 对于一个偶尔高并发的活动页面(涉及db操作,db为mysql,集群部署),你怎么做 解决方案 高并发的话,可以通过据库集群.库表散列.缓存等技术: 偶尔的话,建议选择mongoDB非关系数据库.你是开发的话我想应该懂mongoDB吧. 对了景安新推出快云mongoDB,你可以去免费公测试试. 解决方案二: 高并发,一般使用负载均衡解决前端访问问题,用进程管理器解决业务逻辑调度问题,db如果是你的业务瓶颈

状态快照转移:一种MySQL Galera集群较优的备份方法

作者介绍 王晶,中国移动DBA,负责"移动云"业务系统的数据库集成架构设计.运维.优化等工作:擅长技术领域MySQL,获Oracle颁发的"MySQL DBA"官方认证,熟悉MySQL复制结构.MHA.cluster等多种架构及运维优化.   MySQL Galera Cluster是一套基于WSREP进行同步复制的集群解决方案,配置和使用相对简单,具有多节点同时提供读写.可用性高.强一致性和快速扩展的特点.由于它能够分担读写压力,且具有较强的数据一致性,因此在很多

MySQL分布式集群搭建

1.准备集群搭建环境 使用6台虚拟机来搭建MySQL分布式集群,相应的实验环境与对应的MySQL节点之间的对应关系如下图所示: 管理节点(MGM):这类节点的作用是管理MySQLCluster内的其他节点,如提供配置数据,并停止节点,运行备份等.由于这类节点负责管理其他节点的配置,应该在启动其他节点之前启动这类节点.MGM节点是用命令"ndb_mgmd"启动的: 数据节点(NDB):这类节点用于保存Cluster的数据,数据节点的数目与副本的数目相关,是片段的倍数.例如,对于两个副本,

MySQL的集群配置的基本命令使用及一次操作过程实录_Mysql

1. 先了解一下你是否应该用MySQL集群. 减少数据中心结点压力和大数据量处理,采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面.其他不共享的数据还维持在各自分布的MySQL数据库本身中. 2. 集群MySQL中名称概念.(如上图) 1)Sql结点(SQL node--上图对应为MySQLd):分布式数据库.包括自身数据和查询中心结点数据. 2)数据结点(Data node

具有负载均衡功能的MySQL服务器集群部署及实现_Mysql

在实际生产环境中,部署和实现具有一定负载均衡功能的 MySQL服务器集群,对于提高用户数据库应用系统的性能.速度和稳定性具有明显的作用.本文简要介绍了在 FreeBSD 7.0-Release系统上部署实现MySQL服务器集群的方案,并对可能出现的问题提供了相应的解决方法.1. 引言MySQL是一个高速度.高性能.多线程.开放源代码,建立在客户/服务器(Client /Server)结构上的关系型数据库管理系统(RDBMS).它始于1979年,最初是Michael Widenius为瑞典TcX公

mysql服务器集群配置方法

mysql服务器集群配置方法 mysql-cluster安装 系统 centos5.1 32位(如何是64位下相应64位的rpm包) http://dev.mysql.com/get/downloads/mysql-cluster-7.0和下面的包名对应 一共有5个包: mysql-cluster-gpl-client-7.1.3-1.rhel5.i386.rpm mysql-cluster-gpl-management-7.1.3-1.rhel5.i386.rpm mysql-cluster-

MySQL Cluster集群的初级部署教程_Mysql

Mysql Cluster概述    MySql Cluster最显著的优点就是高可用性,高实时性,高冗余,扩展性强.    它允许在无共享的系统中部署"内存中"数据库的Cluster.通过无共享体系结构,系统能够使用廉价的硬件.此外,由于每个组件有自己的内存和磁盘,所以不存在单点故障.    它由一组计算机构成,每台计算机上均运行者多种进程,包括mysql服务器,NDB cluster的数据节点,管理服务启,以及专门的数据访问程序    所有的这些节点构成一个完整的mysql集群体系