Cobar是阿里巴巴开源(官方github)的一个对应用保持透明的MySQL数据库分布式处理中间件。
Cobar功能
将一张表拆分到不同的库。
将不同的表放入不同的库。
提供HA方案
Cobar约束
不支持跨库情况下的 join、分页、排序、子查询操作
SET 语句执行会被忽略,事务和字符集设置除外
分库情况下,insert 语句必须包含拆分字段列名
分库情况下,update 语句不能更新拆分字段的值
不支持 SAVEPOINT 操作
暂时只支持 MySQL 数据节点
Cobar安装
wget https://github.com/alibaba/cobar/releases/download/v1.2.7/cobar-server-1.2.7.tar.gz
tar -zxvf cobar-server-1.2.7.tar.gz
cd cobar-server-1.2.7
Cobar配置主要目录如下:
|--bin #包含Cobar的启动、重启、停止等脚本文件
| |--startup.sh #Linux环境启动脚本
| |--startup.bat #Windows环境启动脚本
| |--restart.sh #Linux环境重启脚本
| |--shutdown.sh #Linux环境停止脚本
|--conf #包含Cobar所有配置文件
| |--server.xml #Cobar系统、用户、集群等相关配置
| |--schema.xml #schema,dataNode,dataSource相关配置
| |--rule.xml #分布式规则定义
| |--log4j.xml #日志相关配置
|--lib #包含Cobar及其依赖的jar文件
|--logs #包含Cobar所有日志文件
Cobar配置实例:
(1)数据准备
1353053439_6762.jpg1) 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。
2) tb1表的数据被映射到物理数据库dbtest1的tb1上。
3) tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。
创建sql如下:
#创建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));
(2)配置schema.xml(数据库结构schema、数据节点dataNode、以及数据源dataSource)
<!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.15.130:3306/dbtest1</location>
<location>192.168.15.130:3306/dbtest2</location>
<location>192.168.15.130:3306/dbtest3</location>
</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="sqlMode">STRICT_TRANS_TABLES</property>
</dataSource>
</cobar:schema>
(3)配置rule.xml(分库分表规则)
<!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>
(4)配置server.xml(Cobar用户名、密码、端口、集群等)
<!DOCTYPE cobar:server SYSTEM "server.dtd">
<cobar:server xmlns:cobar="http://cobar.alibaba.com/">
<!-- 系统参数定义,服务端口、管理端口,处理器个数、线程池等。 -->
<!--
<system>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="initExecutor">16</property>
<property name="timerExecutor">4</property>
<property name="managerExecutor">4</property>
<property name="processors">4</property>
<property name="processorHandler">8</property>
<property name="processorExecutor">8</property>
<property name="clusterHeartbeatUser">_HEARTBEAT_USER_</property>
<property name="clusterHeartbeatPass">_HEARTBEAT_PASS_</property>
</system>
-->
<!-- 用户访问定义,用户名、密码、schema等信息。 -->
<user name="test">
<property name="password">test</property>
<property name="schemas">dbtest</property>
</user>
<!--
<user name="root">
<property name="password"></property>
</user>
-->
<!-- 集群列表定义,指定集群节点的主机和权重,用于集群间的心跳和客户端负载均衡。 -->
<!--
<cluster>
<node name="cobar1">
<property name="host">127.0.0.1</property>
<property name="weight">1</property>
</node>
</cluster>
-->
<!-- 隔离区定义,可以限定某个主机上只允许某个用户登录。 -->
<!--
<quarantine>
<host name="1.2.3.4">
<property name="user">test</property>
</host>
</quarantine>
-->
</cobar:server>
(5)启动Cobar
./startup.sh
可以查看启动成功日志,logs下stdout.log
01:34:42,078 INFO ===============================================
01:34:42,078 INFO Cobar is ready to startup ...
01:34:42,079 INFO Startup processors ...
01:34:44,115 INFO Startup connector ...
01:34:44,118 INFO Initialize dataNodes ...
01:34:44,703 INFO dnTest3:0 init success
01:34:44,762 INFO dnTest2:0 init success
01:34:44,915 INFO dnTest1:0 init success
01:34:45,103 INFO CobarManager is started and listening on 9066
01:34:45,133 INFO CobarServer is started and listening on 8066
01:34:45,134 INFO ===============================================
01:37:28,706 INFO [thread=Processor1-H0,class=ServerConnection,host=127.0.0.1,port=51797,schema=dbtest]'test' login success
05:19:14,912 WARN [thread=TimerExecutor3,class=ServerConnection,host=127.0.0.1,port=51797,schema=dbtest] idle timeout
07:41:16,532 INFO [thread=Processor2-H0,class=ServerConnection,host=127.0.0.1,port=51809,schema=dbtest]'test' login success
(6)使用Cobar
mysql -h127.0.0.1 -utest -ptest -P8066 -Ddbtest
insert into tb1 values (1,now());