<div id="article\_content" class="article\_content csdn-tracking-statistics tracking-click" data-mod="popu\_519" data-dsm="post" style="overflow: hidden;"> <div class="markdown\_views"> <h2 id="mycat介绍"><a name="t0"></a>mycat介绍</h2> <ul> <li>介绍在官方网站上有比较详细的介绍,在这里复制粘贴没什么意思,大家到官网上看</li> <li><a href="http://www.mycat.org.cn/" target="\_blank">官网链接</a></li> </ul> <h2 id="前置条件"><a name="t1"></a>前置条件</h2> <p>本教程是在window环境下运行的,实际生产推荐在Linux上运行。 <br> 必备条件(自行安装,如果不会装请先打好基础在来学习):</p> <ul> <li>JDK:建议是1.7及其以上。</li> <li>MySQL:必须是5.5及其以上。</li> </ul> <h2 id="拓扑结构"><a name="t2"></a>拓扑结构</h2> <p><img src="http://img.blog.csdn.net/20170224224920432?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></p> <ul> <li>两张表users和item,三个数据库db01,db02,db03(三个库在一个数据库实例上)</li> <li>users只在db01中存储。</li> <li>item表被分割到db02和db03中存储。</li> </ul> <pre class="prettyprint"><code class="hljs sql has-numbering"><span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">database</span> db01;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> users ( </br> id <span class="hljs-keyword">INT</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> AUTO\_INCREMENT, </br> name <span class="hljs-keyword">varchar</span>(<span class="hljs-number">50</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">default</span> <span class="hljs-string">''</span>, </br> indate DATETIME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">default</span> <span class="hljs-string">'0000-00-00 00:00:00'</span>, </br> <span class="hljs-keyword">PRIMARY</span> <span class="hljs-keyword">KEY</span> (id) </br> )AUTO\_INCREMENT= <span class="hljs-number">1</span> ENGINE=InnoDB <span class="hljs-keyword">DEFAULT</span> CHARSET=utf8;</span> </code></pre> <p>在db02和db03中分别创建item表,SQL脚本如下</p> <pre class="prettyprint"><code class="hljs sql has-numbering"><span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">database</span> db02;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> item ( </br> id <span class="hljs-keyword">INT</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> AUTO\_INCREMENT, </br> <span class="hljs-keyword">value</span> <span class="hljs-keyword">INT</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">default</span> <span class="hljs-number">0</span>, </br> indate DATETIME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">default</span> <span class="hljs-string">'0000-00-00 00:00:00'</span>, </br> <span class="hljs-keyword">PRIMARY</span> <span class="hljs-keyword">KEY</span> (id) </br> )AUTO\_INCREMENT= <span class="hljs-number">1</span> ENGINE=InnoDB <span class="hljs-keyword">DEFAULT</span> CHARSET=utf8;</span> <span class="hljs-operator"><span class="hljs-keyword">create</span> <span class="hljs-keyword">database</span> db03;</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> item ( </br> id <span class="hljs-keyword">INT</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> AUTO\_INCREMENT, </br> <span class="hljs-keyword">value</span> <span class="hljs-keyword">INT</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">default</span> <span class="hljs-number">0</span>, </br> indate DATETIME <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">default</span> <span class="hljs-string">'0000-00-00 00:00:00'</span>, </br> <span class="hljs-keyword">PRIMARY</span> <span class="hljs-keyword">KEY</span> (id) </br> )AUTO\_INCREMENT= <span class="hljs-number">1</span> ENGINE=InnoDB <span class="hljs-keyword">DEFAULT</span> CHARSET=utf8;</span> </code></pre> <h2 id="开始使用"><a name="t3"></a>开始使用</h2> <ul> <li>先打mycat官方网站上下载安装包,网址为<a href="http://dl.mycat.io/1.6-RELEASE/" target="\_blank">mycat</a> 下载图如下所示: <br> <img src="http://img.blog.csdn.net/20170224220138159?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="下载图示" title=""></li> <li>然后在conf目录下编辑service.xml,rule.xml,schema.xml三个文件。 </li> <li>service.xml主要配置mycat服务的参数,比如端口号,myact用户名和密码使用的逻辑数据库等</li> <li>role.xml主要配置路由策略,主要有分片的片键,拆分的策略(取模还是按区间划分等)</li> <li>schema.xml文件主要配置数据库的信息,例如逻辑数据库名称,物理上真实的数据源以及表和数据源之间的对应关系和路由策略等。</li> <li><p>配置如下所示:</p></li> <li><p>server.xml</p></li> </ul> <pre class="prettyprint"><code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8"?></span> </br> <span class="hljs-doctype"><!DOCTYPE mycat:server SYSTEM "server.dtd"></span> </br> <span class="hljs-tag"><<span class="hljs-title">mycat:server</span> <span class="hljs-attribute">xmlns:mycat</span>=<span class="hljs-value">"http://io.mycat/"</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">system</span>></span> </br> <span class="hljs-comment"><!-- </br> <property name="processors">32</property> </br> <property name="processorExecutor">32</property> </br> <property name="bindIp">0.0.0.0</property> </br> <property name="frontWriteQueueSize">4096</property> </br> <property name="idleTimeout">300000</property> </br> <property name="mutiNodePatchSize">100</property> </br> --></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"defaultSqlParser"</span>></span>druidparser<span class="hljs-tag"></<span class="hljs-title">property</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"mutiNodeLimitType"</span>></span>1<span class="hljs-tag"></<span class="hljs-title">property</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"serverPort"</span>></span>8066<span class="hljs-tag"></<span class="hljs-title">property</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"managerPort"</span>></span>9066<span class="hljs-tag"></<span class="hljs-title">property</span>></span> <span class="hljs-tag"></<span class="hljs-title">system</span>></span> </br> <span class="hljs-comment"><!-- 任意设置登陆 mycat 的用户名,密码,数据库 --></span> </br> <span class="hljs-tag"><<span class="hljs-title">user</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"test"</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"password"</span>></span>test<span class="hljs-tag"></<span class="hljs-title">property</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"schemas"</span>></span>TESTDB<span class="hljs-tag"></<span class="hljs-title">property</span>></span> <span class="hljs-tag"></<span class="hljs-title">user</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">user</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"user"</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"password"</span>></span>user<span class="hljs-tag"></<span class="hljs-title">property</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"schemas"</span>></span>TESTDB<span class="hljs-tag"></<span class="hljs-title">property</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"readOnly"</span>></span>true<span class="hljs-tag"></<span class="hljs-title">property</span>></span> <span class="hljs-tag"></<span class="hljs-title">user</span>></span> </br> <span class="hljs-comment"><!-- </br> <quarantine> </br> <whitehost> </br> <host host="127.0.0.1" user="mycat"/> </br> <host host="127.0.0.2" user="mycat"/> </br> </whitehost> <blacklist check="false"></blacklist> </quarantine> </br> --></span> </br> <span class="hljs-tag"></<span class="hljs-title">mycat:server</span>></span> </br> </code></pre> <ul> <li>role.xml <br> 该路由表表明采用mod2的方式进行路由。通过下面可知是对item表的id键进行取模分表的,取模分到db02和db03,而users表直接路由到db01中。</li> </ul> <pre class="prettyprint"><code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8"?></span></br> <span class="hljs-comment"><!-- - - Licensed under the Apache License, Version 2.0 (the "License"); </br> - you may not use this file except in compliance with the License. - You </br> may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 </br> - - Unless required by applicable law or agreed to in writing, software - </br> distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT </br> WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the </br> License for the specific language governing permissions and - limitations </br> under the License. --></span></br> <span class="hljs-doctype"><!DOCTYPE mycat:rule SYSTEM "rule.dtd"></span></br> <span class="hljs-tag"><<span class="hljs-title">mycat:rule</span> <span class="hljs-attribute">xmlns:mycat</span>=<span class="hljs-value">"http://io.mycat/"</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">tableRule</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"role1"</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">rule</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">columns</span>></span>id<span class="hljs-tag"></<span class="hljs-title">columns</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">algorithm</span>></span>mod-long<span class="hljs-tag"></<span class="hljs-title">algorithm</span>></span></br> <span class="hljs-tag"></<span class="hljs-title">rule</span>></span></br> <span class="hljs-tag"></<span class="hljs-title">tableRule</span>></span></br> <span class="hljs-tag"><<span class="hljs-title">function</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"mod-long"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"io.mycat.route.function.PartitionByMod"</span>></span></br> <span class="hljs-comment"><!-- how many data nodes --></span></br> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"count"</span>></span>2<span class="hljs-tag"></<span class="hljs-title">property</span>></span> <span class="hljs-tag"></<span class="hljs-title">function</span>></span></br> <span class="hljs-tag"></<span class="hljs-title">mycat:rule</span>></span></br> </code></pre> <ul> <li>schema.xml 数据库的url,usename,password按实际情况填写。</li></br> </ul> <pre class="prettyprint"><code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0"?></span> </br> <span class="hljs-doctype"><!DOCTYPE mycat:schema SYSTEM "schema.dtd"></span> </br> <span class="hljs-tag"><<span class="hljs-title">mycat:schema</span> <span class="hljs-attribute">xmlns:mycat</span>=<span class="hljs-value">"http://io.mycat/"</span>></span> </br> <span class="hljs-comment"><!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致 --></span> </br> <span class="hljs-tag"><<span class="hljs-title">schema</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"TESTDB"</span> <span class="hljs-attribute">checkSQLschema</span>=<span class="hljs-value">"false"</span> <span class="hljs-attribute">sqlMaxLimit</span>=<span class="hljs-value">"100"</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">table</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"users"</span> <span class="hljs-attribute">primaryKey</span>=<span class="hljs-value">"id"</span> <span class="hljs-attribute">dataNode</span>=<span class="hljs-value">"node\_db01"</span> /></span> </br> <span class="hljs-tag"><<span class="hljs-title">table</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"item"</span> <span class="hljs-attribute">primaryKey</span>=<span class="hljs-value">"id"</span> <span class="hljs-attribute">dataNode</span>=<span class="hljs-value">"node\_db02,node\_db03"</span> <span class="hljs-attribute">rule</span>=<span class="hljs-value">"role1"</span> /></span> </br> <span class="hljs-tag"></<span class="hljs-title">schema</span>></span> </br> <span class="hljs-comment"><!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost --></span> </br> <span class="hljs-tag"><<span class="hljs-title">dataNode</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"node\_db01"</span> <span class="hljs-attribute">dataHost</span>=<span class="hljs-value">"dataHost01"</span> <span class="hljs-attribute">database</span>=<span class="hljs-value">"db01"</span> /></span> </br> <span class="hljs-tag"><<span class="hljs-title">dataNode</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"node\_db02"</span> <span class="hljs-attribute">dataHost</span>=<span class="hljs-value">"dataHost01"</span> <span class="hljs-attribute">database</span>=<span class="hljs-value">"db02"</span> /></span> </br> <span class="hljs-tag"><<span class="hljs-title">dataNode</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"node\_db03"</span> <span class="hljs-attribute">dataHost</span>=<span class="hljs-value">"dataHost01"</span> <span class="hljs-attribute">database</span>=<span class="hljs-value">"db03"</span> /></span> </br> <span class="hljs-comment"><!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 --></span> </br> <span class="hljs-tag"><<span class="hljs-title">dataHost</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"dataHost01"</span> <span class="hljs-attribute">maxCon</span>=<span class="hljs-value">"1000"</span> <span class="hljs-attribute">minCon</span>=<span class="hljs-value">"10"</span> <span class="hljs-attribute">balance</span>=<span class="hljs-value">"0"</span> <span class="hljs-attribute">writeType</span>=<span class="hljs-value">"0"</span> <span class="hljs-attribute">dbType</span>=<span class="hljs-value">"mysql"</span> <span class="hljs-attribute">dbDriver</span>=<span class="hljs-value">"native"</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">heartbeat</span>></span>select user()<span class="hljs-tag"></<span class="hljs-title">heartbeat</span>></span> </br> <span class="hljs-tag"><<span class="hljs-title">writeHost</span> <span class="hljs-attribute">host</span>=<span class="hljs-value">"server1"</span> <span class="hljs-attribute">url</span>=<span class="hljs-value">"127.0.0.1:3306"</span> <span class="hljs-attribute">user</span>=<span class="hljs-value">"root"</span> <span class="hljs-attribute">password</span>=<span class="hljs-value">"123456"</span>/></span> </br> <span class="hljs-tag"></<span class="hljs-title">dataHost</span>></span> </br> <span class="hljs-tag"></<span class="hljs-title">mycat:schema</span>></span></code></pre></br> <h2 id="启动测试"><a name="t4"></a>启动测试</h2> <ul> <li>在命令行切换到bin目录下,然后执行如下命令: <br> <img src="http://img.blog.csdn.net/20170224221918167?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""> <br> 正确启动后会显示如下命令: <br> <img src="http://img.blog.csdn.net/20170224222035214?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""> <br> 然后表示我们启动服务成功。</li></br> </ul> <h2 id="验证结果"><a name="t5"></a>验证结果</h2> <ul> <li>在命令行访问mycat逻辑数据库,采用如下的命令:</li> </ul> <blockquote> <p>mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB </p> </blockquote> <ul> <li><p>现在通过数据库查询数据库和表,发现只有逻辑数据库TESTDB而不是db01, db02, db03;而且表也是统一显示的,而不是分布在不同的实际数据库中。参考图片如下: <br> <img src="http://img.blog.csdn.net/20170224222718702?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></p> <ul><li>现在在访问Mycat在数据库中插入数据,看数据能否按照前面配置的路由规则进行分表。</li> <li>现在执行如下的SQL语句进行数据的插入。</li></ul></li> </ul> <pre class="prettyprint"><code class="hljs sql has-numbering"><span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> users(name,indate) <span class="hljs-keyword">values</span>(<span class="hljs-string">'kk'</span>,now());</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> users(name,indate) <span class="hljs-keyword">values</span>(<span class="hljs-string">'ss'</span>,now());</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> item(id,<span class="hljs-keyword">value</span>,indate) <span class="hljs-keyword">values</span>(<span class="hljs-number">1</span>,<span class="hljs-number">100</span>,now());</span> <span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> item(id,<span class="hljs-keyword">value</span>,indate) <span class="hljs-keyword">values</span>(<span class="hljs-number">2</span>,<span class="hljs-number">100</span>,now());</span></code></pre> <ul> <li>然后在mycat上查看是否插入成功,下图显示插入成功。 <br> <img src="http://img.blog.csdn.net/20170224224045115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""></li> <li>然后登录实际的数据库,看分表是否成功。下图显示分表成功。 <br> <img src="http://img.blog.csdn.net/20170224224232575?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ2NzQ0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""> <br> 图上显示,插入的users表中的数据全部在db01中,而item表中的数据通过Id取模后均匀的分布在db02和db03中。这样就根据实际的路由策略进行了分表。</li> <li><strong>测试完成!!~数据进行了分库分表!</strong></li> </ul> <h2 id="参考文章"><a name="t6"></a>参考文章</h2> <p><a href="http://blog.csdn.net/kk185800961/article/details/51147029" target="\_blank">1. MySQL 高可用:mysql+mycat实现数据库分片(分库分表)</a></p> </div> <link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown\_views-d4dade9c33.css"> </div>