MyCat & MySQL多节点的Docker虚拟化实践

Posted Linux脚本之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyCat & MySQL多节点的Docker虚拟化实践相关的知识,希望对你有一定的参考价值。

  

  

1背景介绍


MyCat多数据库节点的Docker虚拟化实践,主要创建三个mysql数据库容器和一个MyCat数据路由容器,然后通过MyCat进行数据记录的读取和写入操作。由于MyCatDocker官方Hub网站上没有镜像文件,故需要创建一个MyCat镜像文件。组件架构如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践


2数据库容器部署



本实践使用标准的MySQL镜像“mysql:5.6.29”,数据库版本是“5.6.29 MySQL Community Server (GPL)”。创建三个容器实例:db01db02db03。三个数据库容器,其属性如下表所示:

特性项目

db01

db02

db03

端口映射

3333

3334

3335

root密码

admin

admin

admin

 

容器创建命令如下:

db01

docker run --name db01 -p 3333:3306 -e MYSQL_ROOT_PASSWORD=admin  -d mysql:5.6.29

db02

docker run  --name db02 -p 3334:3306 -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.6.29

db03

docker run --name db03 -p 3335:3306 -e  MYSQL_ROOT_PASSWORD=admin -d mysql:5.6.29

上述三条创建容器的命令,执行结果返回三个ID,创建出三个MySQL容器,如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践
创建三个MySQL容器对象db01db02db03,对应端口分别为3333,3334,3335。从客户端进行mysql命令登录,登录过程分别如下图(登录端口3333示例)所示:

MyCat & MySQL多节点的Docker虚拟化实践

3MyCat镜像制作


MyCat是数据路由中间件,用于数据库分库分表的数据操作。MyCat运行环境需要JDK1.7或以上版本。故本实践制作MyCat镜像基于标准镜像“java: openjdk-7u95-jre”进行的,因为镜像制作基本都是基于标准镜像,然后进行删减组件而实现。

本实践制作MyCat镜像的步骤如下:

1.   Mycat-server-1.4-release-20151019230038-linux.tar.gz上传至Dockerfile所在目录;

2.   Mycat-server-1.4-release-20151019230038-linux.tar.gz解压缩;

3.   解压缩目录为mycat/

4.   编辑Dockerfile文件,添加mycat目录中的内容;

5.   使用命令“docker build”创建镜像。

解压缩目录内容如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践

修改Dockerfile文件,其内容如下所示:

#  Dockerfile for Mycat Image.

FROM  java:openjdk-7u95-jre

MAINTAINER  yinwq <yinwq@***.cn>

RUN  mkdir -p /var/local/mycat/

ADD  mycat/ /var/local/mycat/

ENTRYPOINT  ["/var/local/mycat/bin/mycat","console","&"]

EXPOSE  8066

EXPOSE  9066

CMD  ["/var/local/mycat/bin/mycat","console","&"]

说明:

使用命令“RUN mkdir -p /var/local/mycat/”创建文件夹;使用命令“ADD mycat/ /var/local/mycat/”将mycat目录内容拷贝到“/var/local/mycat/”目录下面;向外暴露两个端口80669066;“CMD["/var/local/mycat/bin/mycat","console","&"]”是mycat的启动命令。

调用命令“docker build -t yinwq/mycat:1.4 .”创建mycat镜像,创建过程如下所示:

[root@localhost  mycat]# docker build -t yinwq/mycat:1.4 .

Sending  build context to Docker daemon 17.46 MB

Sending  build context to Docker daemon

Step 0  : FROM java:openjdk-7u95-jre

 ---> 6f8d4a74ba6d

Step 7  : CMD /var/local/mycat/bin/mycat console &

 ---> Running in c7e70a1513ad

 ---> 6a1d30891f97

Removing  intermediate container c7e70a1513ad

Successfully  built 6a1d30891f97

创建出的mycat镜像如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践
镜像制作完成,可以导出为tar文件,共享给其他人。镜像文件导出和导入命令分别是“docker save”和“docker load”。完整命令如下所示:

导出

docker  save yinwq/mycat:1.4 > mycat.tar

导入

docker load  < mycat.tar

导出文件mycat.tar如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践

4MyCat容器部署


Mycat镜像制作完成后,使用“docker run”命令创建容器对象mycat01,命令如下所示:

docker  run --name mycat01 -d -p 8066:8066 -p 9066:9066 yinwq/mycat:1.4

命令返回“77e96b24b313…”容器ID

注意:上述命令中为两对端口进行了映射,80669066两对端口。

如果容器mycat01没有运行,使用命令“docker start mycat01”将mycat启动。然后在客户端对端口80669066进行连接测试,如下图(连接端口8066示例)所示:

MyCat & MySQL多节点的Docker虚拟化实践
 

根据上图,能够得出创建的mycat容器启动成功。但是mycat容器还没有对三个数据库容器进行访问配置。启动三个数据库容器db01db02db03进行mycat01容器的配置。命令如下所示:

[root@localhost  ~]# docker start db01 db02 db03

db01

db02

db03

此时启动了mycat01db01db02db03一共四个容器,其端口映射如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践
退出mycat01容器,进行数据库节点的配置。主要修改三个配置文件:server.xmlschema.xmlrule.xml

4.1 配置server.xml文件


Server.xml文件主要配置用户登录名称和登录密码,以及数据库名称。如下所示:

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:serverxmlns:mycat="http://org.opencloudb/">

    <system>

        <propertyname="defaultSqlParser">druidparser</property>

    </system>

    <username="test">

        <propertyname="password">test</property>

        <propertyname="schemas">TESTDB</property>

    </user>

</mycat:server>

本实践主要使用test/test读写用户进行测试。数据库“TESTDB”是逻辑数据库,用于通过MyCat访问数据库时的连接数据库。

4.2 配置schema.xml文件


Schema.xml文件主要配置数据库节点和主机IP以及主机端口等,如下所示:

<?xmlversion="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schemaxmlns:mycat="http://org.opencloudb/">

    <schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="100">

        <tablename="NUMBERS"primaryKey="ID"dataNode="dn1,dn2,dn3"rule="mod-long"/>

        </schema>

    <dataNodename="dn1"dataHost="datahost1"database="db1"/>

    <dataNodename="dn2"dataHost="datahost2"database="db1"/>

    <dataNodename="dn3"dataHost="datahost3"database="db1"/>

    <dataHostname="datahost1"maxCon="1000"minCon="10"balance="0"

        writeType="0"dbType="mysql"dbDriver="native"switchType="1"  slaveThreshold="100">

        <heartbeat>select user()</heartbeat>

        <writeHosthost="hostM1"url="192.168.58.130:3333"user="root"password="admin">

        </writeHost>

    </dataHost>

    <dataHostname="datahost2"maxCon="1000"minCon="10"balance="0"

        writeType="0"dbType="mysql"dbDriver="native"switchType="1"  slaveThreshold="100">

        <heartbeat>select user()</heartbeat>

        <writeHosthost="hostM1"url="192.168.58.130:3334"user="root"password="admin">

        </writeHost>

     </dataHost>

    <dataHostname="datahost3"maxCon="1000"minCon="10"balance="0"

        writeType="0"dbType="mysql"dbDriver="native"switchType="1"  slaveThreshold="100">

        <heartbeat>select user()</heartbeat>

        <writeHosthost="hostM1"url="192.168.58.130:3335"user="root"password="admin">

        </writeHost>

     </dataHost>

</mycat:schema>

说明:

(1)      该文件配置了表“NUMBERS”,针对ID字段进行取模分片,该表位于三个节点dn1dn2dn3上;

(2)      分别定义三个数据主机datahost1datahost2datahost3,每个数据主机对应一个Docker数据库容器。datahost1对应db01192.168.58.130:3333),datahost2对应db02192.168.58.130:3334),datahost3对应db03192.168.58.130:3335)。配置连接用户名和密码(root/admin)。


4.3 配置rule.xml文件


Rule.xml文件主要配置数据分片规则,本文主要使用给定的取模分片规则,如下所示:

         <tableRule  name="mod-long">

                   <rule>

                            <columns>id</columns>

                            <algorithm>mod-long</algorithm>

                   </rule>

         </tableRule>

该规则针对表中的id字段进行取模分片。如果表A分片到3个数据节点,则表Aid3取模。模3值为0,模3值为1和模3值为2分别存放在3个不同的数据节点上。


5数据读写测试


数据读写测试基于标准的jdbc进行的数据记录读写测试。

5.1 编写测试程序


编写java测试程序,连接connect创建代码如下:

publicclass MySQLConnection {

    privatestaticfinal String DBUSER ="test";

    privatestaticfinal String DBPSW  ="test";

    privatestaticfinal String JDBCDRIVER ="com.mysql.jdbc.Driver";

    privatestaticfinal String JDBCDATABASE ="jdbc:mysql://192.168.58.130:8066/TESTDB";

    public Connection getConnection(){

        try{

            Class.forName(JDBCDRIVER);

            try{

                return(Connection) DriverManager.getConnection(JDBCDATABASE, DBUSER, DBPSW);

            }catch(SQLException e){

                returnnull;

            }  

            }catch(ClassNotFoundException  e1){

            returnnull;

        }

    }

}

上述代码跟普通MySQL连接代码一样,不同之处是端口使用8066数据端口进行访问。打包程序为“MyCatTest02.jar”。

5.2 写入测试


设置向NUMBERS表中插入20000条记录,插入过程如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践
插入过程中,从cmd命令窗口登录8066端口的mycat,查询NUMBERS表总记录数,如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践
插入过程中,从cmd命令窗口登录3333端口的mysql,查询NUMBERS表记录数,如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践

5.3 查询测试


使用“SELECT * FROM NUMBERS WHERE ID between 0 and 9;”从MyCat端查询出10条记录,结果没有按照ID升序排序,如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践
使用“SELECT * FROM NUMBERS WHERE ID between 0 and 9 order by ID;”从MyCat端查询出10条记录,按照ID升序排序,如下图所示

MyCat & MySQL多节点的Docker虚拟化实践
分别从db01db02db03查询NUMBERS表的10条记录,如下面三幅图所示:

MyCat & MySQL多节点的Docker虚拟化实践
MyCat & MySQL多节点的Docker虚拟化实践
MyCat & MySQL多节点的Docker虚拟化实践

5.4 删除测试


MyCat端删除记录以及清空表测试,首先使用delete语句删除id19999的记录,查询+删除如下图所示:

MyCat & MySQL多节点的Docker虚拟化实践

使用truncate语句清空表NUMBERS所有记录,如下图所示:






如何关注

①复制“Linux脚本之家"或"LinuxSheller”,在“添加朋友”中粘贴搜索关注。

②点击文章标题上方蓝色“Linux脚本之家”,即可快捷关注。

 



回复下面文章编号,即可获取往期内容:


38 ----------------------- 文本切分大法之cut命令精要

37 ----------------------- “大数据”分析之Shell实战

36 ----------------------- Linux系统下文件名提取的几大方法和技巧

35 ----------------------- Linux系统下如何高效进行文件名批量重命名?

34 ----------------------- Linux系统下环境变量大揭秘

33 ----------------------- Linux Shell自定义函数全知道

32 ----------------------- 值得您收藏的Linux系统命令tr最强锦集

31 ----------------------- 不能不学的Linux命令行参数的五种用法

30 ----------------------- Linux系统下能否使用Python实现Top风格的程序?

29 ----------------------- 如何使用Python动态控制Linux系统的内存占用百分比?

28 ----------------------- 一步一步学习使用Python脚本进行纪念币发行自动监控

27 ----------------------- Linux系统下如何使用mail、mailx进行邮件发送?

26 ----------------------- 如何用好Linux系统的输入输出、重定向和null文件?

25 ----------------------- Linux系统的强大工具expr有哪些用法?

24 ----------------------- Linux虚拟机和宿主机如何组网与互通?

23 ----------------------- 值得一看的脚本通配符&转义符

22 ----------------------- Bash脚本中字符串的判定&比较

21 ----------------------- Bash脚本中和文件属性相关的条件判断式

20 ----------------------- Linux Bash脚本流程控制之"if条件判断"

19 ----------------------- 必须掌握的Linux脚本的高级变量(二)

18 ----------------------- 必须掌握的Linux脚本的高级变量(一)

17 ----------------------- Linux系统文本模式下Dialog对话框创建与使用(2)

16 ----------------------- Linux系统文本模式下Dialog对话框创建与使用(1)

15 ----------------------- Bash Shell脚本中命令行选项/参数的使用

14 ----------------------- Bash脚本编程高级指南

13 ----------------------- bash脚本比较字符串的方法

12 ----------------------- Ex命令及该命令下表达式学习(2)

11 ----------------------- Ex命令及该命令下表达式学习(1)

10 ----------------------- Linux字符终端输出字符颜色设置

9 ----------------------- Linux系统磁盘iops检测工具fio使用

8 ----------------------- Linux系统磁盘iops检测工具fio安装

7 ----------------------- 监控Linux系统的7个命令行工具

6 ----------------------- Linux系统版本信息查看命令

5 ----------------------- AWK & GAWK使用小谈

4 ----------------------- Linux命令小技巧

3 ----------------------- 查看磁盘空间以及目录空间占用du和df

2 ----------------------- Linux日期加减

1 ----------------------- Linux压缩、解压缩浅谈


以上是关于MyCat & MySQL多节点的Docker虚拟化实践的主要内容,如果未能解决你的问题,请参考以下文章

Mysql-高可用集群[MyCat中间件使用]

MyCat - 使用篇

Haproxy+mycat+mysql集群搭建和高可用

Mycat之MySql读写分离与日志分析——主从单节点

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用

基于MYCAT中间件实现MYSQL读写分离