前言
按套路这里应该先安利一下mycat,还是自行百度吧,留个网站附加一张原理图就很明了了。
网站:http://mycat.io/
mycat就可以简单理解为企业级mysql集群工具,基于阿里的Cobar发展而来的,用于解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。
准备工作
建库建表
有3张表 users,item,item_detail (item 的子表) 和 3 个数据库 db01,db02,db03
表 users 存储在数据库 db01, 表 item 和 item_detail 分布存储在数据 db01 和 db02
现在在3个数据库都创建相同的表
create database db01;
create database db02;
create database db03;
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL default '',
indate DATETIME NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default 0,
indate DATETIME NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE item_detail (
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default 0,
name varchar(50) NOT NULL default '',
item_id INT NOT NULL,
PRIMARY KEY (id),
key (item_id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
mycat安装
下载mycat.tar包Mycat-server-1.4-RELEASE-20150901112004-linux.tar.gz
解压
tar -xzvf Mycat-server-1.4-RELEASE-20150901112004-linux.tar.gz
mv mycat /usr/local
配置home
vim /etc/profile
export MYCAT_HOME=/usr/localmycat
查看mycat结构,修改配置
bin 可执行文件
conf 配置文件
lib 依赖包
logs 日志文件
修改配置
server.xml
【server.xml】是MyCAT对外的“虚拟数据库”配置文件。所谓的“虚拟数据库”是说,MyCAT将多个Mysql集群整合起来对外提供服务,提供服务的接口仍然采用Mysql的形式,因此,通过仿造Mysql接口,让调用程序以为自己是在访问Mysql数据库,就是所谓的“虚拟数据库”。
添加一个账户,账号为root,密码为123,并且其schema值为lvfangTest
test
TESTDB
123
lvfangTest
user
TESTDB
true
同样我们要添加对等的schema:lvfangTest,其配置在schema.xml文件中配置,
schema.xml
【schema.xml】中主要配置数据库连接信息和表的分片规则
[root@hadoop2005 conf]# vim schema.xml
select user()
注意:如果分片规则中用到其他分片算法,需要去rule.xml中配置相应算法,如果有则不需要配置,直接引用即可
另外在配置数据库连接信息时,记得url要写ip切勿写localhost之类的
启动mycat并连接
开启关闭
mycat start
mycat stop
mycat restart
连接
mysql -uroot -p123 -hhadoop2005 -P8066 -DlvfangTest
-u用户
-p密码
-h主机
-P8066(mycat默认端口为8066)
-D链接的库(这里不是数据库中的物理库,而是mycat配置中的逻辑库,即用户下对应的schema值)
这里注意在操作时最好要切换
现在我们添加数据,看数据会不会根据我们的分片规则进行分表入库
insert into users(name,indate) values('lvfang',now());
insert into item(id,value,indate) values(1,100,now());
insert into item_detail(value,name,item_id) values('pad',40,1);
insert into item_detail(value,name,item_id) values('phone',50,1);
insert into item(id,value,indate) values(999,100,now());
insert into item_detail(value,name,item_id) values('pad',40,999);
insert into item_detail(value,name,item_id) values('phone',50,999);
去查看是否数据进行分库
mysql> select * from db01.users;
+----+--------+---------------------+
| id | name | indate |
+----+--------+---------------------+
| 2 | lvfang | 2018-01-25 20:11:09 |
+----+--------+---------------------+
1 row in set (0.00 sec)
mysql> select * from db02.users;
Empty set (0.00 sec)
mysql> select * from db03.users;
Empty set (0.02 sec)
mysql> select * from db01.item;
Empty set (0.00 sec)
mysql> select * from db02.item;
+-----+-------+---------------------+
| id | value | indate |
+-----+-------+---------------------+
| 999 | 100 | 2018-01-25 20:11:09 |
+-----+-------+---------------------+
1 row in set (0.00 sec)
mysql> select * from db03.item;
+----+-------+---------------------+
| id | value | indate |
+----+-------+---------------------+
| 1 | 100 | 2018-01-25 20:11:09 |
+----+-------+---------------------+
1 row in set (0.00 sec)
mysql> select * from db01.item_detail;
Empty set (0.00 sec)
mysql> select * from db02.item_detail;
+----+-------+------+---------+
| id | value | name | item_id |
+----+-------+------+---------+
| 3 | 0 | 40 | 999 |
| 4 | 0 | 50 | 999 |
+----+-------+------+---------+
2 rows in set (0.00 sec)
mysql> select * from db03.item_detail;
+----+-------+------+---------+
| id | value | name | item_id |
+----+-------+------+---------+
| 3 | 0 | 40 | 1 |
| 4 | 0 | 50 | 1 |
+----+-------+------+---------+
2 rows in set (0.00 sec)
mysql>
我们可以看到,成功