上一篇写了如何使用Docker搭建Mysql的主从复制,这篇文章是在已经搭建好Mysql的主从复制的基础上实现读写分离的。 直接CV也能搭建起来,莫慌。
我们一起加油!!!
只要有docker的环境就欧克了。
mkdir /usr/local/mycat/conf -p
mkdir /usr/local/docker/mycat/ -p
然后cd到/usr/local/docker/mycat
目录下
cd /usr/local/docker/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 目录下
可以看到已经复制成功了。
依旧是在/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文件在执行打包命令的目录下
跳转到/usr/local/mycat/conf/
目录下(就是我们之前将配置文件复制去的那个目录)
cd /usr/local/mycat/conf/ ls #展示文件
重点文件就是标红的三个
编辑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
做几点简单说明:
补充-命令模式下的快速删除
:
按下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 #查看运行日志
可使用Navicat
或者CMD
命令行。
关于这里的账号和密码:
是在之前提到过的server.xml
配置文件中。
我的连接上是这样的,因为我已经搭建起了主从复制,里面也有表,所以是这样的。
mysql -uroot -p123456 -h IP地址 -P 8066
我们在主机中insert一句insert into mytable values(99,@@hostname)
,这样就可以看出问题了。
从机在复制这条语句去执行的时候,和出现和主机不一样的数据(有混合配置可以处理,我这里没有处理,主要产生于函数),这样我们再使用mycat去读取数据,就可以看到是否实现读写分离了。
主机:
从机:
从机取到的数据是不一样的。
mycat读取:
可以看到读取的是从机上的数据,可以说明我们确实已经实现了读写分离啦。
我其实真的非常好奇,一个真正高可用的系统要用多少个服务器😂。
写出来蛮久了,但是这方面看的人少,就一直留着自己在玩。