一、水平分表场景
在业务系统中,有一张日志表,业务系统每天都会产生大量的日志数据,单台服务器的数据存储即处理能力是有限的,可以对数据库表进行拆分,这时候就可以使用水平分表的策略
说明1:水平分表,每个表的结构一致
说明2:水平分表,每个表的数据不同
服务器托管网 说明3:水平分表,所有表的合集才是完整的数据
二、准备工作
在192.168.3.90,192.168.3.91,192.168.92 三台MySQL服务器上创建hl_logs数据库
三、配置schema.xml
说明1:之前的schema.xml已经配置过其他的schema,dataNode等标签都不用动,直接新增我们本次案例需要的就行了,多个标签只要不冲突是可以并存的
说明2:逻辑库为hl_logs
说明3:逻辑表为tb_logs
服务器托管网 说明4:数据节点为dn4,dn5,dn6
说明5:数据节点dn4,dn5,dn6需要的数据库配置也是dbhost1,dbhost2,dbhost3,是可以公用的。
说明6:分片规则使用的是 rule=”mod-long” 规则,该规则在rule.xml有定义如下
说明7:继续看 function 中 mod-long 的定义
说明8:这里的count 3的意思是 id主键 按照和3进行取模运算,然后根据取模后的结果,将数据写入到不同的数据节点,即有几个数据节点,就会平均的写入到数据节点中
说明9:我这里整好配置了三个数据节点,而这里的默认值也是3,所以不用改了,如果我们想要将数据平均的写到4个数据节点上,则这里的count需要改为4
四、配置server.xml
说明1:root 这个用户可以访问 shopping 和 hl_logs 两个数据库
说明2:而 user 这个用户只能访问 shopping 这个数据库
说明3:我现在测试的都是使用 root 这个账户,所以 user 这个可以不用配置
五、水平分表测试
首先重启Mycat
登录Mycat
查看逻辑库和逻辑表
这里的tb_logs只是逻辑库,而在MySQL中还并没有tb_logs这个表,需要在Mycat中创建
create table tb_logs (id int auto_increment primary key, model_name varchar(200), operate_user varchar(20), operate_time varchar(19));
插入一条数据,然后查看数据节点中对应的数据变化
insert into tb_logs (id, model_name, operate_user, operate_time) values (1, '访问首页','张三', '2023-12-17 21:52:54');
说明1:id=1的数据,按照mod-long的算法,会用 1%3=1, 因为和3取模的结果只有 0,1,2, 所以结果为0时, 数据将写在第一个数据节点,结果为1时,结果会保存在第二个数据节点,结果为2时,保存在第三个数据节点上,而 1%3=1 ,所以id=1的数据写在了192.168.3.91第二个数据节点上。
说明2:第二个数据节点即192.168.3.91这个节点,所以id=1的数据只写入到这个数据节点上,其他节点上还没有数据。
继续验证
insert into tb_logs (id, model_name, operate_user, operate_time) values (2, '访问详情页','李四', '2023-12-17 22:55:24');
说明3:按照mod-long算法,id=2的数据被写入到192.168.3.92,第三个数据节点上,成功,继续验证。
insert into tb_logs (id, model_name, operate_user, operate_time) values (3, '访问评论页','王五', '2023-12-17 22:03:34');
说明4:按照mod-long算法,id=3的数据被写入到192.168.3.90,第1个数据节点上,成功,继续验证。
insert into tb_logs (id, model_name, operate_user, operate_time) values (4, '访问首页','赵六', '2023-12-17 22:09:34');
说明5:按照mod-long算法,id=4的数据被写入到192.168.3.91,第二个数据节点上,成功。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
本节介绍Util应用框架依赖注入的使用和配置扩展. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 当你想调用某个服务的方法完成特定功能时,首先需要得到这个服务的实例. 最简单的办法是直接 new 一个服务实例,不过这样就把服务的实…