接上一篇帖子《MyCat-07之centos7上使用mycat部署水平分表---分片枚舉》
一、目標
使用mycat部署按日期水平分片分表。
什麼叫按日期分片呢?
按照日期輪詢隔幾天存放到一個節點服務器,到了天數後再放到另外一臺節點服務器,然後一直循環下去,最終實現分片分表。
二、實施mycat按日期分片分表
以下配置均在mycat服務器mycat31上執行
1.修改vim /usr/local/mycat/conf/schema.xml
添加一行內容<table name="login_log" dataNode="dn1,dn2" rule="sharding_by_time"></table>,意爲本次試驗的按日期分片的表名叫login_log,該表被水平分片到了dn1和dn2兩臺服務器上,使用的規則叫sharding_by_time。完整的schema.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>
<table name="login_log" dataNode="dn1,dn2" rule="sharding_by_time"></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
2-1.添加規則
<tableRule name="sharding_by_time">
<rule>
<columns>logintime</columns>
<algorithm>partitionByTime</algorithm>
</rule>
</tableRule>
註釋:算法規則名叫sharding_by_time(與schema.xml中的保持對應),分片抓取數據的列是logintime(表名在schema.xml中有定義),算法使用的是partitionByTime(下面會自定義添加,算法名字要保持一致)
2-2.添加算法
<function name="partitionByTime"
class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2014-01-01</property>
<property name="sEndDate">2014-01-04</property>
<property name="sPartionDay">2</property>
</function>
註釋:
yyyy-MM-dd ---->日期格式年月日
sBeginDate ---->第一條數據如2014-01-01
sPartionDay ---->每隔兩天分片一次
sEndDate ---->第二輪循環結束的天是2014-01-04
大概意思是,假定輸入是2014-01-01開始,那麼1號2號放到第一個節點服務器,3號和4號就放到第二個節點服務器上,這樣一輪就結束了,partionDay就是間接的告訴規則,一共兩臺服務器,走了一輪4條數據了,假定還有5號和6號就輪詢的放到第一個節點服務器上,然後就依次類推下去。
3.再打開個mycat31的終端用以啓動mycat程序
cd /usr/local/mycat/bin
./mycat console
4-1.再打開個mycat31的終端用以啓動mycat數據管理平臺
mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;
4-2.在mycat中創建用於本次試驗的表login_log
create table login_log(xid int(10) not null unique primary key,name varchar(20) not null,logintime datetime,issuccess varchar(100),note varchar(500));
4-3.在mycat中插入用於本次的測試數據
insert into login_log(xid,name,logintime,issuccess,note) values (1,"kahn","2014-01-01","success","2014-01-01登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (2,"kahn2","2014-01-02","success","2014-01-02登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (3,"kahn3","2014-01-03","success","2014-01-03登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (4,"kahn4","2014-01-04","success","2014-01-04登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (5,"kahn5","2014-01-05","success","2014-01-05登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (6,"kahn6","2014-01-06","success","2014-01-06登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (7,"kahn7","2020-03-27","success","2020-03-27登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (8,"kahn8","2020-03-28","success","2020-03-28登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (9,"kahn9","2020-03-29","success","2020-03-29登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (10,"kahn10","2020-03-30","success","2020-03-30登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (11,"kahn11","2020-03-31","success","2020-03-31登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (12,"kahn12","2020-04-01","success","2020-04-01登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (13,"kahn13","2014-01-07","success","2014-01-07登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (14,"kahn14","2014-01-08","success","2014-01-08登錄成功了");
insert into login_log(xid,name,logintime,issuccess,note) values (15,"kahn15","2014-01-09","success","2014-01-09登錄成功了");
三、測試效果
1.分別用mycat數據管理平臺去select * from login_log;看數據
2.分別再去兩臺物理mysql服務器上觀察數據是怎麼分佈的select * from login_log;
我是分成功了,不知道你怎麼樣。照例送你一碗雞湯。
---------------------END---------------2020年3月26日23:06:37---------------------------
---------------------雞湯:比你優秀的人都比你努力,你有什麼資格懶散?---------