MySQL MHA(Master High Availability)是目前相对成熟的一个MySQL高可用解决方案。
这篇文章主要介绍用Docker Compose编排MySQL MHA高可用集群的实践过程。
Docker Compose编排中使用了两个现有镜像,分别是breeze2/mha4mysql-manager和breeze2/mha4mysql-node,这两个镜像的相关信息可以查看《制作mha4mysql的Docker镜像》。
本次实践源码上传在GitHub的breeze2/mysql-mha-docker。
Docker Compose编排
这个编排主要实现一主一备一从的MySQL MHA高可用集群。
目录结构
1 | L--mysql-mha-docker //主目录 |
docker-compose.yml
1 | version: "2" |
这里配置了四个容器服务,一个breeze2/mha4mysql-manager
,负责管理各个数据库结点;三个breeze2/mha4mysql-node
,其中一个是主库,一个是备用主库(兼作从库),还有一个是(纯)从库。每个容器服务都指定了静态IP,即使服务重启也不会出现IP错乱问题。
环境参数
parameters.env
1 | ROOT_PASSWORD=123456 |
数据库配置
这里简单的配置一下各个数据库数据复制备份相关的参数
主库,mha_node0/conf/my.cnf
1 | [mysqld] |
备库,mha_node1/conf/my.cnf
1 | [mysqld] |
从库,mha_node2/conf/my.cnf
1 | [mysqld] |
MHA配置
manager/conf/app1.conf
1 | [server default] |
实际运行
在主目录下执行docker-compose up -d
构建并运行整个Docker服务。
SSH设置
MHA要求各个主机能够相互SSH登录,所以整体服务首次启动成功后,在主目录下先执行一些命令:
1 | $ sh ./scripts/ssh_start.sh |
ssh_start.sh
作用是在各个容器上开启SSH服务,ssh_share.sh
作用是在容器内生成SSH公密钥,再把公钥共享到其他容器。常用命令调用的脚本在scripts
和volumes/mha_share/scripts
下,这些脚本都很简单,一看就明。
若是整体服务重新启动,只需重新开启SSH服务即可:
1 | $ sh ./scripts/ssh_start.sh |
在manager容器上检测SSH是否配置成功:
1 | $ docker exec -it mha_manager /bin/bash |
若是成功,会显示
1 | Mon Oct 16 14:53:59 2017 - [debug] ok. |
开启数据主从复制
首先对主库、备考创建和授权复制账号,对备库、从库设置主库信息和开始复制,以下命令会完成这些操作:
1 | $ sh ./scripts/mysql_set_mbs.sh |
可以在主库上的testing数据库里创建一张表,写入一些数据,看看备库、从库会不会同步。
在manager容器上检测REPL是否配置成功:
1 | $ docker exec -it mha_manager /bin/bash |
若是成功,会显示
1 | Mon Oct 16 15:01:35 2017 - [info] Got exit code 0 (Not master dead). |
开启MHA监控
SSH和REPL检测没问题后,可以在manager容器上开启MHA监控:
1 | $ docker exec -it mha_manager /bin/bash |
masterha_manager
进程会一直监视主库状态是否可用,若是主库宕机,masterha_manager
会将备库与从库的Relay Log进行比较,把最新的数据整合到备库,然后把备库提升为新主库,从库跟随复制新主库,最后masterha_manager
进程会退出,不再监控。
我们可以在本地(Docker宿主)暂停主库(mha_node0容器):
1 | $ docker pause mha_node0 |
然后,manager容器上masterha_manager
确认主库失联后,开始切换主库,成功后会显示:
1 | ----- Failover Report ----- |
可以到从库(mha_node2容器),查看复制状态,可以看到跟随主库是10.5.0.11,即新主库(原备库):
1 | $ docker exec -it mha_manager /bin/bash |
最后
在数据库服务器集群中,使用MHA,可以在主库宕机后快速切换新主库,可是应用服务器并不知道主库已经被切换。所以,masterha_manager
进程切换主库成功后应该通知应用服务器新的主库IP,或者使用虚拟IP静默过渡。若是应用与数据库通过中间件(比如ProxySQL)来连接的,那么只需在中间件上修改主库IP,对应用影响不大。
注意:因为本compose中MySQL服务与SSH服务没有同一启动(SSH服务是容器启动后才开启的),所以本compose只能当作线下模拟练习,未能在正式线上应用。比如其中某个结点容器重启,SSH服务并没有自动重启,进而整个MHA集群不可用。