Docker MySQL MHA
基於Docker 1.13.1之上構建的MySQL MHA Docker Compose Project
可快速啟動GTID模式下的MasterHA集群, 主用於MySQL與Docker的學習研究
構建環境
- MacOS 10.12.3
- Docker 1.13.1
- Docker Compose 1.11.1
- Docker image for MySQL 5.7.17
- Docker image for Debian jessie
- mha4mysql-manager-0.56
- mha4mysql-node-0.56
特性
- USTC debian sources
- 自動生成MySQL復制賬戶與MHA工作賬戶
- 可自定義的MySQL復制與MHA工作賬戶信息
- SSH key的自動生成
- 容器間的SSH key相互復制與SSH免密登錄
- MasterHA的自啟動
構建與啟動
docker-compose.yml 定義
master
- Docker compose中名為master
的service, 主庫容器默認映射端口3406
slave_1
- Docker compose中名為slave_1
的service, 從庫容器默認映射端口3407
manager
- Docker compose中名為manager
的service, 作為MHA manager
mha_share
- 容器間的共享數據卷
目錄與文件功能說明
-
account.env
保存容器間的公用環境變量, 如MySQL復制賬戶repl的賬號密碼
-
employees_db
master
啟動時的MySQL初始化腳本 -
employees_master
master
主庫容器中的配置文件, 日志與庫存放位置 -
employees_slave_1
slave_1
從庫容器中的配置文件, 日志與庫存放位置 -
employees_share
容器間的共享數據卷
-
mha_manager
構建Docker鏡像
mha_manager
所需的Dockerfile及其依賴文件的存放目錄, 在docker-compose.yml有定義 -
mha_node
構建Docker鏡像
mha_node
所需的Dockerfile及其依賴文件的存放目錄, 在docker-compose.yml有定義 -
reset.sh
停止project並刪除所有數據庫的日志與庫(配置文件除外)
-
shutdown.sh
單純地停止project
-
start.sh
- 啟動project
- 在各個容器中生成ssh key
- 將ssh key分別復制到其他容器中, 使得容器之間都可以使用SSH免密登錄
- 使
master
與slave_1
形成復制鏈路 - 根據自定義的MySQL賬戶密碼生成MHA配置文件
- masterha_check_ssh檢測容器間的SSH正確性
- masterha_check_repl檢測復制的健康狀況
- 啟動masterha_manager並將日志寫入employees_share中的
mha.log
啟動
-
首次運行時請先初始化MySQL, 否則容器將不接受連接
➜ mha git:(master) docker-compose up -d Creating network "mha_default" with the default driver Creating mha_mha_node_1 Creating mha_mha_share_1 Creating mha_mha_manager_1 Creating mha_master_1 Creating mha_slave_1_1 Creating mha_manager_1
待容器可接收宿主機的MySQL連接代表初始化完成
-
預熱后運行start.sh腳本以構建MHA集群
➜ mha git:(master) ./start.sh >>> Docker Compose starting... Starting mha_mha_manager_1 Starting mha_mha_share_1 Starting mha_mha_node_1 mha_master_1 is up-to-date mha_slave_1_1 is up-to-date mha_manager_1 is up-to-date >>> Setting ssh... fd9686976e61 initializing SSH... fd9686976e61 change the password of root successfully. fd9686976e61 SSH service has been restarted. fd9686976e61 succeed in generating ssh key. ... fd9686976e61 copy ssh key to manager successfully. fd9686976e61 copy ssh key to master successfully. ... >>> Creating mysql user for replication named 'repl' on master container... mysql: [Warning] Using a password on the command line interface can be insecure. >>> Configuring replication with GTID mode... configuring slave_1 754214d5bdfc ... mysql: [Warning] Using a password on the command line interface can be insecure. >>> Initializing MHA configuration... mha configuration "/mha_share/application.cnf" is not initialized. added host "master" to mha configuration file. added host "slave_1" to mha configuration file. ********************************************** checking mha ssh... Wed Feb 15 11:04:08 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. ... Wed Feb 15 11:04:08 2017 - [debug] ok. Wed Feb 15 11:04:09 2017 - [info] All SSH connection tests passed successfully. ********************************************** checking mha repl to mysql... Wed Feb 15 11:04:09 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. ... MySQL Replication Health is OK. ********************************************** starting mha manager with file "/mha_share/application.cnf"... nohup: redirecting stderr to stdout >>> Done!
NOTE: 首次運行時如果不預熱而直接調用start.sh腳本的話, 則會引起MySQL未完成初始化而造成構建主從復制鏈路出錯, 如果是數據庫已經經過初始化則不需要進行預熱
注意事項
- 首次運行時請先運行
docker-compose up -d
進行MySQL的初始化 - 一個Docker Compose Service對應一個容器, 以此享用Docker Compose默認構建的容器網絡, 即可直接使用service name進行SSH通信
- 本項目僅用於學習MySQL MHA集群, 同時練習Docker的使用
- 要使用虛擬IP的話可自行搭配Keepalive, LVS等