Docker搭建Mycat并实现分库分表

1,846 阅读4分钟

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主从复制的配置