mycat分库分表docker实现

版权声明:本文为Fighter168原创文章,未经允许不得转载。 https://blog.csdn.net/fighterandknight/article/details/80768375

实验环境

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=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/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"?>
<!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" dataNode="dn1" primaryKey="id"/>
                <table name="user_consumption_record" dataNode="dn1,dn2,dn3" rule="mod-long" autoIncrement="true" primaryK
ey="id"/>
        </schema>


        <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、分表键需要慎重考虑,避免引起跨库事物。

猜你喜欢

转载自blog.csdn.net/fighterandknight/article/details/80768375