Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。
- 产品在阿里巴巴B2B公司已经稳定运行了3年以上。
- 目前已经接管了3000+个MySQL数据库的schema,为应用提供数据服
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参考手册。
1:环境配置:操作系统:虚拟机 centos 6.4
MySQL: 5.1
JDK: OpenJDK1.7.0.9或JDK1.6
Cobar: 1.2.7
2:配置Cobarschema.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="t_student" dataNode="dnTest2,dnTest3" rule="rule1" /><!--注意:那个表从2个库中取数据-->
</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.100:3307/db_studentinfo</location><!--注意:替换为您的MySQL IP和Port-->
<location>192.168.0.100:3307/db_studentinfo2</location><!--注意:替换为您的MySQL IP和Port-->
<location>192.168.0.100:3307/db_studentinfo3</location><!--注意:替换为您的MySQL IP和Port-->
</property>
<property name="user">root</property>
<property name="password">XXX</property>
<property name="sqlMode">STRICT_TRANS_TABLES</property>
</dataSource>
</cobar:schema>
路由规则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>stuNo</columns>
<algorithm><![CDATA[ func1(${stuNo}) ]]></algorithm>
</rule>
</tableRule>
<!-- 路由函数定义 -->
<function name="func1" class="com.alibaba.cobar.route.function.PartitionByString">
<property name="partitionCount">2</property><!-- 有几个分库 -->
<property name="partitionLength">512</property><!-- partitionCount * partitionLength=1024 -->
</function>
</cobar:rule>
服务配置server.xml 可不用改变
3:启动 进入Cobar的bin目录可以看到Cobar的启动、停止与重启脚本 执行
.
/startup
.sh
查看logs目录下stdout.log, 启动成功日志如下
12:03:58,797 INFO ===============================================12:03:58,812 INFO Cobar is ready to startup ...12:03:58,828 INFO Startup processors ...12:03:59,031 INFO Startup connector ...12:03:59,031 INFO Initialize dataNodes ...12:03:59,203 INFO dnTest1:0 init success12:03:59,203 INFO dnTest3:0 init success12:03:59,219 INFO dnTest2:0 init success12:03:59,234 INFO CobarManager is started and listening on 906612:03:59,234 INFO CobarServer is started and listening on 806612:03:59,234 INFO ===============================================12:05:08,484 INFO [thread=Processor1-H0,class=ServerConnection,host=192.168.0.100,port=4748,schema=dbtest]'test' login success
4:测试 在java开发应用中只要数据库的连接和用户密码就可以了 dbUrl="jdbc:mysql://192.168.0.100:8066/dbtest";
dbUserName="test";
dbPassword="test"; 和连接mysql数据库操作完全一样2 插入语句 insert into t_student(stuNo,stuName,sex,birthday,gradeId,email,stuDesc) values(?,?,?,?,?,?,?) stuNo=0101001 数据写入 db_studentinfo3 stuNo=13001 数据写入 db_studentinfo2 可以在mysql数据库查询。 5:架构
- Front-end Communication: Cobar与前端应用的通信模块
- SQL Parser : SQL解析,提取SQL中的重要信息
- SQL Router : 决定SQL语句被分发到哪些库执行
- SQL Excutor : 执行SQL语句
- Result-Merger : 合并多个库的执行结果
- DataNode,HA Pool,JDBC : 后端数据访问
后端数据访问