1. 程式人生 > >mycat水平分表

mycat水平分表

和垂直分庫不同,水平分表,是將那些io頻繁,且資料量大的表進行水平切分。

基本的配置和垂直分庫一樣,我們需要改的就是我們的

schema.xml和rule.xml檔案配置(server.xml不用做任何修改)

除此之外,我們還需要在兩個分片資料庫伺服器上建立分片用的資料庫10.0.4.181上建立(orderdb01,orderdb02),10.0.4.183上建立(orderdb03,orderdb04)

 

現在我們對配置檔案進行配置。

其中schema.xml這樣配置。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100">
<table name="mytest" primaryKey="id" dataNode="dn1" />
<table name="testfp" primaryKey="id" dataNode="dn2" />
<table name="order_list" primaryKey="id" dataNode="orderdb01,orderdb02,orderdb03,orderdb04" rule="order_list" />


</schema>

<dataNode name="dn1" dataHost="mysql4181" database="imooc_db" />
<dataNode name="dn2" dataHost="mysql4183" database="imooc_db" />

<dataNode name="orderdb01" dataHost="mysql4181" database="orderdb01" />
<dataNode name="orderdb02" dataHost="mysql4181" database="orderdb02" />


<dataNode name="orderdb03" dataHost="mysql4183" database="orderdb03" />
<dataNode name="orderdb04" dataHost="mysql4183" database="orderdb04" />


<dataHost name="mysql4181" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="10.0.4.181" url="10.0.4.181:3306" user="im_mycat" password="123456"></writeHost>
</dataHost>
<dataHost name="mysql4183" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="10.0.4.183" url="10.0.4.183:3306" user="im_mycat" password="123456"></writeHost>
</dataHost>


</mycat:schema>

rule.xml這樣配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

<tableRule name="order_list">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">4</property>
</function>

</mycat:rule>

配置好後,進行mycat的重啟。

mycat restart

登入mycat

mysql -uapp_imooc -p123456 -h10.0.4.180 -P8066

插入資料。

mysql> insert into order_list(id,order_name,order_type) values(1,'order01',1);

Query OK, 1 row affected (0.00 sec)

mysql> insert into order_list(id,order_name,order_type) values(2,'order01',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into order_list(id,order_name,order_type) values(3,'order01',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into order_list(id,order_name,order_type) values(4,'order01',1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into order_list(id,order_name,order_type) values(5,'order01',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into order_list(id,order_name,order_type) values(6,'order01',1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into order_list(id,order_name,order_type) values(7,'order01',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into order_list(id,order_name,order_type) values(8,'order01',1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into order_list(id,order_name,order_type) values(9,'order01',1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into order_list(id,order_name,order_type) values(10,'order01',1);
Query OK, 1 row affected (0.00 sec)

我們可以看到,我們在mycat上插入的資料,最終通過對id的取模演算法,分別插入到了orderdb01,orderdb02,orderdb03,orderdb04

通過以上結果,我們可以看到,資料被平均的分配到了4各資料庫中。

但是,做到這裡還不算完,並不能用於生產環境,因為還有很多問題,比如全域性自增主鍵的問題和聯合查詢的問題。上面我的例項之所以分配的很平均是因為,我在插入的時候規定了主鍵值。所以後端的四個資料庫中的全部資料中沒有主鍵重複的,

如果我不規定主鍵,則order_list中可能出現四個id為1的記錄,或四個id為2的記錄。