• MyCat分片水平拆分


    场景

    在业务系统中 , 有一张表 ( 日志表 ), 业务系统每天都会产生大量的日志数据 , 单台服务器的数据存
    储及处理能力是有限的 , 可以对数据库表进行拆分。

    准备

    准备三台服务器,具体的结构如下:

     并且,在三台数据库服务器中分表创建一个数据库test

     

    配置 

    schema.xml

    1. <schema name="TEST" checkSQLschema="true" sqlMaxLimit="100">
    2. <table name="tb_log" dataNode="dn4,dn5,dn6" primaryKey="id" rule="mod-long" />
    3. </schema>
    4. <dataNode name="dn4" dataHost="dhost1" database="test" />
    5. <dataNode name="dn5" dataHost="dhost2" database="test" />
    6. <dataNode name="dn6" dataHost="dhost3" database="test" />
    7. <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    8. <heartbeat>select user()</heartbeat>
    9. <writeHost host="master" url="jdbc:mysql://192.168.2.3:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="newPwd520@" />
    10. </dataHost>
    11. <dataHost name="dhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    12. <heartbeat>select user()</heartbeat>
    13. <writeHost host="master" url="jdbc:mysql://192.168.2.4:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="newPwd520@" />
    14. </dataHost>
    15. <dataHost name="dhost3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    16. <heartbeat>select user()</heartbeat>
    17. <writeHost host="master" url="jdbc:mysql://192.168.2.5:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="newPwd520@" />
    18. </dataHost>
    tb_log 表最终落在 3 个节点中,分别是 dn4 dn5 dn6 ,而具体的数据分别存储在 dhost1 、 dhost2、 dhost3 test 数据库中

    server.xml

    配置 root 用户既可以访问 SHOPPING 逻辑库,又可以访问 TEST 逻辑库。
    1. <user name="root" defaultAccount="true">
    2. <property name="password">123456</property>
    3. <property name="schemas">SHOPPING,TEST</property>
    4. <!-- 表级 DML 权限设置 -->
    5. <!--
    6. <privileges check="true">
    7. <schema name="DB01" dml="0110" >
    8. <table name="TB_ORDER" dml="1110"></table>
    9. </schema>
    10. </privileges>
    11. -->
    12. </user>

    测试

    配置完毕后,重新启动 MyCat ,然后在 mycat 的命令行中,执行如下 SQL 创建表、并插入数据,查看数据分布情况。
    1. CREATE TABLE tb_log (
    2. id bigint(20) NOT NULL COMMENT 'ID',
    3. model_name varchar(200) DEFAULT NULL COMMENT '模块名',
    4. model_value varchar(200) DEFAULT NULL COMMENT '模块值',
    5. return_value varchar(200) DEFAULT NULL COMMENT '返回值',
    6. return_class varchar(200) DEFAULT NULL COMMENT '返回值类型',
    7. operate_user varchar(20) DEFAULT NULL COMMENT '操作用户',
    8. operate_time varchar(20) DEFAULT NULL COMMENT '操作时间',
    9. param_and_value varchar(500) DEFAULT NULL COMMENT '请求参数名及参数值',
    10. operate_class varchar(200) DEFAULT NULL COMMENT '操作类',
    11. operate_method varchar(200) DEFAULT NULL COMMENT '操作方法',
    12. cost_time bigint(20) DEFAULT NULL COMMENT '执行方法耗时, 单位 ms',
    13. source int(1) DEFAULT NULL COMMENT '来源 : 1 PC , 2 Android , 3 IOS',
    14. PRIMARY KEY (id)
    15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    1. INSERT INTO TB_LOG (id, model_name, model_value, return_value, return_class,
    2. operate_user, operate_time, param_and_value, operate_class, operate_method,
    3. cost_timesource)
    4. VALUES('1','user','insert','success','java.lang.String','10001','2022-01-06
    5. 18:12:28','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.contro
    6. ller.UserController','insert','10',1);
    7. INSERT INTO TB_LOG (id, model_name, model_value, return_value, return_class,
    8. operate_user, operate_time, param_and_value, operate_class, operate_method,
    9. cost_timesource)
    10. VALUES('2','user','insert','success','java.lang.String','10001','2022-01-06
    11. 18:12:27','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.contro
    12. ller.UserController','insert','23',1);
    13. INSERT INTO TB_LOG (id, model_name, model_value, return_value, return_class,
    14. operate_user, operate_time, param_and_value, operate_class, operate_method,
    15. cost_timesource)
    16. VALUES('3','user','update','success','java.lang.String','10001','2022-01-06
    17. 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.contro
    18. ller.UserController','update','34',1);
    19. INSERT INTO TB_LOG (id, model_name, model_value, return_value, return_class,
    20. operate_user, operate_time, param_and_value, operate_class, operate_method,
    21. cost_timesource)
    22. VALUES('4','user','update','success','java.lang.String','10001','2022-01-06
    23. 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.contro
    24. ller.UserController','update','13',2);
    25. INSERT INTO TB_LOG (id, model_name, model_value, return_value, return_class,
    26. operate_user, operate_time, param_and_value, operate_class, operate_method,
    27. cost_timesource)
    28. VALUES('5','user','insert','success','java.lang.String','10001','2022-01-06
    29. 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.co
    30. ntroller.UserController','insert','29',3);
    31. INSERT INTO TB_LOG (id, model_name, model_value, return_value, return_class,
    32. operate_user, operate_time, param_and_value, operate_class, operate_method,
    33. cost_timesource)
    34. VALUES('6','user','find','success','java.lang.String','10001','2022-01-06
    35. 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.co
    36. ntroller.UserController','find','29',2);

  • 相关阅读:
    java servlet大学生旅游网站的设计与开发源码
    我的创业分享:不到1w的启动资金,无需货源,却做到了月入10W+
    靶向 TGF-β 信号通路
    (Spring笔记)AspectJ后置通知——@AfterReturning切面开发
    Spark开源REST服务——Apache Livy(Spark 客户端)
    使用C++库实现两个线程交替打印(一个线程打印奇数、一个线程打印偶数)
    在 kubernetes 环境下如何优雅扩缩容 Pulsar
    【从零学Python】关于python下划线命名的事儿、enumerate()
    Ideal maven自己配置的本地仓库无效问题解决
    Gradle中的DSL,Groovy & Kotlin 引用arr库新写法
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/133805616