接上一篇帖子《MyCat-07之centos7上使用mycat部署水平分表---分片枚舉》
一、目標
使用mycat部署分片枚舉。
什麼叫數字範圍分片?
按照表中某個指定的字段值(數字int類型)的範圍去分片,比如值在1到3000的放到節點1服務器,值在3001到5000的放到節點2服務器上。沒有在規則範圍內的放在指定的默認的節點服務器上。
二、實施mycat數字範圍分片
1.修改/usr/local/mycat/conf/shcema.xml。
在<schema>內追加一行<table name="salary" dataNode="dn1,dn2" rule="auto_sharding_long"></table>,意思是,有一個表叫salary,被分片到了dn1和dn2兩臺節點服務器上,分片規則叫auto_sharding_long(需在rule.xml中定義)。完整代碼如下
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="teacher" dataNode="dn2"></table>
<table name="student" dataNode="dn1,dn2" rule="mod_rule">
<childTable name="student_record" primaryKey="xid" joinKey="student_id" parentKey="xid" />
</table>
<table name="xuser" dataNode="dn1,dn2" type="global"></table>
<table name="salary" dataNode="dn1,dn2" rule="auto_sharding_long"></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="xkahn" />
<dataNode name="dn2" dataHost="host2" database="xkahn" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.100.100.31:3306" user="root"
password="123123">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.100.100.32:3306" user="root"
password="123123">
</writeHost>
</dataHost>
</mycat:schema>
2.在/usr/local/mycat/conf/rule.xml中增加分片算法
<tableRule name="auto_sharding_long">
<rule>
<columns>money</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
3.修改/usr/local/mycat/conf/rule.xml中的rang-long算法
將
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
改爲:
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
<property name="defaultNode">0</property>
</function>
註釋:添加一個默認節點,即如果某條數據沒有被本算法包括,那麼這條數據就存放到默認的mycat節點服務器0(第一個節點服務器)上,1等於第二臺節點服務器。
4.修改算法文件/usr/local/mycat/conf/autopartition-long.txt
將原有的全部用"#"註釋掉,或者都刪除掉。然後添加下面兩行
0-3000=0
3001-5000=1
註釋:這個意思是工資數在0到3000塊錢的教師工資放到第一個節點服務器,工資範圍在3001到5000塊的放到第二臺節點服務器
5.開個mycat31的新終端啓動mycat
cd /usr/local/mycat/bin
./mycat console
6.在開個mycat31的新終端進入mycat的數據管理平臺
創建本次的數字範圍分片表salary,並插入測試數據
mysql -umycat -p123456 -h 192.168.73.100 -P 8066
use TESTDB;
create table salary(xid int(10) not null unique primary key,name varchar(20) not null,teacher_id int(10),money int(10),note varchar(500));
insert into salary(xid,name,teacher_id,money,note) values (1,"kahn",3721,3690,"kahn保安崗位工資3690元");
insert into salary(xid,name,teacher_id,money,note) values (2,"serena",129,3000,"serena的工資是3000元");
insert into salary(xid,name,teacher_id,money,note) values (3,"songsuer",138,2000,"宋姝兒的工資是2000元");
insert into salary(xid,name,teacher_id,money,note) values (4,"柳多妍",139,9999,"柳多妍的工資是9999津巴布韋幣");
insert into salary(xid,name,teacher_id,money,note) values (5,"xia",3312,6613,"xia的工資是6613元");
註釋,上面的應該只有id爲1名字叫kahn的數據放在了第二個節點服務器mycat32上,其餘的全部被放到了第一個節點服務器mycat31上
7.在mycat上、還有兩臺物理服務器查數據是否存在(觀察是否按照規則分片了)
select * from salary;
a.3690大於3000所以自動被分到第二臺mysql服務器
b.3000小於3001所以被分到第一臺mysql服務器
c.2000小於3001所以被分到第一臺mysql服務器
d.9999大於5000了,沒有被滿足的條件了,所以就被分到了默認服務器<第一臺mysql服務器>
e.6613大於5000了,沒有被滿足的條件了,所以就被分到了默認服務器<第一臺mysql服務器>
------------------END--------------2020年3月26日15:33:50-------------------------
老鐵雙擊666