docker版MyCat分库分表实现

安装mycat
mkdir mycat
cd mycat
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
mv Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz mycat.tar.gz
tar -zxvf mycat.tar.gz -C /usr/local/
vi Dockerfile
	FROM openjdk:8
	ADD mycat.tar.gz /usr/local/
	EXPOSE 8066 9066
	CMD ["/usr/local/mycat/bin/mycat", "console","&"]
docker run -it -d -v /usr/local/mycat/conf:/usr/local/mycat/conf -v /usr/local/mycat/logs:/usr/local/mycat/logs -p 8066:8066 -p 9066:9066 --name mycat mycat:1.6.7.1
安装mysql
docker pull mysql:5.7.28
docker run -itd --name mysql1 -v /home/mysql1/data:/var/lib/mysql -v /home/mysql1/conf:/etc/mysql -p 33061:3306 -e MYSQL_ROOT_PASSWORD=xxx mysql:5.7.28
docker run -itd --name mysql2 -v /home/mysql2/data:/var/lib/mysql -v /home/mysql2/conf:/etc/mysql -p 33062:3306 -e MYSQL_ROOT_PASSWORD=xxx mysql:5.7.28
docker run -itd --name mysql3 -v /home/mysql3/data:/var/lib/mysql -v /home/mysql3/conf:/etc/mysql -p 33063:3306 -e MYSQL_ROOT_PASSWORD=xxx mysql:5.7.28

已启动的容器如下
在这里插入图片描述
  mysql 5.7容器启动后会发现宿主机配置目录并没有my.cnf文件,原因是目前已经不需要配置即可完全启动,而mysql 5.7默认开启 GROUP BY 合法性检查,sql_mode值包含ONLY_FULL_GROUP_BY,可以在配置文件中关闭,故三个mysql的宿主机conf目录中执行

vi /home/mysql1/conf/my.cnf
	[mysqld]
	sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

然后使用 mysql 连接工具连接三个mysql服务器

mycat连接mysql

  mycat的server.xml可根据需要自行个性化配置,这里不修改。关键在schema.xml文件,官方说明是配置逻辑库(schema)、分片(dataNode)、物理库分片映射(dataHost)的文件,其实就是配置连接mysql的地方。
  这里使用默认的逻辑表配置,三个mysql库分别新增company表,mysql1和mysql2新增employee表
在这里插入图片描述在这里插入图片描述在这里插入图片描述
schema.xml默认逻辑表配置
在这里插入图片描述
分片,分别取三个mysql容器的数据库在这里插入图片描述
localhost1指向mysql1容器,localhost2指向mysql2容器,localhost3指向mysql3容器,这里要使用容器地址,不知道地址可以使用docker inspect 容器名得到
在这里插入图片描述
重新启动三个mysql容器:docker restart mysql1…

测试

  使用msql工具连接mycat(和连接mysql一样),插入两条公司信息,会发现三个库都插入了数据,因为company逻辑表类型设置了全局global。

insert into company(id, name) values(1, "name1");
insert into company(id, name) values(2, "name2");

  插入两条雇员信息

insert into employee(id, name, sharding_id) values(1, "name1", 10000);
insert into employee(id, name, sharding_id) values(2, "name2", 10010);

会发现第一条在mysql1库,第二条在mysql2库,因为employee配置dataNode=“dn1,dn2” rule=“sharding-by-intfile”,在rule.xml中可以看到,分片规则是sharding-by-intfile,指定了sharding_id为10000时放在第一个库dn1,为10010时放在第二个库dn2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看分片情况:explain select * from employee;
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值