写点什么

Docker 安装 Mycat 中间件 | 实现主从 & 读写分离

作者:宁在春
  • 2022 年 7 月 20 日
  • 本文字数:2310 字

    阅读完需:约 8 分钟

Docker安装Mycat中间件 | 实现主从&读写分离

上一篇写了如何使用Docker搭建Mysql的主从复制,这篇文章是在已经搭建好 Mysql 的主从复制的基础上实现读写分离的。

直接 CV 也能搭建起来,莫慌。

我们一起加油!!!

一、创建 Mycat 文件夹

mkdir /usr/local/mycat/conf -p
复制代码

二、创建 Docker 文件夹

mkdir /usr/local/docker/mycat/ -p
复制代码


然后 cd 到/usr/local/docker/mycat 目录下


cd /usr/local/docker/mycat
复制代码



三、下载 Mycat 并解压

在这个目录下(/usr/local/docker/mycat)下载 Mycat


wget http://dl.mycat.org.cn/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
复制代码



Mycat-server-1.6.7.1-release-20190627191042-linux重命名为mycat


mv Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz mycat.tar.gz
复制代码



mycat.tar.gz进行解压


tar -zxvf mycat.tar.gz
复制代码



此时目录结构:



为了不破坏原来的文件,我们将 mycat 的配置文件复制到/usr/local/mycat下。


cp -r mycat/conf/ /usr/local/mycat # 当前文件夹下mycat/conf/ 复制到 /usr/local/mycat 目录下  
复制代码


可以看到已经复制成功了。


四、编写 Dockerfile 文件

依旧是在/usr/local/docker/mycat目录下进行操作:


vim dockerfile
复制代码


dockerfile文件内容:


#基于openjdk:8 创建镜像,#如果是基于centos或其他的,必须保证已安装了JDK,否则就需要在Dockerfile文件中也ADD进来FROM openjdk:8
#将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包#将mycat解压到/usr/local目录中,得到 /usr/local/mycatADD mycat.tar.gz /usr/local
#容器数据卷,用于数据保存和持久化工作#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹VOLUME /usr/local/mycatWORKDIR /usr/local/mycat
#用来在构建镜像过程中设置环境变量ENV MYCAT_HOME=/usr/local/mycat
#暴露出MyCat的所需端口EXPOSE 8066 9066
#以前台进程的方式启动MyCat服务CMD ["/usr/local/mycat/bin/mycat", "console","&"]
复制代码

五、打包镜像

docker build -t mycat:1.6 . #注意最后的小数点 .   点代表dockerfile文件在执行打包命令的目录下 
复制代码


六、编写 Mycat 配置文件

跳转到/usr/local/mycat/conf/ 目录下(就是我们之前将配置文件复制去的那个目录)


cd /usr/local/mycat/conf/ ls #展示文件
复制代码



重点文件就是标红的三个


  • schema.xml、server.xml :用于读写分离,在我们这个小 Demo 中,只对 schema.xml 做了编辑。

  • rule.xml:用于分表分库配置文件。

  • 详情请查询相关官方文档。


编辑schema.xml文件:


vim schema.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" dataNode="dn1">            </schema>    <dataNode name="dn1" dataHost="localhost1" database="testdb" />            <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">                        <heartbeat>select user()</heartbeat>                        <writeHost host="hostM1" url="47.113.227.254:3310" user="root"                                   password="123456">                                    <readHost host="hostS2" url="47.113.227.254:3311" user="root" password="123456" />                </writeHost>            </dataHost></mycat:schema>
复制代码


关于schema.xml做几点简单说明:


  1. dataHost 下的 balance 属性,也是通过此属性配置读写分离的类型:

  2. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。

  3. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,

  4. balance="2",所有读操作都随机的在 writeHost、readhost 上分发。

  5. balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力

  6. writeType="0": 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个

  7. switchType="1":

  8. 1 默认值,自动切换。

  9. -1 表示不自动切换

  10. 基于 MySQL 主从同步的状态决定是否切换。




补充-命令模式下的快速删除


按下insert键后-->再按下Esc进入命令模式。


  • dd即删除光标当前所在行。

  • ndd(n 表示你输入的数字)表示删除包括光标所在行开始后的 n 行。

七、启动镜像

docker run --name mycat -p 8066:8066 -p 9066:9066 -v /usr/local/mycat/conf/:/usr/local/mycat/conf/ -v /usr/local/mycat/logs/:/usr/local/mycat/logs/ -d mycat:1.6
复制代码


docker ps -a #查看容器docker logs mycat #查看运行日志
复制代码


八、连接测试

8.1、Navicat 连接

可使用Navicat或者CMD命令行。



关于这里的账号和密码


是在之前提到过的server.xml配置文件中。



我的连接上是这样的,因为我已经搭建起了主从复制,里面也有表,所以是这样的。


8.2、CMD 连接

mysql -uroot -p123456 -h IP地址 -P 8066
复制代码


8.3、读写分离测试

我们在主机中 insert 一句insert into mytable values(99,@@hostname),这样就可以看出问题了。


从机在复制这条语句去执行的时候,和出现和主机不一样的数据(有混合配置可以处理,我这里没有处理,主要产生于函数),这样我们再使用 mycat 去读取数据,就可以看到是否实现读写分离了。


主机



从机



从机取到的数据是不一样的。


mycat 读取



可以看到读取的是从机上的数据,可以说明我们确实已经实现了读写分离啦。

九、自言自语

我其实真的非常好奇,一个真正高可用的系统要用多少个服务器😂。


参考:


Docker构建Mycat(单节点)

发布于: 刚刚阅读数: 2
用户头像

宁在春

关注

还未添加个人签名 2022.07.01 加入

还未添加个人简介

评论

发布
暂无评论
Docker安装Mycat中间件 | 实现主从&读写分离_Docker_宁在春_InfoQ写作社区