MyCat分片:水平拆分例項解析和程式碼實現!

無敵天驕發表於2021-03-22

一、概述

根據表中的資料的邏輯關係,將 同一個表中的資料按照某種條件拆分到多臺資料庫(主機)上面,這種切分稱之為 資料的水平(橫向)切分

MyCat分片:水平拆分例項解析和程式碼實現!











二、案例場景


MyCat分片:水平拆分例項解析和程式碼實現!












在業務系統中, 有一張表(日誌表), 業務系統每天都會產生大量的日誌資料 , 單臺伺服器的資料儲存及處理能力是有限的, 可以對資料庫表進行拆分, 原有的資料庫表拆分成以下表 :

MyCat分片:水平拆分例項解析和程式碼實現!





三、準備工作

1.準備三臺資料庫例項

192.168.192.157 192.168.192.158 192.168.192.159

2.在三臺資料庫例項中建立資料庫

create database log_db DEFAULT CHARACTER SET utf8mb4;

四、schema.xml的配置

<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="
    <schema name="LOG_DB" checkSQLschema="false" sqlMaxLimit="100"> 
        <table name="tb_log" dataNode="dn1,dn2,dn3" primaryKey="id" rule="mod- long" /> 
    </schema> 
    
    <dataNode name="dn1" dataHost="host1" database="log_db" /> 
    <dataNode name="dn2" dataHost="host2" database="log_db" /> 
    <dataNode name="dn3" dataHost="host3" database="log_db" /> 
    
    <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="192.168.192.157:3306" user="root" password="itcast"></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="hostM2" url="192.168.192.158:3306" user="root" password="itcast"></writeHost> 
    </dataHost> 
    
    <dataHost name="host3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM3" url="192.168.192.159:3306" user="root" password="itcast"></writeHost> 
    </dataHost> </mycat:schema>

五、server.xml的配置

<user name="root" defaultAccount="true"> 
    <property name="password">123456</property> 
    <property name="schemas">LOG_DB</property> </user> <user name="test"> 
    <property name="password">123456</property> 
    <property name="schemas">LOG_DB</property> </user> <user name="user"> 
    <property name="password">123456</property> 
    <property name="schemas">LOG_DB</property> 
    <property name="readOnly">true</property> </user>

六、測試

1.在MyCat資料庫中執行建表語句

CREATE TABLE `tb_log` ( 
    `id` bigint(20) NOT NULL COMMENT 'ID', 
    `model_name` varchar(200) DEFAULT NULL COMMENT '模組名', 
    `model_value` varchar(200) DEFAULT NULL COMMENT '模組值', 
    `return_value` varchar(200) DEFAULT NULL COMMENT '返回值', 
    `return_class` varchar(200) DEFAULT NULL COMMENT '返回值型別', 
    `operate_user` varchar(20) DEFAULT NULL COMMENT '操作使用者', 
    `operate_time` varchar(20) DEFAULT NULL COMMENT '操作時間', 
    `param_and_value` varchar(500) DEFAULT NULL COMMENT '請求引數名及引數值',
    `operate_class` varchar(200) DEFAULT NULL COMMENT '操作類', 
    `operate_method` varchar(200) DEFAULT NULL COMMENT '操作方法', 
    `cost_time` bigint(20) DEFAULT NULL COMMENT '執行方法耗時, 單位 ms', 
    `source` int(1) DEFAULT NULL COMMENT '來源 : 1 PC , 2 Android , 3 IOS', 
    PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.插入資料

INSERT INTO `tb_log` (`id`, `model_name`, `model_value`, `return_value`, `return_class`, `operate_user`, 
    `operate_time`, `param_and_value`, `operate_class`, `operate_method`, `cost_time`,`source`) 
VALUES('1','user','insert','success','java.lang.String','10001','2020-02-26 18:12:28','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','10',1);


INSERT INTO `tb_log` (`id`, `model_name`, `model_value`, `return_value`,`return_class`, `operate_user`, 
    `operate_time`, `param_and_value`, `operate_class`, `operate_method`, `cost_time`,`source`) 
VALUES('2','user','insert','success','java.lang.String','10001','2020-02-26 18:12:27','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','23',1);


INSERT INTO `tb_log` (`id`, `model_name`, `model_value`, `return_value`, `return_class`, `operate_user`, 
    `operate_time`, `param_and_value`, `operate_class`, `operate_method`, `cost_time`,`source`) 
VALUES('3','user','update','success','java.lang.String','10001','2020-02-26 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','34',1);


INSERT INTO `tb_log` (`id`, `model_name`, `model_value`, `return_value`, `return_class`, `operate_user`, 
    `operate_time`, `param_and_value`, `operate_class`, `operate_method`, `cost_time`,`source`) 
VALUES('4','user','update','success','java.lang.String','10001','2020-02-26 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','13',2);


INSERT INTO `tb_log` (`id`, `model_name`, `model_value`, `return_value`, `return_class`, `operate_user`, 
    `operate_time`, `param_and_value`, `operate_class`, `operate_method`, `cost_time`,`source`) 
VALUES('5','user','insert','success','java.lang.String','10001','2020-02-26 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.cont roller.UserController','insert','29',3);


INSERT INTO `tb_log` (`id`, `model_name`, `model_value`, `return_value`,`return_class`, `operate_user`, 
    `operate_time`, `param_and_value`, `operate_class`,`operate_method`, `cost_time`,`source`) 
VALUES('6','user','find','success','java.lang.String','10001','2020-02 2618:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.cont roller.UserController','find','29',2);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2764217/,如需轉載,請註明出處,否則將追究法律責任。

相關文章