更新时间:2021-07-07 16:54:40 来源:极悦 浏览1886次
怎么通过mycat实现分库分表的功能:
准备数据库:
CREATE DATABASE db1 DEFAULT CHARACTER SET utf8;
CREATE DATABASE db2 DEFAULT CHARACTER SET utf8;
use db1;
CREATE TABLE product(
id INT PRIMARY KEY,
pname CHAR(20)
);
use db2;
CREATE TABLE product(
id INT PRIMARY KEY,
pname CHAR(20)
);
-------------------131-----------------
CREATE DATABASE db3 DEFAULT CHARACTER SET utf8;
use db3;
CREATE TABLE product(
id INT PRIMARY KEY,
pname CHAR(20)
);
如果想要修改mycat登录的账号密码,可以到conf/server.xml去修改
重新启动的命令,切换到bin下执行./mycat restart测试新的账号密码
修改mycat的conf/schema.xml文件,配置数据库的url、账号、密码
配置数据参数
连接数据库的过程:根据
中dataNode,得到节点的名字,例如dn1,然后再用dn1到所有的配置找是否有名字相同的,如果有则读取到dataHost中指定的数据库的配置,然后根据中配置url、用户名、密码连接到指定的数据库,具体用哪个数据主要使用根据中的database决定,现在db1
重启mycat
cd到bin执行./mycat restart
通过Navicat操作mycat,双击mycat连接mycat,然后双击TESTDB选择数据库,如果双击TESTDB一直转圈,那就是schema.xml文件配置有问题,检查一下配置执行./mycat restart
在product虚拟表中创建查询,执行插入数据的操作,此处有坑:通过mycat插入数据时,必须将所有的字段名写出来,如果不写执行失败
结果如下:
insert into product(id,pname)values(1,‘电脑’);db1
insert into product(id,pname)values(5000000,‘手机’);db1
insert into product(id,pname)values(5000001,‘空调’);db2
insert into product(id,pname)values(10000000,‘铁锅’);db2
insert into product(id,pname)values(10000001,‘笔记本’);db3
结论:
目前根据默认配置来说,切片的规则是根据id的范围进行切分,id范围[1,500W]存在db1的product表中,[5000001,1000W]存在db2的product表中,[10000001,1500W]存在db3的product中…
mycat中的一些分片规则(水平拆分表的规则)•在schema.xml中指定了当前默认的分片规则
在conf/rule.xml文件中定义一些mycat支持的规则,在里面可以看到分片的详细规则
在conf/autopartition-long.txt里面设置了默认的分片细则
这里可以修改一下单位,把M修改成K
然后重启mycat、将之前的数据删除进行测试
insert into product(id,pname)values(1,‘电脑’);db1
insert into product(id,pname)values(500000,‘手机’);db1
insert into product(id,pname)values(500001,‘空调’);db2
insert into product(id,pname)values(1000000,‘铁锅’);db2
insert into product(id,pname)values(1000001,‘笔记本’);db3
结论:
通过mycat中的product虚拟表进行查询操作
利用mycat查询数据的流程:将sql发送到了mycat,mycat会根据schema.xml中配置将sql语句转发给db1、db2、db3,然后这个三个数据库分别执行查询然后将查询出来的结果返回给mycat,然后mycat在对得到结果集进行整合,然后将最终的结果集返回给客户端。
分片规则:
•默认的是根据id的范围进行分片auto-sharding-long
•根据hash分片sharding-by-intfile
前提:一个字符串、对象它的哈希值是固定的
根据某个字段(id)的哈希值进行水平切分,例如下图中订单表存在大量的订单,
根据用户id的哈希值进行切分之后,可以保证同一个用户的订单在同一张表中。形成多张较小的表。
但是这样也会存在一个问题:各个表中的数据不均匀,表也太多了,主要用于切分之后表不多的情况下使用
•取模分片mod-long
不同的对象他们的哈希值可能相同,就算哈希值不同对1024取余之后得到的余数也可能相同,可以保证同一个用户id的数据在同一个数据库中,同时余数相同的数据也都在同一个数据库中,为了达到数据库的负载均衡
以上就是极悦小编介绍的"连接Mycat数据库的demo",希望对大家有帮助,想了解更多可查看Mycat教程,如有疑问,请在线咨询,有专业老师随时为您服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习