存儲(chǔ)] Cobar使用文檔(可用作MySQL大型集群解決方案)

存儲(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,845評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容