mycat分库分表docker实现

实验环境
docker版本:Docker version 1.13.1
mycat版本:Mycat-server-1.6-RELEASE-
jdk版本:jdk1.8
mysql版本:mysql5.7
linux版本:Linux VM_0_12_centos 3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

实验目的
实现mysql分库分表,本示例中将用户的消费记录表(user_consumption_record)分了三个库,对应三张表,三个库分别在不同的节点上,使用mycat做路由。使得对用用户来说,就好像在操作一个表。
用户表(未做分库分表操作),是单表直接放到了其中一个节点上。

实验结果展示
在这里插入图片描述
构建实验所需的docker镜像
我们所需要的镜像有两个,第一个是mysql 的镜像,第二个是mycat的镜像,mysql 的镜像,docker search 一下可以找到很多可以用的,所以我们这边就不重复去自己构建了,显得麻烦。
下面是我们使用的网上直接找的mysql镜像:
在这里插入图片描述
下面我们开始构建我们需要的一个含jdk8的mycat1.6的镜像,构建所需的资源如下:
在这里插入图片描述
下面是构建含jdk8的mycat1.6的镜像的Dockerfile

FROM docker.io/centos
COPY mycat/jdk-8u171-linux-x64.tar.gz /usr/local/
RUN tar -zxvf /usr/local/jdk-8u171-linux-x64.tar.gz -C /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_171
ENV PATH= P A T H : PATH: PATH:JAVA_HOME/bin
ENV CLASSPATH=.: J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
COPY mycat/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz /usr/local/
RUN tar -zxvf /usr/local/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
ENV MYCAT_HOME=/usr/local/mycat

RUN source /etc/profile
RUN source ~/.bash_profile
CMD ["/usr/local/mycat/bin/mycat", “console”]

执行类似下面的命令,就可以生成我们需要的含jdk8的mycat1.6的镜像了(/home/wen 这个是我的当前构建目录)

docker build -t centos-jdk8-mycat1.6 -f Dockerfile /home/wen/
编写mycat的sechma.xml文件
mycat的server.xml 、rule.xml 都没改过,我这边就不贴出来了,这里面如果有一些标签的意义不理解的,那还是请百度把,本文就不讲解这些标签怎么使用了。

<?xml version="1.0"?>

<mycat:schema xmlns:mycat=“http://io.mycat/”>

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
            <!-- auto sharding by id (long) -->
            <table name="user" dataNode="dn1" primaryKey="id"/>
            <table name="user_consumption_record" dataNode="dn1,dn2,dn3" rule="mod-long" autoIncrement="true" primaryK

ey=“id”/>

    <dataNode name="dn1" dataHost="mysql1" database="db1" />
    <dataNode name="dn2" dataHost="mysql2" database="db2" />
    <dataNode name="dn3" dataHost="mysql3" database="db3" />

    <dataHost name="mysql1" maxCon="1000" minCon="10" balance="0"
                      writeType="0" dbType="mysql" dbDriver="native">
            <heartbeat>select user()</heartbeat>
            <writeHost host="host1" url="172.18.4.21:3306" user="root" password="123456"></writeHost>
    </dataHost>
    <dataHost name="mysql2" maxCon="1000" minCon="10" balance="0"
                      writeType="0" dbType="mysql" dbDriver="native">
            <heartbeat>select user()</heartbeat>
            <writeHost host="host2" url="172.18.4.22:3306" user="root" password="123456"></writeHost>
    </dataHost>
    <dataHost name="mysql3" maxCon="1000" minCon="10" balance="0"
                      writeType="0" dbType="mysql" dbDriver="native">
            <heartbeat>select user()</heartbeat>
            <writeHost host="host3" url="172.18.4.23:3306" user="root" password="123456"></writeHost>
    </dataHost>

</mycat:schema>

docker-compose文件的编写
docker-compose.yml 其实就是帮我们做了个服务编排,使用起来就很方便了,下面贴出本次实验的服务编排明细:

version: ‘2’
services:
mycat:
image: centos-jdk8-mycat1.6
networks:
jznet:
ipv4_address: 172.18.4.26
volumes:
- /root/data/mycat/logs:/usr/local/mycat/logs
- /home/wen/mycat-test/schema.xml:/usr/local/mycat/conf/schema.xml
ports:
- “8066:8066”
- “9066:9066”
mysql-01:
image: docker.io/centos/mysql-57-centos7
networks:
jznet:
ipv4_address: 172.18.4.21
ports:
- “3301:3306”
environment:
- MYSQL_ROOT_PASSWORD=123456
mysql-02:
image: docker.io/centos/mysql-57-centos7
networks:
jznet:
ipv4_address: 172.18.4.22
ports:
- “3302:3306”
environment:
- MYSQL_ROOT_PASSWORD=123456
mysql-03:
image: docker.io/centos/mysql-57-centos7
networks:
jznet:
ipv4_address: 172.18.4.23
ports:
- “3303:3306”
environment:
- MYSQL_ROOT_PASSWORD=123456
networks:
jznet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.4.0/26

启动服务
在这里插入图片描述
启动之后我们发现mycat的日志还是会报错的,报下面的错误:
在这里插入图片描述
其实这个是由于我们数据的db1、db2、db3、没创建好导致的,我们在各自的数据库将这三个库手动创建好就可以了

在这里插入图片描述
实验sql
select * from user_consumption_record limit 10;

create table user(id int not null,name varchar(20));
create table user_consumption_record(id int not null PRIMARY key COMMENT “主键” auto_increment ,goods varchar(20) COMMENT “商品”,amount DECIMAL(15,2) COMMENT “金额”,finish_time datetime) COMMENT “完成时间”;

insert into user_consumption_record(id,goods,amount,finish_time) values(7,‘a’,1,now());

insert into user_consumption_record(id,goods,amount,finish_time) values(2,‘b’,1,now());
insert into user_consumption_record(id,goods,amount,finish_time) values(3,‘c’,1,now());
insert into user_consumption_record(id,goods,amount,finish_time) values(4,‘d’,1,now());
insert into user_consumption_record(id,goods,amount,finish_time) values(5,‘e’,1,now());
insert into user_consumption_record(id,goods,amount,finish_time) values(6,‘f’,1,now());

drop table user;
drop table user_consumption_record;

实验之后

分库分表虽然是实现了,但是这个直接拿到生产上使用肯定还不可行,有以下问题需要考虑:
1、数据库备份
2、业务量大了一个mycat是搞不定的,可能需要多个mycat,多个mycat 的话那么可能需要用到zk统一管理配置
3、主键的生成可以考虑使用mycat的数据的sequence、自己实现也可以
注意点

1、表的新增、删除都需要修改schema.xml
2、即使有的表是单表也需要配置到schema.xml里卖年
3、分表键需要慎重考虑,避免引起跨库事物。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值