1、下載下傳cobar http://code.alibabatech.com/wiki/display/cobar/release
2、進入cobar-server-1.2.4目錄,可以看到Cobar的主要目錄如下:
bin #包含Cobar的啟動、重新開機、停止等腳本檔案
conf #包含Cobar所有配置檔案
lib #包含Cobar及其依賴的jar檔案
logs #包含Cobar所有日志檔案
3、Cobar的所有配置檔案全部放在conf目錄中,進入conf目錄,可以看到:
server.xml #Cobar系統、使用者、叢集等相關配置
schema.xml #schema,dataNode,dataSource相關配置
rule.xml #分布式規則定義
log4j.xml #日志相關配置
4、mysql中資料準備
配置兩台機器的mysql,ip位址分别為:192.168.1.110 、 192.168.1.113 端口為3306 使用者名 root 密碼為空。我們需要在 192.168.1.110上建立database:dbtest1,dbtest2,dbtest3;table:tb1(在dbtest1上),tb2(dbtest2、dbtest3上)。在192.168.1.113上建立database:dbtest31,dbtest32;table:tb1(dbtest31上),tb2(dbtest32上)
資料庫建立腳本:
#########################################192.168.1.110 #建立dbtest1 drop database if exists dbtest1; create database dbtest1; use dbtest1; #在dbtest1上建立tb1 create table tb1( id int not null, gmt datetime); #建立dbtest2 drop database if exists dbtest2; create database dbtest2; use dbtest2; #在dbtest2上建立tb2 create table tb2( id int not null, val varchar(256)); #建立dbtest3 drop database if exists dbtest3; create database dbtest3; use dbtest3; #在dbtest3上建立tb2 create table tb2( id int not null, val varchar(256)); #########################################192.168.1.113 #建立dbtest31 drop database if exists dbtest1; create database dbtest1; use dbtest31; #在dbtest1上建立tb1 create table tb1( id int not null, gmt datetime); #建立dbtest32 drop database if exists dbtest2; create database dbtest2; use dbtest32; #在dbtest2上建立tb2 create table tb2( id int not null, val varchar(256)); |
5、配置schema.xml
參考:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=7671478
請確定機器上設定了JAVA環境變量JAVA_HOME
<!--定義schema db_single, 該schema未做分布式存儲,類似于5.1節中schema邏輯層次圖中的db2--> <!--對schema db_single所有表的通路均路由到dnTest1 上執行--> <!--<schema name="db_single" dataNode="dnTest1"/>--> <!--定義schema db_shard--> <!--所有除tb1,tb2之外表的通路都路由到dnTest1 去執行--> <schema name="db_shard" dataNode="dnTest1"> <!--對tb1的通路會根據規則tb1Rule路由到dnTest1,dnTest1的某一個或某幾個datanode執行--> <table name="tb1" dataNode="dnTest1,dnTest1" rule="rule1" /> <!--對tb2的通路會根據規則string_val_2路由到dnTest2,dnTest3,dnTest5的某一個或兩個datanode執行--> <table name="tb2" dataNode="dnTest2,dnTest3,dnTest5" rule="rule1" /> </schema> <!--rule1,将會在rule.xml的tableRule中定義,可以不想同--> <!--資料節點由主、備資料源,心跳,連接配接池等配置組成。--> <!--資料節點名稱--> <dataNode name="dnTest1"> <property name="dataSource"> <!--第一行dataSourceRef表示主資料源--> <dataSourceRef>dsTest[0]</dataSourceRef> <!--第二行dataSourceRef表示備資料源--> <!--<dataSourceRef>ds_single_slave</dataSourceRef>--> <!--如果需要一主多備的情況,可以将第二備資料源配置在第三行,以此類推--> <!--<dataSourceRef>ds_single_slave2</dataSourceRef>--> </property> <!--Cobar與後端資料源連接配接池大小設定--> <!--<property name="poolSize">256</property>--> <!--Cobar通過心跳來實作後端資料源HA,一旦主資料源心跳失敗,便切換到備資料源上工作--> <!--Cobar心跳是通過向後端資料源執行一條SQL語句,根據該語句的傳回結果判斷資料源的運作情況--> <!--<property name="heartbeat">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> <dataNode name="dnTest4"> <property name="dataSource"> <dataSourceRef>dsTest[3]</dataSourceRef> </property> </dataNode> <dataNode name="dnTest5"> <property name="dataSource"> <dataSourceRef>dsTest[4]</dataSourceRef> </property> </dataNode> <!-- 資料源定義,資料源是一個具體的後端資料連接配接的表示。--> <!--資料源的名稱與類型,Cobar暫時隻支援mysql這種類型--> <dataSource name="dsTest" type="mysql"> <!--連接配接的位址,端口和schema名稱--> <property name="location"> <location>192.168.1.110:3306/dbtest1</location> <location>192.168.1.110:3306/dbtest2</location> <location>192.168.1.110:3306/dbtest3</location> <location>192.168.1.113:3306/dbtest31</location> <location>192.168.1.113:3306/dbtest32</location> </property> <!--連接配接使用者名,密碼--> <property name="user">root</property> <property name="password"></property> <!--連接配接的SQL模式--> <property name="sqlMode">STRICT_TRANS_TABLES</property> </dataSource> |
此處要注意開啟遠端連接配接root使用者的權限
grant all privileges on *.* to root#'%'
6、配置rule.xml
tableRule
tableRule主要作用是用來判斷SQL語句路由到哪些datanode執行,Cobar是通過在SQL中提取一個或多個字段的值,并根據這些字段的值來決定路由到哪個庫執行。是以,tableRule定義兩個要素:
1)按表中的哪個字段路由?------下文中我們稱此字段為路由字段
2)有了字段值,如何路由?------即路由函數
<tableRule name="rule1"> <rule> <!--id為路由字段--> <columns>id</columns> <!--func1 是路由函數,參數為id--> <algorithm><![CDATA[func1(${id})]]></algorithm> </rule> </tableRule> |
function
參考:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=7671871
<!--定義function名稱,如果路由字段是字元串類型,對應class路徑為com.alibaba.cobar.route.function.PartitionByString--> <function name="func" class="com.alibaba.cobar.route.function.PartitionByString"> <!--該路由函數将1024分成多少個區段--> <property name="partitionCount">4</property> <!--每一區段的長度, 滿足4 * 256 = 1024--> <property name="partitionLength">256</property> <!--字元串需要先取hash值再做映射,這裡定義取字元串的哪一部分子串做hash--> <!--:8表示子串的下标,意思是取路由字段的前8個字元做hash,該文法與python取字元串下标方式相同--> <property name="hashSlice">:8</property> </function> <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong"> <!--該路由函數将1024分成多少個區段--> <property name="partitionCount">2</property> <!--每一區段的長度, 滿足4 * 256 = 1024--> <property name="partitionLength">512</property> <!--字元串需要先取hash值再做映射,這裡定義取字元串的哪一部分子串做hash--> </function> |
7、配置server.xml
System
<!--system中包含系統參數定義,服務端口、管理端口,處理器個數、線程池等定義--> <!--這些配置都有預設值,一般情況下使用者可以完全不用配置--> <system> <!--端口定義,如果沒有端口沖突,可不用配置--> <!--Cobar服務端口, 通過此端口執行SQL語句,預設值8066--> <property name="serverPort">8066</property> <!--Cobar管理端口,通過此端口執行Cobar管理指令, 預設值9066--> <property name="managerPort">9066</property> <!--Cobar内部處理器個數,線程池等定義,預設值為Cobar所在機器處理器個數--> <!--這些配置主要影響Cobar内部處理性能,可在做性能優化時調整--> <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> <!--Cobar與Cobar間心跳的使用者名和密碼, 預設值即是_HEARTBEAT_USER_和_HEARTBEAT_PASS_--> <!--如果兩台Cobar之間需要心跳,這兩項配置必須相同,一般不建議自行配置,使用預設值即可--> <property name="clusterHeartbeatUser">_HEARTBEAT_USER_</property> <property name="clusterHeartbeatPass">_HEARTBEAT_PASS_</property> </system> |
User
<!--Cobar的使用者定義,包括使用者名,密碼以及通路權限設定,可以配置任意多個使用者--> <!--普通使用者配置--> <user name="test"> <!--使用者名--> <property name="password">test</property> <!--密碼--> <!--Cobar對使用者進行了簡單的權限控制,可定義使用者對某些schema是否有通路權限--> <!--這裡不區分讀寫權限,一旦擁有通路權限,便是讀寫權限--> <!--以逗号分隔多個schema, test使用者隻能通路db_single和db_shard兩個Cobar定義的schema--> <property name="schemas">db_single,db_shard</property> </user> <!--超級使用者配置,超級使用者是指對所有schema都有通路權限的使用者--> <!— <user name="root1"> <property name="password">root</property> -->
<!--不配置任何通路權限,表示對所有schema都有通路權限--> <!-- </user> <user name="root2"> <property name="password">root</property> -->
<!--配置為空同樣表示對所有schema都有通路權限--> <!-<property name="schemas"></property> </user>--> |
Cluster
在實際應用中,經常需要部署一個Cobar叢集,我們稱叢集中的一台Cobar為一個Cobar節點。
<!--組建一個Cobar叢集,隻需在cluster配置中把所有Cobar節點(注意:包括目前Cobar自身)都配置上便可--> <cluster> <!--node名稱,一個node表示一個Cobar節點,一旦配置了node,目前Cobar便會向此節點定期發起心跳,探測節點的運作情況--> <node name="cobar1"> <!--Cobar節點IP, 表示目前Cobar将會向192.168.1.110上部署的Cobar發送心跳--> <property name="host">192.168.1.110</property> <!--節點的權重,用于用戶端的負載均衡,使用者可以通過指令查詢某個節點的運作情況以及權重--> <property name="weight">1</property> </node> <!--目前Cobar将會向192.168.1.113上部署的Cobar發送心跳--> <node name="cobar2"> <property name="host">192.168.1.113</property> <property name="weight">2</property> </node> <!--使用者還可以将Cobar節點分組,以便實作schema級别的細粒度負載均衡--> <group name="group12"> <property name="nodeList">cobar1,cobar2</property> </group> </cluster> |
使用者隻需登入Cobar的服務端口(8066),運作Cobar自帶的查詢指令show cobar_cluster,便可查詢叢集中所有節點的運作情況以及權重,并根據查詢結果做負載均衡。
mysql -h192.168.1.110 -utest -ptest -P8066
mysql>show cobar_cluster; #查詢cluster配置中正常的Cobar節點
+---------------+--------+
| HOST | WEIGHT |
+---------------+--------+
| 192.168.1.110 | 1 |
| 192.168.1.113 | 2 |
+---------------+--------+
注意:
1)如果需要配置Cobar叢集,目前Cobar自身也需要作為一個節點配置在cluster中,Cobar不會預設向自己發心跳;
2)show cobar_cluster隻顯示cluster配置中得正常Cobar節點,如果節點異常(如逾時或錯誤),結果中便不會包含此節點。
8、通路方式
由于Cobar遵循MySQL協定,通路Cobar的方式與通路MySQL資料庫完全相同。
支援MySQL指令行方式通路
#指令行
mysql -h192.168.1.110 -utest -ptest -P8066 -Ddb_shard
轉載于:https://www.cnblogs.com/wuzp/archive/2012/08/29/2661436.html