下載地址MYCAT官方網站
jdk安裝配置
- 首先去oracle官網下載並安裝jdk8,添加環境變量,JAVA_HOME設置為D:\Worksoftware\Java\jdk1.8
- CLASSPATH設置為.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
- path系統變量追加%JAVA_HOME%\bin;
Mycat安裝配置
-
首先添加Windows環境變量,MYCAT_HOME設置為安裝目錄E:\WorkSoftWare\MycatServer1.5
-
為了降低資源占用,mycat的jvm設置在startup_nowrap.bat,打開后可以清楚看到如下配置:
“%JAVA_CMD%” -server -Xms1G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=1G -DMYCAT_HOME=%MYCAT_HOME% -cp “..\conf;..\lib*” io.mycat.MycatStartup
這里將-Xms1G改成-Xms512M,-Xmx2G改成-Xmx1024M,保存后重新啟動即可. - wrapper.conf文件里的改成wrapper.java.command=E:\WorkSoftWare\jdk1.8\bin\java.exe
Mycat啟動的配置
schema.xml配置文件,如果分庫在不同的服務器,可以配置兩個datahost;如果在一個datahost中配置多個writeHost,則為主從配置。type=”global”時,為全局表
1 <?xml version="1.0"?> 2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 3 <mycat:schema xmlns:mycat="http://org.opencloudb/" > 4 5 <!--在這一行參數里面,schema name定義了可以在MyCAT前端顯示的邏輯數據庫的名字,checkSQLschema這個參數為False的時候,表明MyCAT會自動忽略掉表名前的數據庫名,比如說mydatabase1.test1,會被當做test1;sqlMaxLimit指定了SQL語句返回的行數限制--> 6 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> 7 <!-- 主鍵范圍規則 --> 8 <!-- 這一行代表在MyCAT前端會顯示哪些表名,類似幾行都代表一樣的意思,這里強調的是表,而MyCAT並不會在配置文件里面定義表結構,如果在前端使用show create table ,MyCAT會顯示正常的表結構信息,觀察Debug日志,可以看到,MyCAT把命令分發給了dn1代表的數據庫,然后把dn1的查詢結果返回給了前端 可以判斷,類似的數據庫級別的一些查詢指令,有可能是單獨分發給某個節點,然后再把某個節點的信息返回給前端。 9 dataNode的意義很簡單,這個邏輯表的數據存儲在后端的哪幾個數據庫里面rule代表的是這個邏輯表students的具體切分策略,目前MyCAT只支持按照某一個特殊列,遵循一些特殊的規則來切分,如取模,枚舉等,具體的留給之后細說 10 --> 11 <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> 12 13 <table name="company" primaryKey="ID" dataNode="dn3,dn2,dn1" rule="mod-long"/> 14 <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> 15 <!--求模分片隨機規則 --> 16 <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" 17 rule="mod-long" /> 18 19 <table name="employee" primaryKey="ID" dataNode="dn1,dn2" 20 rule="sharding-by-intfile" /> 21 <table name="customer" primaryKey="ID" dataNode="dn1,dn2" 22 rule="sharding-by-intfile"> 23 <!-- 24 childtable我在測試中並沒有實際用起來不過在MyCAT的設計文檔里面有提到,childtable是一種依賴於父表的結構, 25 這意味着,childtable的joinkey會按照父表的parentKey的策略一起切分,當父表與子表進行連接, 26 且連接條件是childtable.joinKey=parenttable.parentKey時,不會進行跨庫的連接. 27 --> 28 <childTable name="orders" primaryKey="ID" joinKey="customer_id" 29 parentKey="id"> 30 <childTable name="order_items" joinKey="order_id" 31 parentKey="id" /> 32 </childTable> 33 <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" 34 parentKey="id" /> 35 </table> 36 37 <!-- 全局表是自動克隆到所有定義的數據節點,這樣可以與拆分節點的任何表連接查詢,是在同一個數據節點--> 38 <table name="news_table" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> 39 </schema> 40 41 <dataNode name="dn1" dataHost="localhost1" database="mycatDB1" /> 42 <dataNode name="dn2" dataHost="localhost1" database="mycatDB2" /> 43 <dataNode name="dn3" dataHost="localhost1" database="mycatDB3" /> 44 45 <!-- 46 dataHost配置的是實際的后端數據庫集群,大部分參數簡單易懂,這里就不一個個介紹了,只介紹比較重要的兩個參數,writeType和balance. 47 --> 48 <!-- writeType和balance是用來控制后端集群的讀寫分離的關鍵參數,這里我用了雙主雙從的集群配置 49 這里的測試過程比較麻煩,所以直接貼結論: 50 1.balance=0時,讀操作都在localhost上(localhost失敗時,后端直接失敗) 51 2.balance=1時,讀操作會隨機分散在localhost1和兩個readhost上面(localhost失敗時,寫操作會在localhost1,如果localhost1再失敗,則無法進行寫操作) 52 3.balance=2時,寫操作會在localhost上,讀操作會隨機分散在localhost1,localhost1和兩個readhost上面(同上) 53 4.writeType=0時,寫操作會在localhost上,如果localhost失敗,會自動切換到localhost1,localhost恢復以后並不會切換回localhost進行寫操作 54 5.writeType=1時,寫操作會隨機分布在localhost和localhost1上,單點失敗並不會影響集群的寫操作,但是后端的從庫會無法從掛掉的主庫獲取更新,會在讀數據的時候出現數據不一致 55 舉例:localhost失敗了,寫操作會在localhost1上面進行,localhost1的主從正常運行,但是localhost的從庫無法從localhost獲取更新,localhost的從庫於其他庫出現數據不一致 56 --> 57 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" 58 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 59 <heartbeat>select user()</heartbeat> 60 <!-- can have multi write hosts --> 61 <writeHost host="hostM1" url="localhost:3306" user="root" 62 password="123456"> 63 <!-- can have multi read hosts --> 64 <!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />--> 65 </writeHost> 66 </dataHost> 67 68 </mycat:schema>
server.xml配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 3 - you may not use this file except in compliance with the License. - You 4 may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 5 - - Unless required by applicable law or agreed to in writing, software - 6 distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 7 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 8 License for the specific language governing permissions and - limitations 9 under the License. --> 10 <!DOCTYPE mycat:server SYSTEM "server.dtd"> 11 <mycat:server xmlns:mycat="http://org.opencloudb/"> 12 <system> 13 <property name="defaultSqlParser">druidparser</property> 14 <!-- <property name="useCompression">1</property>--> <!--1為開啟mysql壓縮協議--> 15 <!-- <property name="processorBufferChunk">40960</property> --> 16 <!-- 17 <property name="processors">1</property> 18 <property name="processorExecutor">32</property> 19 --> 20 <!--默認是65535 64K 用於sql解析時最大文本長度 --> 21 <!--<property name="maxStringLiteralLength">65535</property>--> 22 <!--<property name="sequnceHandlerType">0</property>--> 23 <!--<property name="backSocketNoDelay">1</property>--> 24 <!--<property name="frontSocketNoDelay">1</property>--> 25 <!--<property name="processorExecutor">16</property>--> 26 <!-- 27 <property name="mutiNodeLimitType">1</property> 0:開啟小數量級(默認) ;1:開啟億級數據排序 28 <property name="mutiNodePatchSize">100</property> 億級數量排序批量 29 <property name="processors">32</property> <property name="processorExecutor">32</property> 30 <property name="serverPort">8066</property> <property name="managerPort">9066</property> 31 <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 32 <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --> 33 </system> 34 <user name="test"><!--用戶名--> 35 <property name="password">test</property><!--密碼--> 36 <!--實例名,和schema.xml定義的schema對應,這里的實例名是虛擬名,也就是對mycat服務的一種別名,是應用程序以及客戶端連接的入口。--> 37 <property name="schemas">TESTDB</property> 38 </user> 39 40 <user name="user"> 41 <property name="password">user</property> 42 <property name="schemas">TESTDB</property> 43 <property name="readOnly">true</property> 44 </user> 45 <!-- 46 <quarantine> 47 <whitehost> 48 <host host="127.0.0.1" user="mycat"/> 49 <host host="127.0.0.2" user="mycat"/> 50 </whitehost> 51 <blacklist check="false"></blacklist> 52 </quarantine> 53 --> 54 55 </mycat:server>
rule.xml配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 3 - you may not use this file except in compliance with the License. - You 4 may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 5 - - Unless required by applicable law or agreed to in writing, software - 6 distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 7 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 8 License for the specific language governing permissions and - limitations 9 under the License. --> 10 <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> 11 <mycat:rule xmlns:mycat="http://org.opencloudb/"> 12 <tableRule name="rule1"> 13 <rule> 14 <columns>id</columns> 15 <algorithm>func1</algorithm> 16 </rule> 17 </tableRule> 18 19 <tableRule name="rule2"> 20 <rule> 21 <columns>user_id</columns> 22 <algorithm>func1</algorithm> 23 </rule> 24 </tableRule> 25 26 <tableRule name="sharding-by-intfile"> 27 <rule> 28 <columns>sharding_id</columns> 29 <algorithm>hash-int</algorithm> 30 </rule> 31 </tableRule> 32 <tableRule name="auto-sharding-long"> 33 <rule> 34 <columns>id</columns> 35 <algorithm>rang-long</algorithm> 36 </rule> 37 </tableRule> 38 <tableRule name="mod-long"> 39 <rule> 40 <columns>id</columns> 41 <algorithm>mod-long</algorithm> 42 </rule> 43 </tableRule> 44 <tableRule name="sharding-by-murmur"> 45 <rule> 46 <columns>id</columns> 47 <algorithm>murmur</algorithm> 48 </rule> 49 </tableRule> 50 <tableRule name="sharding-by-month"> 51 <rule> 52 <columns>create_date</columns> 53 <algorithm>partbymonth</algorithm> 54 </rule> 55 </tableRule> 56 <tableRule name="latest-month-calldate"> 57 <rule> 58 <columns>calldate</columns> 59 <algorithm>latestMonth</algorithm> 60 </rule> 61 </tableRule> 62 63 <tableRule name="auto-sharding-rang-mod"> 64 <rule> 65 <columns>id</columns> 66 <algorithm>rang-mod</algorithm> 67 </rule> 68 </tableRule> 69 70 <tableRule name="jch"> 71 <rule> 72 <columns>id</columns> 73 <algorithm>jump-consistent-hash</algorithm> 74 </rule> 75 </tableRule> 76 77 <function name="murmur" 78 class="org.opencloudb.route.function.PartitionByMurmurHash"> 79 <property name="seed">0</property><!-- 默認是0 --> 80 <property name="count">2</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 --> 81 <property name="virtualBucketTimes">160</property><!-- 一個實際的數據庫節點被映射為這么多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍 --> 82 <!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 --> 83 <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 84 用於測試時觀察各物理節點與虛擬節點的分布情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 --> 85 </function> 86 <function name="hash-int" 87 class="org.opencloudb.route.function.PartitionByFileMap"> 88 <property name="mapFile">partition-hash-int.txt</property> 89 </function> 90 <function name="rang-long" 91 class="org.opencloudb.route.function.AutoPartitionByLong"> 92 <property name="mapFile">autopartition-long.txt</property> 93 </function> 94 <function name="mod-long" class="org.opencloudb.route.function.PartitionByMod"> 95 <!-- how many data nodes --> 96 <property name="count">3</property> 97 </function> 98 99 <function name="func1" class="org.opencloudb.route.function.PartitionByLong"> 100 <property name="partitionCount">8</property> 101 <property name="partitionLength">128</property> 102 </function> 103 <function name="latestMonth" 104 class="org.opencloudb.route.function.LatestMonthPartion"> 105 <property name="splitOneDay">24</property> 106 </function> 107 <function name="partbymonth" 108 class="org.opencloudb.route.function.PartitionByMonth"> 109 <property name="dateFormat">yyyy-MM-dd</property> 110 <property name="sBeginDate">2015-01-01</property> 111 </function> 112 113 <function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod"> 114 <property name="mapFile">partition-range-mod.txt</property> 115 </function> 116 117 <function name="jump-consistent-hash" class="org.opencloudb.route.function.PartitionByJumpConsistentHash"> 118 <property name="totalBuckets">3</property> 119 </function> 120 </mycat:rule>
Mycat連接mysql示例
cmd命令運行:
結果:
Mycat連接mysql結果
上圖上面的mycatdb1,mycatdb2,mycatdb3數據庫是真實物理數據庫,TESTDB是中間件邏輯數據庫,此時已經所有工作都准備好。
閑的蛋疼,隨便研究一些好東西,.net環境太封閉,每個.net程序員都要擴展視野,技術交流,本人QQ827937686