本来想记录一下用Docker构建MySQL MHA集群的实践过程的,但是整个篇幅有点长,所以这里先来介绍一下怎样制作mha4mysql的Docker镜像。
mha4mysql是日本工程师Yoshinori Matsunobu开发的一款MySQL高可用软件。mha4mysql分为两部分,一是管理器部分mha4mysql-manager,二是结点部分mha4mysql-node。mha4mysql-node要运行在每台受管理的MySQL服务器上;而mha4mysql-manager所在服务器则不需要MySQL,但需要mha4mysql-node。因为mha4mysql-manager依赖mha4mysql-node,即安装mha4mysql-manager前必须先安装mha4mysql-node。
下面讲解一下,基于debian:jessie制作mha4mysql-manager的Docker镜像和
基于mysql:5.7制作mha4mysql-node的Docker镜像。
mha4mysql-manager
mha4mysql-manager的Dockerfile:
1 | FROM debian:jessie |
注释:
- 基于debian:jessie镜像二次制作;
- 将mha4mysql-manager和mha4mysql-node的当前最新版本(v0.57)打包,复制到镜像内;
build_deps
是mha4mysql-manager和mha4mysql-node的安装依赖、运行依赖;- 先拆包安装mha4mysql-node,安装命令:
perl Makefile.PL && make && make install
; - 才能拆包安装mha4mysql-manager,安装命令:
perl Makefile.PL && make && make install
; - 清理一些无用文件。
mha4mysql-node
mha4mysql-node的Dockerfile:
1 | FROM mysql:5.7 |
注释:
- 基于mysql:5.7镜像二次制作;
- 将mha4mysql-node的当前最新版本(v0.57)打包,复制到镜像内;
build_deps
是mha4mysql-node的安装依赖、运行依赖;- 拆包安装mha4mysql-manager,安装命令:
perl Makefile.PL && make && make install
; - 清理一些无用文件。
注意
v0.57 bug
目前mha4mysql-manager和mha4mysql-node的v0.57并不兼容,新版的libdbd-mysql-perl的调用语法,比如新版要求连接数据库格式是:my $dsn = "DBI:mysql:;host=$opt{host};port=$opt{port}";
而v0.57源码是:my $dsn = "DBI:mysql:;host=[$opt{host}];port=$opt{port}";
多了一对中括号会导致连接数据库失败。
这里镜像中的mha4mysql-manager和mha4mysql-node的源码包是已经对上面问题进行修正的。
单容器多服务
按照Docker的思想,是一个容器只做一件事,但是mha4mysql结点需要mysql服务和ssh服务,这里的临时解决办法是容器先运行mysql服务,之后执行docker exec -it $CONTAINER_NAME /bin/bash service ssh start
。
目前实现Dokcer单容器多服务的hack方法是利用supervisor,只做supervisor这一件事,而supervisor做多件事。如果后期真的需要使用supervisor,也可以基于本镜像进行二次制作。
最后
mha4mysql-manager和mha4mysql-node的Dockerfile分别放在GitHubbreeze2/mha4mysql-manager-docker和breeze2/mha4mysql-node-docker上;镜像可以用docker命令直接拉取:
1 | $ docker pull breeze2/mha4mysql-manager:0.57 |