從cobar到mycat的基本使用


Cobar 是由 Alibaba 開源的 MySQL 分佈式處理中間件,它可以在分佈式的環境下看上去像傳統數據庫一樣提供海量數據服務。

其實公司本身並沒有這方面的需求,單庫單表就足夠了,研究下純是因爲個人興趣,對於數據庫分別的原理,之前是有了解的,是採用一致性hash算法,這是個神奇的東西,它可以保證數據庫或者其他架構中節點的刪除與擴容,或者說跟普通hash算法做的分佈式相比它可以把影響降到最低。原理也是蠻簡單的,就是把按照hash可能計算出的結果排成一個圈,然後根據需求分成N份,每個hash出來的值都放在圈子範圍以爲,如果去除了某個節點那麼就放在離當前hash值最近的下一個範圍,詳細介紹可以參考這裏

下面繼續說cobar,cobar的安裝網上文章很多,而且基本是參考,呃不是複製,cobar的官方文檔,文檔本身講得就很明瞭,而且cobar的目錄結構,還有配置都是相當簡單,基本是看一下就明白是怎麼回事了,拷貝下網上的介紹

Cobar解壓之後有四個目錄:
bin/:可執行文件目錄,包含啓動(start)、關閉(shutdown)和重啓(restart)腳本
lib/:邏輯類庫目錄,包含了Cobar所需的jar包
conf/:配置文件目錄,下面會詳細介紹
logs/:運行日誌目錄,最主要的log有兩個:程序日誌(stdout.log)和控制檯輸出(console.log)

配置文件的用法如下:
log4j.xml:日誌配置,一般來說保持默認即可
schema.xml:定義了schema邏輯層次圖中的所有元素,並利用這些元素以及rule.xml中定義的規則組建分佈式數據庫系統
rule.xml:定義了分庫分表的規則
server.xml:系統配置文件


其中rule.xml是通過函數來做分片的,cobar本身提供了三個方法PartitionByString,PartitionByLong,PartitionByFileMap,也可以自己來重寫,非常的人性化。

說下自己在啓動時候碰到的一些問題,首先啓動前要設置好JAVA_HOME,不然會直接報錯,然後啓動的時候要看下啓動腳本中的關於JVM的參數設置,確保自己內存足夠,我開始沒注意在我自己的阿里雲服務器上就報錯了,主要是我內存太小,初始設置是

#set JAVA_OPTS
JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xmn256m -Xss256k"
#performance Options
JAVA_OPTS="$JAVA_OPTS -XX:+AggressiveOpts"
JAVA_OPTS="$JAVA_OPTS -XX:+UseBiasedLocking"
JAVA_OPTS="$JAVA_OPTS -XX:+UseFastAccessorMethods"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -XX:+CMSParallelRemarkEnabled"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSCompactAtFullCollection"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JAVA_OPTS="$JAVA_OPTS -XX:CMSInitiatingOccupancyFraction=75"
啓動之後首先要看下logs目錄下的日誌文件,根據不同類型會寫的不同的文件中,console.log應該是總的輸出,這個沒有具體考究。

把虛擬機佔用內存調小後,可以跑起來了,鏈接自己本地數據庫是沒問題,如果有報錯首先多檢查檢查配置,還有數據庫的訪問權限,cobar這個跟客戶端直連是不同的,cobar相當於一個代理,它會在其中做一些手腳,所以連起來沒那麼方便,經常出一些莫名的錯誤。

啓動成功後在插入了幾條數據,再到實際mysql庫中去看,是成功的,根據配置進行了分片。

但是之後又發現一個問題,用SEQ,NAVICAT等軟件連不上cobar呢,但是用命令可以,用命令鏈接時候需要注意,mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB,host很重要,用localhost就連不上,客戶端連不上的問題網上也搜不到,後來看到了介紹mycat的文章中說,最新版的mycat已經修復了這個問題,所以就應該之前cobar存在這個bug。

轉戰mycat後真的是非常順利。只要設置好權限怎麼連都不會有問題,用工具也能連得上mycat了。而且用過了cobar後上手mycat也非常簡單,搭建完成了下一步開始讀mycat的源碼,還有學習mysql的鏈接過程看看這些中間件到底是做了些什麼。

附上之前的錯誤,很多次連接不上都是報這個,看代碼是在獲取字符集時候出錯,但是爲什麼會出錯呢??

18:24:45,717 WARN  dnTest1:0 init error.
java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: 224
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:206)
	at com.alibaba.cobar.mysql.bio.MySQLChannel.connect(MySQLChannel.java:185)
	at com.alibaba.cobar.mysql.MySQLDataSource.getChannel(MySQLDataSource.java:159)
	at com.alibaba.cobar.mysql.MySQLDataNode.initSource(MySQLDataNode.java:357)
	at com.alibaba.cobar.mysql.MySQLDataNode.init(MySQLDataNode.java:78)
	at com.alibaba.cobar.CobarServer.startup(CobarServer.java:124)
	at com.alibaba.cobar.CobarStartup.main(CobarStartup.java:36)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 224
	at com.alibaba.cobar.mysql.CharsetUtil.getCharset(CharsetUtil.java:134)
	at com.alibaba.cobar.mysql.bio.MySQLChannel.handshake(MySQLChannel.java:329)
	at com.alibaba.cobar.mysql.bio.MySQLChannel.access$000(MySQLChannel.java:66)
	at com.alibaba.cobar.mysql.bio.MySQLChannel$1.call(MySQLChannel.java:180)
	at com.alibaba.cobar.mysql.bio.MySQLChannel$1.call(MySQLChannel.java:176)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章