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());