MyCat & MySQL多节点的Docker虚拟化实践
Posted Linux脚本之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyCat & MySQL多节点的Docker虚拟化实践相关的知识,希望对你有一定的参考价值。
1背景介绍
MyCat多数据库节点的Docker虚拟化实践,主要创建三个mysql数据库容器和一个MyCat数据路由容器,然后通过MyCat进行数据记录的读取和写入操作。由于MyCat在Docker官方Hub网站上没有镜像文件,故需要创建一个MyCat镜像文件。组件架构如下图所示:
2数据库容器部署
本实践使用标准的MySQL镜像“mysql:5.6.29”,数据库版本是“5.6.29 MySQL Community Server (GPL)”。创建三个容器实例:db01,db02和db03。三个数据库容器,其属性如下表所示:
特性项目 |
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容器,如下图所示:
创建三个MySQL容器对象db01,db02和db03,对应端口分别为3333,3334,3335。从客户端进行mysql命令登录,登录过程分别如下图(登录端口3333示例)所示:
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”创建镜像。 |
解压缩目录内容如下图所示:
修改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/”目录下面;向外暴露两个端口8066和9066;“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镜像如下图所示:
镜像制作完成,可以导出为tar文件,共享给其他人。镜像文件导出和导入命令分别是“docker save”和“docker load”。完整命令如下所示:
导出 |
docker save yinwq/mycat:1.4 > mycat.tar |
导入 |
docker load < mycat.tar |
导出文件mycat.tar如下图所示:
4MyCat容器部署
Mycat镜像制作完成后,使用“docker run”命令创建容器对象mycat01,命令如下所示:
docker run --name mycat01 -d -p 8066:8066 -p 9066:9066 yinwq/mycat:1.4 |
命令返回“77e96b24b313…”容器ID。
注意:上述命令中为两对端口进行了映射,8066和9066两对端口。
如果容器mycat01没有运行,使用命令“docker start mycat01”将mycat启动。然后在客户端对端口8066和9066进行连接测试,如下图(连接端口8066示例)所示:
根据上图,能够得出创建的mycat容器启动成功。但是mycat容器还没有对三个数据库容器进行访问配置。启动三个数据库容器db01,db02和db03进行mycat01容器的配置。命令如下所示:
[root@localhost ~]# docker start db01 db02 db03 db01 db02 db03 |
此时启动了mycat01,db01,db02和db03一共四个容器,其端口映射如下图所示:
退出mycat01容器,进行数据库节点的配置。主要修改三个配置文件:server.xml、schema.xml和rule.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字段进行取模分片,该表位于三个节点dn1,dn2和dn3上;
(2) 分别定义三个数据主机datahost1,datahost2和datahost3,每个数据主机对应一个Docker数据库容器。datahost1对应db01(192.168.58.130:3333),datahost2对应db02(192.168.58.130:3334),datahost3对应db03(192.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个数据节点,则表A的id对3取模。模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条记录,插入过程如下图所示:
插入过程中,从cmd命令窗口登录8066端口的mycat,查询NUMBERS表总记录数,如下图所示:
插入过程中,从cmd命令窗口登录3333端口的mysql,查询NUMBERS表记录数,如下图所示:
5.3 查询测试
使用“SELECT * FROM NUMBERS WHERE ID between 0 and 9;”从MyCat端查询出10条记录,结果没有按照ID升序排序,如下图所示:
使用“SELECT * FROM NUMBERS WHERE ID between 0 and 9 order by ID;”从MyCat端查询出10条记录,按照ID升序排序,如下图所示
分别从db01,db02,db03查询NUMBERS表的10条记录,如下面三幅图所示:
5.4 删除测试
从MyCat端删除记录以及清空表测试,首先使用delete语句删除id为19999的记录,查询+删除如下图所示:
使用truncate语句清空表NUMBERS所有记录,如下图所示:
回复下面文章编号,即可获取往期内容:
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虚拟化实践的主要内容,如果未能解决你的问题,请参考以下文章