存儲(chǔ)] Cobar使用文檔(可用作MySQL大型集群解決方案)
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
最近好不容易抽空研究了下Cobar,感覺這個(gè)產(chǎn)品確實(shí)很不錯(cuò)(在文檔方面比Amoeba強(qiáng)多了),特此推薦給大家。Cobar是阿里巴巴研發(fā)的關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng),該產(chǎn)品成功替代了原先基于Oracle的數(shù)據(jù)存儲(chǔ)方案,目前已經(jīng)接管了3000+個(gè)MySQL數(shù)據(jù)庫(kù)的schema,平均每天處理近50億次的SQL執(zhí)行請(qǐng)求。
首先,使用Cobar的核心功能如下:
分布式:
Cobar的分布式主要是通過將表放入不同的庫(kù)來實(shí)現(xiàn):
1. Cobar支持將一張表水平拆分成多份分別放入不同的庫(kù)來實(shí)現(xiàn)表的水平拆分
2. Cobar也支持將不同的表放入不同的庫(kù)
3. 多數(shù)情況下,用戶會(huì)將以上兩種方式混合使用
這里需要強(qiáng)調(diào)的是,Cobar不支持將一張表,例如test表拆分成test_1, test_2, test_3.....放在同一個(gè)庫(kù)中,必須將拆分后的表分別放入不同的庫(kù)來實(shí)現(xiàn)分布式。
HA:
在用戶配置了MySQL心跳的情況下,Cobar可以自動(dòng)向后端連接的MySQL發(fā)送心跳,判斷MySQL運(yùn)行狀況,一旦運(yùn)行出現(xiàn)異常,Cobar可以自動(dòng)切換到備機(jī)工作。但需要強(qiáng)調(diào)的是:
1. Cobar的主備切換有兩種觸發(fā)方式,一種是用戶手動(dòng)觸發(fā),一種是Cobar的心跳語句檢測(cè)到異常后自動(dòng)觸發(fā)。那么,當(dāng)心跳檢測(cè)到主機(jī)異常,切換到備機(jī),如果主機(jī)恢復(fù)了,需要用戶手動(dòng)切回主機(jī)工作,Cobar不會(huì)在主機(jī)恢復(fù)時(shí)自動(dòng)切換回主機(jī),除非備機(jī)的心跳也返回異常。
2. Cobar只檢查MySQL主備異常,不關(guān)心主備之間的數(shù)據(jù)同步,因此用戶需要在使用Cobar之前在MySQL主備上配置雙向同步,詳情可以參閱MySQL參考手冊(cè)。
其次,我們也需要注意Cobar的功能約束:
1) 不支持跨庫(kù)情況下的join、分頁(yè)、排序、子查詢操作。
2) SET語句執(zhí)行會(huì)被忽略,事務(wù)和字符集設(shè)置除外。
3) 分庫(kù)情況下,insert語句必須包含拆分字段列名。
4) 分庫(kù)情況下,update語句不能更新拆分字段的值。
5) 不支持SAVEPOINT操作。
6) 暫時(shí)只支持MySQL數(shù)據(jù)節(jié)點(diǎn)。
7) 使用JDBC時(shí),不支持rewriteBatchedStatements=true參數(shù)設(shè)置(默認(rèn)為false)。
8) 使用JDBC時(shí),不支持useServerPrepStmts=true參數(shù)設(shè)置(默認(rèn)為false)。
9) 使用JDBC時(shí),BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法設(shè)置參數(shù)。
然后,我們來分析一下Cobar邏輯層次圖:
* dataSource:數(shù)據(jù)源,表示一個(gè)具體的數(shù)據(jù)庫(kù)連接,與物理存在的數(shù)據(jù)庫(kù)schema一一對(duì)應(yīng)。
* dataNode:數(shù)據(jù)節(jié)點(diǎn),由主、備數(shù)據(jù)源,數(shù)據(jù)源的HA以及連接池共同組成,可以將一個(gè)dataNode理解為一個(gè)分庫(kù)。
* table:表,包括拆分表(如tb1,tb2)和非拆分表。
* tableRule:路由規(guī)則,用于判斷SQL語句被路由到具體哪些datanode執(zhí)行。
* schema:cobar可以定義包含拆分表的schema(如schema1),也可以定義無拆分表的schema(如schema2)。
Cobar支持的數(shù)據(jù)庫(kù)結(jié)構(gòu)(schema)的層次關(guān)系具有較強(qiáng)的靈活性,用戶可以將表自由放置不同的datanode,也可將不同的datasource放置在同一MySQL實(shí)例上。在實(shí)際應(yīng)用中,我們需要通過配置文件(schema.xml)來定義我們需要的數(shù)據(jù)庫(kù)服務(wù)器和表的分布策略,這點(diǎn)我們將在后面的安裝和配置部分中介紹到。
接著,我們來介紹Cobar的安裝和配置步驟:
下面我們將使用一個(gè)最簡(jiǎn)單的分庫(kù)分表的例子來說明Cobar的基本用法,數(shù)據(jù)庫(kù)schema如下圖(該實(shí)例也可參考:Cobar產(chǎn)品首頁(yè))。
1) 系統(tǒng)對(duì)外提供的數(shù)據(jù)庫(kù)名是dbtest,并且其中有兩張表tb1和tb2。
2) tb1表的數(shù)據(jù)被映射到物理數(shù)據(jù)庫(kù)dbtest1的tb1上。
3) tb2表的一部分?jǐn)?shù)據(jù)被映射到物理數(shù)據(jù)庫(kù)dbtest2的tb2上,另外一部分?jǐn)?shù)據(jù)被映射到物理數(shù)據(jù)庫(kù)dbtest3的tb2上。
1、環(huán)境準(zhǔn)備
操作系統(tǒng):Linux或者Windows (推薦在Linux環(huán)境下運(yùn)行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、數(shù)據(jù)準(zhǔn)備
假設(shè)本文MySQL所在服務(wù)器IP為192.168.0.1,端口為3306,用戶名為test,密碼為空,我們需要?jiǎng)?chuàng)建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,SQL如下:
[sql]view plaincopy
#創(chuàng)建dbtest1
dropdatabaseif?exists?dbtest1;
createdatabasedbtest1;
use?dbtest1;
#在dbtest1上創(chuàng)建tb1
createtabletb1(
idintnotnull,
gmt???datetime);
#創(chuàng)建dbtest2
dropdatabaseif?exists?dbtest2;
createdatabasedbtest2;
use?dbtest2;
#在dbtest2上創(chuàng)建tb2
createtabletb2(
idintnotnull,
valvarchar(256));
#創(chuàng)建dbtest3
dropdatabaseif?exists?dbtest3;
createdatabasedbtest3;
use?dbtest3;
#在dbtest3上創(chuàng)建tb2
createtabletb2(
idintnotnull,
valvarchar(256));
3、配置Cobar
Cobar解壓之后有四個(gè)目錄:
bin/:可執(zhí)行文件目錄,包含啟動(dòng)(start)、關(guān)閉(shutdown)和重啟(restart)腳本
lib/:邏輯類庫(kù)目錄,包含了Cobar所需的jar包
conf/:配置文件目錄,下面會(huì)詳細(xì)介紹
logs/:運(yùn)行日志目錄,最主要的log有兩個(gè):程序日志(stdout.log)和控制臺(tái)輸出(console.log)
配置文件的用法如下:
log4j.xml:日志配置,一般來說保持默認(rèn)即可
schema.xml:定義了schema邏輯層次圖中的所有元素,并利用這些元素以及rule.xml中定義的規(guī)則組建分布式數(shù)據(jù)庫(kù)系統(tǒng)
rule.xml:定義了分庫(kù)分表的規(guī)則
server.xml:系統(tǒng)配置文件
我們?cè)趕chema.xml中配置數(shù)據(jù)庫(kù)結(jié)構(gòu)(schema)、數(shù)據(jù)節(jié)點(diǎn)(dataNode)、以及數(shù)據(jù)源(dataSource)。
[html]view plaincopy
dsTest[0]
dsTest[1]
dsTest[2]
192.168.0.1:3306/dbtest1
192.168.0.1:3306/dbtest2
192.168.0.1:3306/dbtest3
test
test
STRICT_TRANS_TABLES
我們注意到,上述配置實(shí)際上已經(jīng)把圖2中的數(shù)據(jù)庫(kù)結(jié)構(gòu)配置好了。dbtest主要映射的是dnTest1庫(kù)(即192.168.0.1:3306/dbtest1庫(kù)),而其中的tb2表則是按照規(guī)則rule1,被分配到dnTest2庫(kù)(即192.168.0.1:3306/dbtest2庫(kù))和dnTest3庫(kù)(即192.168.0.1:3306/dbtest3庫(kù))中。此外,規(guī)則rule1的定義可以在rule.xml中找到,代碼如下:
[html]view plaincopy
id
2
512
結(jié)合schema.xml中的內(nèi)容,我們可以看出分表的規(guī)則是,按照id字段把tb2表中的數(shù)據(jù)分配到dnTest2和dnTest3兩個(gè)分區(qū)中,其中id小于512的數(shù)據(jù)會(huì)被放到dnTest2庫(kù)的分區(qū)中,而其余的會(huì)被放到dnTest3庫(kù)的分區(qū)中,更多路由算法可以參考《路由文檔》。最后,我們來看一下server.xml的配置,代碼如下。
[html]view plaincopy
passwd
dbtest
這里的server.xml配置比較簡(jiǎn)單,只配置了本地Cobar服務(wù)的數(shù)據(jù)庫(kù)結(jié)構(gòu)、用戶名和密碼。在啟動(dòng)Cobar服務(wù)之后,使用用戶名root和密碼passwd就可以登錄Cobar服務(wù)。
4、運(yùn)行Cobar
啟動(dòng)Cobar服務(wù)很簡(jiǎn)單,運(yùn)用bin目錄下的start.sh即可(停止使用shutdown.sh)。啟動(dòng)成功之后,可以在logs目錄下的stdout.log中看到如下日志:
[html]view plaincopy
10:54:19,264INFO===============================================
10:54:19,265?INFO??Cobar?is?ready?to?startup?...
10:54:19,265?INFO??Startup?processors?...
10:54:19,443?INFO??Startup?connector?...
10:54:19,446?INFO??Initialize?dataNodes?...
10:54:19,470?INFO??dnTest1:0?init?success
10:54:19,472?INFO??dnTest3:0?init?success
10:54:19,473?INFO??dnTest2:0?init?success
10:54:19,481?INFO??CobarManager?is?started?and?listening?on?9066
10:54:19,483?INFO??CobarServer?is?started?and?listening?on?8066
10:54:19,484INFO===============================================
接著,我們就可以使用“mysql -h127.0.0.1 -uroot -ppasswd -P8066 -Ddbtest”命令來登錄Cobar服務(wù)了,再接下來的操作就和在其他MySQL Client中一樣了。比如,我們可以使用“show databases”命令查看數(shù)據(jù)庫(kù),使用“show tables”命令查看數(shù)據(jù)表,如下圖:
接著,我們按照下圖中的SQL指定向數(shù)據(jù)表插入測(cè)試記錄。
可以看到,這里的tb2中包含了id為1、2、513的3條記錄。而實(shí)際上,這3條記錄存儲(chǔ)在不同的物理數(shù)據(jù)庫(kù)上的,大家可以到物理庫(kù)上驗(yàn)證一下。
至于Cobar的連接和使用方法和MySQL一樣,Java程序中可以使用JDBC(建議5.1以上的版本),PHP中可以使用PDO。當(dāng)然,Cobar還提供HA、集群等高級(jí)的功能,更多信息請(qǐng)參考其《產(chǎn)品文檔》。此外,產(chǎn)品文檔中還為我們提供了詳細(xì)的PPT文檔《Cobar原理及應(yīng)用.ppt》來介紹Cobar在實(shí)際生產(chǎn)環(huán)境中的使用方法,真可謂之用心良苦啊!
此外,特別解釋一下大家可能比較關(guān)心的心跳檢測(cè)問題,Cobar的心跳檢測(cè)主要用在以下兩個(gè)地方。
1、在配置數(shù)據(jù)節(jié)點(diǎn)的時(shí)候,我們需要使用心跳檢測(cè)來探測(cè)數(shù)據(jù)節(jié)點(diǎn)的運(yùn)行狀況。Cobar中使用執(zhí)行SQL的方式來進(jìn)行探測(cè),簡(jiǎn)單且實(shí)用。例如,我們可以把前面實(shí)例中的schema.xml中的dataNode配置成下面的樣子。
[html]view plaincopy
...?...
dsTest[0]
256
select?user()
...?...
2、當(dāng)我們需要對(duì)Cobar作集群(cluster),進(jìn)行負(fù)載均衡的時(shí)候,我們也需要用到心跳機(jī)制。不過此處的配置則是在server.xml中,代碼如下:
[html]view plaincopy
...?...
192.168.0.1
1
192.168.0.2
2
192.168.0.3
3
cobar1,cobar2
cobar2,cobar3
...?...
最后,簡(jiǎn)單看一下Cobar的實(shí)現(xiàn)原理。
首先是系統(tǒng)模塊架構(gòu)。
從上圖中可以看到,Cobar的前、后端模塊都實(shí)現(xiàn)了MySQL協(xié)議;當(dāng)接受到SQL請(qǐng)求時(shí),會(huì)依次進(jìn)行解釋(SQL Parser)和路由(SQL Router)工作,然后使用SQL Executor去后端模塊獲取數(shù)據(jù)集(后端模塊還負(fù)責(zé)心跳檢測(cè)功能);如果數(shù)據(jù)集來自多個(gè)數(shù)據(jù)源,Cobar則需要把數(shù)據(jù)集進(jìn)行組合(Result Merge),最后返回響應(yīng)。整個(gè)過程應(yīng)該比較容易理解,
下面是Cobar的網(wǎng)絡(luò)通訊模塊架構(gòu)。
從上圖中可以看出,Cobar采用了主流的Reactor設(shè)計(jì)模式來處理請(qǐng)求,并使用NIO進(jìn)行底層的數(shù)據(jù)交換,這大大提升系統(tǒng)的負(fù)載能力。其中,NIOAcceptor用于處理前端請(qǐng)求,NIOConnector則用于管理后端的連接,NIOProcessor用于管理多線程事件處理,NIOReactor則用于完成底層的事件驅(qū)動(dòng)機(jī)制,就是看起來和Mina和Netty的網(wǎng)絡(luò)模型比較相似。如果有興趣,大家還可以到Cobar站點(diǎn)的下載頁(yè)面(http://code.alibabatech.com/wiki/display/cobar/release)獲取該項(xiàng)目的源碼,真是太周到了,讓我們?yōu)楦挥虚_源精神的阿里人掌聲鼓勵(lì)一下!
轉(zhuǎn)載 http://blog.csdn.net/shagoo/article/details/8191346