Cobar來源於強大的阿里團隊。隨着業務量的迅速增加,屬於量也跟隨迅猛增加。單點的Oracle+小型機出現了瓶頸,不能知足業務需求。擺在面前的有三種選擇:html
升級小型機的硬件java
購買多臺小型機以分散各個業務node
以廉價PC服務器+開源數據庫替代之mysql
很顯然第三種選擇的優點遠遠大於前兩種。因而乎,強大的阿里團隊選擇了第三種方案,於是解決了下面幾個問題:linux
數據和訪問從集中式改變爲分佈式git
提供數據節點的failovergithub
解決鏈接數過大的問題web
對業務代碼侵入性少sql
聽說截至2012年6月開源Cobar,做爲數據庫中間件Cobar已在阿里巴巴B2B公司穩定運行了3年以上。shell
此處不得不嘮叨幾句,做爲阿里的開源產品,在開源之初應該是能夠從官方網站獲取到的,也不知爲何現現在所謂的官方網址http://code.alibabatech.com/wiki/display/cobar/release/已沒法訪問。可是咱們能夠從github上download。
在獲取到的文件夾下有如圖所示幾個子目錄
很明瞭的能夠看出,doc裏存放了一些關於Cobar的文檔,其他三個即是source code,driver是相似於mysql-jdbc的一個鏈接驅動源碼。manager是一個web類型的Cobar客戶端監視源碼。最主要的是最後一個Server,全部的核心部分便在這個裏面。
因爲Cobar的源碼是基於maven構建的,有必要安裝maven。至於maven的安裝此處不作以詳解(下載maven壓縮包解壓並配置M2_HOME).
在Cobar-Master/erver目錄下執行mvn package命令。在執行完後會在Server源碼文件夾的target的目錄下發現兩個分別命名爲"cobar-server-1.2.7.tar.gz"和「cobar-server-1.2.7.zip」的兩個壓縮包。很明顯的在Windows上使用後者,在Linux上使用前者。
解壓壓縮包。運行startup 腳本。此處不得不注意下startup.bat文件中指定的cobar 版本號問題,由於源碼編輯獲得的版本是1.2.7,而startup.bat默認指定的是1.3.0。若不修改,當運行的過程當中將會提示錯誤找不到主類(main class).固然對於此類中間件是建議在Linux上run的,對於上述問題即可不加關心。此處仍是着重介紹下在Linux環境下的安裝:
jdk是必須的,不管是系統默認安裝的jdk仍是我的手動安裝的,都須要配置環境變量。如下僅做爲參考:
vim /etc/profile //添加下列內容 export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64
mysql數據庫固然是必須的,關於mysql的安裝以及多個實例的實現請參考CentOS 安裝多個mysql實例。
將Cobar的壓縮包cobar-server-1.2.7.tar.gz經過winscp或者pscp工具複製到centos上的某個目錄下,例如/home下。
tar -xzvf cobar-server-1.2.7.tar.gz //解壓出來的內容以下 cobar-server-1.2.7/lib/log4j-1.2.17.jar cobar-server-1.2.7/lib/cobar-server-1.2.7.jar cobar-server-1.2.7/bin/ cobar-server-1.2.7/bin/restart.sh cobar-server-1.2.7/bin/shutdown.sh cobar-server-1.2.7/bin/startup.bat cobar-server-1.2.7/bin/startup.sh cobar-server-1.2.7/conf/ cobar-server-1.2.7/conf/log4j.xml cobar-server-1.2.7/conf/rule.xml cobar-server-1.2.7/conf/schema.xml cobar-server-1.2.7/conf/server.xml
分析一下解壓的到的Cobar目錄結構與其餘程序也沒什麼區別:bin,conf,lib固然在未啓動以前log目錄是看不到的。
startup.sh啓動Cobar服務的腳本
shutdown.sh中止Cobar服務的腳本
restart.sh重啓Cobar服務的腳本
cobar-server-1.2.7.jar就是經過源碼所生成的,啓動有一個main方法使的該jar文件具備executable特性
log4j-1.2.17.jar是Cobar所依賴的日誌管理工具。
log4j.xml天然是配置日誌信息,在Java項目下你們基本都瞭解,此處不作過多解釋。
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="${cobar.home}/logs/stdout.log" /> <param name="append" value="true" /> <param name="encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m%n" /> </layout> </appender> <appender name="ALARM" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="${cobar.home}/logs/alarm.log" /> <param name="append" value="true" /> <param name="encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m%n" /> </layout> </appender> <appender name="HEARTBEAT" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="${cobar.home}/logs/heartbeat.log" /> <param name="append" value="true" /> <param name="encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m%n" /> </layout> </appender> <logger name="com.alibaba.cobar.CobarServer"> <level value="info" /> </logger> <logger name="com.alibaba.cobar.net.handler.FrontendAuthenticator"> <level value="info" /> </logger> <logger name="com.alibaba.cobar.mysql.MySQLDataNode"> <level value="info" /> </logger> <logger name="alarm"> <level value="error" /> <appender-ref ref="ALARM" /> </logger> <logger name="heartbeat" additivity="false"> <level value="warn" /> <appender-ref ref="HEARTBEAT" /> </logger> <root> <level value="warn" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
schema.xml關於數據庫配置的文件。
此處須要提示的是因爲windows與linux在文本編碼方面的存在的一些差別,不建議在xml配置文件中用中文註釋,不然會在啓動Cobar過程當中因讀取xml而發生異常以下。
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence. at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687) at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:435) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(XMLEntityScanner.java:1252) at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(XMLScanner.java:778) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(XMLDocumentFragmentScannerImpl.java:1046) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2980) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347) at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121) at com.alibaba.cobar.config.util.ConfigUtil.getDocument(ConfigUtil.java:107) at com.alibaba.cobar.config.loader.xml.XMLSchemaLoader.load(XMLSchemaLoader.java:114) ... 7 more
在schema.xml裏主要配置了數據源以及數據節點,對於schema的配置裏能夠爲table指定路由規則,至於路由規則的來源下面會有說明。若是全部數據源的用戶名與密碼相同能夠配置在同一datasource節點下。系統會將其組裝爲一個數組,當爲數據節點指定數據源時只需用數組下標以及數據源名稱表示便可例如dsTest[1].同時能夠爲數據節點指定心跳檢測運行狀況,當主數據源出現異常的時候即可切換到備數據源,遺憾的是當主數據源恢復正常的時候不能自動切換會主數據源,除非備數據源也發生異常。
<cobar:schema xmlns:cobar="http://cobar.alibaba.com/"> <!-- Define schema, as following name represents schema name or db name. Here, we defined one schema named 'dbtest'. For table tb2, we assigned route rule(rule1) for it. Means that data will be insert dnTest2 and dnTest3 while executing insert operation for tb2. --> <schema name="dbtest" dataNode="dnTest1"> <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" /> </schema> <!-- Defined data node. For dataSourceRef column, if we only assign one datasource, it will be treated as master. If we want assign one or more slaves, just add one or more lines.--> <dataNode name="dnTest1"> <property name="dataSource"> <dataSourceRef>dsTest[0]</dataSourceRef> </property> <property name="heartbeatSQL">select user()</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> <!-- Define datasource--> <dataSource name="dsTest" type="mysql"> <property name="location"> <location> 192.168.241.128:3306/dbtest1</location> <location> 192.168.241.128:3306/dbtest2</location> <location> 192.168.241.128:3306/dbtest3</location> </property> <property name="user">root</property> <property name="password"></property> <property name="sqlMode">STRICT_TRANS_TABLES</property> </dataSource> </cobar:schema>
rule.xml文件則是配置路由規則,即指定表的分區規則。
阿里的源碼裏只提供了根據long型數據分區,根據String類型數據分區,根據FileMap分區。而咱們一般不少狀況下須要用時間分區,怎麼辦的。還好有位大神級人物在2014年6月份開源了一個擴展,咱們能夠從github上download下來使用。至於用法能夠將其複製到Cobar目錄下打包,也能夠單獨打包將其直接添加到lib目錄。對於tableRule在配置的時候,因爲Cobar只支持1維和2維路由。因此對於同一tablerule最多隻能爲兩個字段配置路由規則。固然通常狀況下一個字段的路由已經夠用了。
<!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>
server.xml關於Cobar運行的一些參數設定。
若不作特定設置,Cobar將運行於8066端口以及9066端口,因此你懂得,這兩個端口也應該開放的。同時須要爲Cobar服務設置用戶名及密碼以便調用Cobar服務時使用。
<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> --> <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">192.168.241.128</property> <property name="weight">1</property> </node> </cluster> <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property> </host> </quarantine> --> </cobar:server>
到此配置文件已解說完成,更加詳細的說明能夠參考文檔Cobar - Alibaba Open Sesame.pdf
在以上工做都完成後就可啓動Cobar,即運行startup.sh腳本。
啓動成功執行 ps -ef | grep cobar將會看到下圖所示
並可經過mysql命令登陸Cobar,指定主機爲安裝Cobar的Server,username和password則是Cobar server.xml裏設置的用戶名和密碼,結果以下圖所示:
如有疑問可微信掃描下列二維碼並關注留言