1、简介
开源的数据库分库分表中间件...更多的介绍可以去官网:
http://www.mycat.io/
开始之前要启动mysql, 这里就不赘述了, 可以参考之前的《Docker实战及常用服务安装》
2、构建镜像
2.1、新建目录
mkdir -p /srv/mycat
mkdir -p /usr/local/mycat
2.2、下载mycat安装包
cd /srv/mycat
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz mycat.tar.gz
2.3、解压文件,复制配置文件
tar -zxvf mycat.tar.gz
cp -r /srv/mycat/conf/ /usr/local/mycat/conf/
2.4、创建Dockerfile
cd /srv/mycat
vim Dockerfile
Dockerfile 文件内容
FROM openjdk:8
ADD mycat.tar.gz /usr/local/
VOLUME /usr/local/mycat/conf
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]
2.5、创建mycat镜像
Dockerfile所在目录下执行
docker build -t mycat-1.6 .
构建过程可能需要一些时间, 如果之前没有jdk8的镜像它会为我们自动下载
构建完成之后可以通过docker images 进行查看

2.6、修改mycat配置文件
之前已经将配置文件都copy到我们新建的目录
cd /usr/local/mycat/conf
ls

mycat 主要的应该就是配置文件的配置了,主要以下三个需要熟悉。
-
server.xml是Mycat服务器参数调整和用户授权的配置文件
-
schema.xml是逻辑库定义和表以及分片定义的配置文件
-
rule.xml是分片规则的配置文件
-
配置文件更详细的介绍可以百度找找, 别的我也是刚接触不是很清楚
server.xml 里面可以修改root 的密码,默认是123456,这里为了和之前MySQL数据库一致我就改成root了

schema.xml:
这里没用的我已经都删除了,配置了3个分片,这样简单的一个分库分表就配置完了
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="user_table" dataNode="dn1" primaryKey="id"/>
<table name="test_table" dataNode="dn1,dn2,dn3" rule="mod-long" autoIncrement="true" primaryKey="id"/>
<table name="db_table" dataNode="dn1,dn2,dn3" rule="mod-long" autoIncrement="true" primaryKey="id"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1"/>
<dataNode name="dn2" dataHost="localhost1" database="db2"/>
<dataNode name="dn3" dataHost="localhost1" database="db3"/>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.0.0.131:3307" user="root" password="root">
<readHost host="hostS1" url="192.0.0.131:3307" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
更多详细的配置可以参考:
https://www.cnblogs.com/icebutterfly/p/9505624.html
2.7、创建数据库和表
我这里只通过docker启动了一个数据库实例, 所以新建三个数据库
建库,db1、db2、db3:
CREATE DATABASE IF NOT EXISTS db1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS db2 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS db3 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
表test_table:
CREATE TABLE `test_table` (
`id` smallint(6) NOT NULL,
`name` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
表user_table:
CREATE TABLE `user_table` (
`id` smallint(6) NOT NULL,
`user_name` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.8、启动mycat
docker run --name mycat -p 8066:8066 -p 9066:9066 -v /usr/local/mycat/conf/:/usr/local/mycat/conf -d mycat-1.6
启动成功之后, 会返回容器id

这里可以通过docker logs mycat,进行日志的查看
docker logs mycat

2.9、测试
可以使用Navicat 进行连接, ip地址就是服务器的ip,端口是8066, 用户名密码都是root

mycat虚拟表:

MySQL数据库,其中db1有自己单独的user_table表:

mycat中执行插入语句
INSERT INTO test_table(id, name) VALUES (1, '测试1');
INSERT INTO test_table(id, name) VALUES (2, '测试2');
INSERT INTO test_table(id, name) VALUES (3, '测试3');
INSERT INTO test_table(id, name) VALUES (4, '测试4');
INSERT INTO test_table(id, name) VALUES (5, '测试5');
INSERT INTO test_table(id, name) VALUES (6, '测试6');
INSERT INTO user_table(id, user_name, password) VALUES (1, 'zhangsan', '123456');
INSERT INTO user_table(id, user_name, password) VALUES (2, 'lisi', '123456');
查看3个库的数据




查看mycat虚拟表数据


修改一条试一下
update test_table set name = '测试修改' where id = 1

没有问题, 这样一个简单的分库分表就实现了, 仅限于学习, 真正运用到生产要考虑的事情还有很多。
需要注意的是,表的新增、删除都需要先修改schema.xml,要想在加入读写分离的话,可以参考之前的MySQL主从复制的配置