史上最详细Docker安装Mycat中间件 | 实现主从的读写分离

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 史上最详细Docker安装Mycat中间件 | 实现主从的读写分离

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

上一篇写了如何使用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

1704459792281.jpg

1704459796421.jpg

三、下载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

1704459827149.jpg

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

1704459830244.jpg

mycat.tar.gz进行解压

tar -zxvf mycat.tar.gz

1704459833675.jpg

此时目录结构: 1704459838807.jpg

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

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

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

1704459862847.jpg

四、编写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/mycat
ADD mycat.tar.gz /usr/local
#容器数据卷,用于数据保存和持久化工作
#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹
VOLUME /usr/local/mycat
WORKDIR /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文件在执行打包命令的目录下

1704459862847.jpg

六、编写Mycat配置文件

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

cd /usr/local/mycat/conf/ ls #展示文件

1704459867399.jpg

重点文件就是标红的三个

  • schema.xml、server.xml :用于读写分离,在我们这个小Demo中,只对schema.xml做了编辑。
  • rule.xml:用于分表分库配置文件。
  • 详情请查询相关官方文档。

编辑schema.xml文件:

vim schema.xml

默认文件内容:

1704459894420.jpg

删除不必要的,改成下面这样的即可。1704459898027.jpg

<?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属性,也是通过此属性配置读写分离的类型:
  • balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
  • balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,
  • balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
  • balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
  1. writeType="0": 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
  2. switchType="1":
  • 1 默认值,自动切换。
  • -1 表示不自动切换
  • 基于 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 #查看运行日志

1704459927201.jpg

八、连接测试

8.1、Navicat连接

可使用Navicat或者CMD命令行。 1704459935839.jpg

关于这里的账号和密码

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

1704459939344.jpg

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

1704459951249.jpg

8.2、CMD连接

mysql -uroot -p123456 -h IP地址 -P 8066

1704459962487.jpg

8.3、读写分离测试

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

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

主机

1704459964894.jpg

从机

1704459980186.jpg

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

mycat读取1704459988912.jpg

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

九、自言自语

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

参考:

Docker构建Mycat(单节点)

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
5月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
3月前
|
关系型数据库 数据库 PostgreSQL
docker 安装 Postgres 17.6
本文介绍如何通过Docker安装和配置PostgreSQL 17.6。内容包括拉取镜像、导出配置文件、运行容器并挂载数据与配置文件目录,以及进入容器使用psql操作数据库的完整步骤,便于持久化管理和自定义配置。
473 3
docker 安装 Postgres 17.6
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
526 5
|
2月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
390 2
|
8月前
|
存储 安全 C++
Odoo 安装方式选择:源码安装 vs Docker
Odoo部署常采用源码编译或Docker容器化,但分别面临依赖复杂、版本风险和服务化难题,以及镜像臃肿和扩展受限的问题。Websoft9提出混合方案,融合两者优势:通过智能环境适配、三阶段部署流程(环境预检、混合模式选择、持久化配置)及声明式YAML配置,实现高效、灵活的双模运行时。此方案显著降低依赖冲突解决时间(从83分钟至0),生产环境构建耗时缩短至8分钟,并达100% CVE漏洞修复率,适合ERP定制开发与规模化部署的企业需求。
|
6月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
774 4
|
5月前
|
Linux Docker Windows
windows docker安装报错适用于 Linux 的 Windows 子系统必须更新到最新版本才能继续。可通过运行 “wsl.exe --update” 进行更新。
适用于 Linux 的 Windows 子系统需更新至最新版本(如 wsl.2.4.11.0.x64.msi)以解决 2025 年 Windows 更新后可能出现的兼容性问题。用户可通过运行 “wsl.exe --update” 或访问提供的链接下载升级包进行更新。
2091 0