運行環境:
- 主機1:Ubuntu14.04 Desktop + MySQL5.5 + JDK 1.7(HP Z400) ?內網IP地址:192.168.137.8
- NODE1:Ubuntu 13.04 server + MySQL5.5 ?內網IP地址:192.168.137.31
- NODE2:Ubuntu 13.04 server + MySQL5.5 ?內網IP地址:192.168.137.32
注:(NODE1和NODE2運行于XEN虛擬化平臺,硬件環境HP Z800)
Cobar簡介:
Cobar是關系型數據庫的分布式處理系統,它可以在分布式的環境下看上去像傳統數據庫一樣為您提供海量數據服務。
- ? ? ? ?產品在阿里巴巴B2B公司已經穩定運行了3年以上。
- ? ? ? ?目前已經接管了3000+個MySQL數據庫的schema,為應用提供數據服務。
- ? ? ? ?據最近統計cobar集群目前平均每天處理近50億次的SQL執行請求。
Cobar最主要解決的問題是:分布式和HA。
分布式:主要是通過將同一個表的數據拆分成多個,放入不同的數據庫實例,查詢的時候也會按照同樣的操作方式,來更新具體數據庫實例中的對應的數據。
HA:高可用性,在設置了MYSQL心跳的情況下,如果主數據庫發生了異常,Cobar會自動連接從數據庫,如果主數據庫恢復正常,只能手動恢復到主數據庫。Cobar只負責切換數據庫實例,不負責主從數據庫的同步,所以需要提前將主從數據庫設置雙向同步。
存在的不足:
- ? (1).不支持跨庫情況下的join、分頁、排序、子查詢操作。
- ? (2).SET語句執行會被忽略,事務和字符集設置除外。
- ? (3).分庫情況下,insert語句必須包含拆分字段列名。
- ? (4).分庫情況下,update語句不能更新拆分字段的值。
- ? (5).不支持SAVEPOINT操作。
- ? (6).暫時只支持MySQL數據節點。
- ? (7).使用JDBC時,不支持rewriteBatchedStatements=true參數設置(默認為false)。
- ? (8).使用JDBC時,不支持useServerPrepStmts=true參數設置(默認為false)。
- ? (9).使用JDBC時,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法設置參數。
當然,如果想努力實現這些功能,可以fork官方的源碼: https://github.com/alibaba/cobar
環境搭建
- Cobar服務器:192.168.137.8:8066 用戶名/密碼:root/sa 實例名:dbtest
- 主機1:192.168.137.8:3306 用戶名/密碼:cobar/sa 實例名:dbtest1
- Node1:192.168.137.31:3306 用戶名/密碼:cobar/sa 實例名:dbtest2
- Node2:192.168.137.32:3306 用戶名/密碼:cobar/sa 實例名:dbtest3
Cobar-Server-1.2.7版本下載: http://pan.baidu.com/s/1pJudQh9
實驗拓撲圖如下:
?
?
首先分別在三個主機創建數據庫實例:
#創建dbtest1腳本 dropdatabaseif exists dbtest1; createdatabasedbtest1; use dbtest1; #在dbtest1上創建tb1 createtabletb1( id intnotnull, gmt datetime); #創建dbtest2 dropdatabaseif exists dbtest2; createdatabasedbtest2; use dbtest2; #在dbtest2上創建tb2 createtabletb2( id intnotnull, val varchar( 256 )); #創建dbtest3 dropdatabaseif exists dbtest3; createdatabasedbtest3; use dbtest3; #在dbtest3上創建tb2 createtabletb2( id intnotnull, val varchar( 256 ));
Cobar配置:
schema.xml配置如下
<!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 . 137.8 : 3306 /dbtest1</location> <location> 192.168 . 137.31 : 3306 /dbtest2</location> <location> 192.168 . 137.32 : 3306 /dbtest3</location> </property> <property name= " user " >cobar</property> <property name= " password " >sa</property> <property name= " sqlMode " >STRICT_TRANS_TABLES</property> </dataSource> </cobar:schema>
server.xml簡單配置
<!DOCTYPE cobar:server SYSTEM " server.dtd " > <cobar:server xmlns:cobar= " http://cobar.alibaba.com/ " > <!-- 用戶訪問定義,用戶名、密碼、schema等信息。 --> <user name= " root " > <property name= " password " >sa</property> <property name= " schemas " >dbtest</property> </user> </cobar:server>
rule.xml配置
<!DOCTYPE cobar:rule SYSTEM " rule.dtd " > <cobar:rule xmlns:cobar= " http://cobar.alibaba.com/ " > <!-- 路由規則定義,定義什么表,什么字段,采用什么路由算法 --> <tableRule name= " rule1 " > <rule> <columns>val</columns> <algorithm><![CDATA[ func2(${val}) ]]></algorithm> </rule> </tableRule> <!-- 路由函數定義 --> <function name= " func1 " class = " com.alibaba.cobar.route.function.PartitionByLong " > <property name= " partitionCount " > 2 </property> <property name= " partitionLength " > 512 </property> </function> <!-- 路由函數定義 --> <function name= " func2 " class = " com.alibaba.cobar.route.function.PartitionByString " > <property name= " partitionCount " > 2 </property> <property name= " partitionLength " > 512 </property> <property name= " hashSlice " >- 5 :</property> </function> </cobar:rule>
這里需要說明,INSERT語句中必須包含路由規則定義的字段,否則Cobar不會對數據進行拆分,同時存儲到多個數據庫實例中,比如上面的tb2表中,id字段如果設置了auto_increment,插入語句中不用指明id字段,這樣就無法達到數據包拆分的目的。
準備完成之后直接運行bin目錄下的./startup.sh即可。
然后查看輸入的日志:
yan@yan-Z400:~/cobar-server- 1.2 . 7 /logs$ tail - f stdout.log 09 : 57 : 00 , 155 INFO Cobar is ready to startup ... 09 : 57 : 00 , 155 INFO Startup processors ... 09 : 57 : 00 , 198 INFO Startup connector ... 09 : 57 : 00 , 202 INFO Initialize dataNodes ... 09 : 57 : 00 , 811 INFO dnTest1: 0 init success 09 : 57 : 00 , 816 INFO dnTest3: 0 init success 09 : 57 : 00 , 821 INFO dnTest2: 0 init success 09 : 57 : 00 , 835 INFO CobarManager is started and listening on 9066 09 : 57 : 00 , 837 INFO CobarServer is started and listening on 8066 09 : 57 : 00 , 837 INFO ===============================================
?
這樣cobar服務端就已經啟動。
直接使用jdbc或mysql終端連接cobar:
yan@yan-Z400:~$ mysql -uroot -psa -P8066 -h192. 168.137 . 8 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.1 . 48 -cobar- 1.2 . 7 Cobar Server (ALIBABA) Copyright (c) 2000 , 2013 , Oracle and/ or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/ or its affiliates. Other names may be trademarks of their respective owners. Type ' help; ' or ' \h ' for help. Type ' \c ' to clear the current input statement.
下面使用幾句Pyhton進行數據庫的插入操作:
#!/usr/bin/ env python #coding =utf- 8 import MySQLdb #連接 cxn = MySQLdb.Connect(host= ' 192.168.137.8 ' ,port= 8066 , user = ' root ' , passwd = ' sa ' ) #游標 cur = cxn.cursor() cur.execute( " USE dbtest " ) for i in range( 1 , 200 ): cur.execute( " INSERT INTO tb2 (val) values ('this is a test record %d') " % i) print ' insert the %d record into cobar ' % i cur.close() cxn.commit() cxn.close()
插入后查看數據庫dbtest2和數據dbtest3的情況:
可以看到有100條數據插入了dbtest2,99條數據插入了dbtest3。
后面會對Cobar進行更深入的了解。我的Fork分支
(完)
?
?
原創作品,轉載請標明:http://blog.geekcome.com/archives/252
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
