├── .gitignore ├── README.md ├── docker-compose.yml ├── parameters.env ├── scripts ├── mha_check_repl.sh ├── mha_check_ssh.sh ├── mha_start_manager.sh ├── mysql_set_mbs.sh ├── ssh_share.sh └── ssh_start.sh ├── services ├── mha4mysql-manager │ └── Dockerfile └── mha4mysql-node │ └── Dockerfile └── volumes ├── mha_manager ├── conf │ └── app1.conf └── work │ └── app1.failover.complete ├── mha_node0 └── conf │ └── my.cnf ├── mha_node1 └── conf │ └── my.cnf ├── mha_node2 └── conf │ └── my.cnf └── mha_share └── scripts ├── mysql_grant_slave.sh ├── mysql_start_slave.sh ├── ssh_auth_keys.sh └── ssh_generate_key.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | Thumbs.db 3 | volumes/*/lib -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mysql-mha-docker 2 | mysql mha docker compose 3 | 4 | ## Usage 5 | 6 | 1. download 7 | ```cmd 8 | $ cd /tmp 9 | $ git clone https://github.com/breeze2/mysql-mha-docker.git 10 | $ cd mysql-mha-docker 11 | 12 | ``` 13 | 14 | 2. run containers 15 | ```cmd 16 | $ docker-compose up -d 17 | 18 | ``` 19 | 20 | 3. start ssh service in all containers 21 | ```cmd 22 | $ sh ./scripts/ssh_start.sh 23 | 24 | ``` 25 | 26 | 4. copy ssh public key to each container 27 | ```cmd 28 | $ sh ./scripts/ssh_share.sh 29 | 30 | ``` 31 | 32 | 5. check mha ssh 33 | ```cmd 34 | $ sh ./scripts/mha_check_ssh.sh 35 | 36 | ``` 37 | 38 | 6. set mysql replication (master, backup and slave) 39 | ```cmd 40 | $ sh ./scripts/mysql_set_mbs.sh 41 | ``` 42 | 43 | 7. check mha repl 44 | ```cmd 45 | $ sh ./scripts/mha_check_repl.sh 46 | 47 | ``` 48 | 49 | 8. start mha manager 50 | ```cmd 51 | $ sh ./scripts/mha_start_manager.sh 52 | 53 | ``` 54 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | services: 3 | 4 | master: 5 | image: breeze2/mha4mysql-node:0.57 6 | container_name: mha_node0 7 | restart: always 8 | mem_limit: 256m 9 | networks: 10 | net1: 11 | ipv4_address: 10.5.0.10 12 | ports: 13 | - "33060:3306" 14 | volumes: 15 | - "./volumes/mha_share/:/root/mha_share/" 16 | - "./volumes/mha_node0/lib/:/var/lib/mysql/" 17 | - "./volumes/mha_node0/conf/:/etc/mysql/conf.d/" 18 | env_file: 19 | - ./parameters.env 20 | environment: 21 | - CONTAINER_NAME=mha_node0 22 | 23 | slave1: 24 | image: breeze2/mha4mysql-node:0.57 25 | container_name: mha_node1 26 | restart: always 27 | depends_on: 28 | - master 29 | mem_limit: 256m 30 | networks: 31 | net1: 32 | ipv4_address: 10.5.0.11 33 | ports: 34 | - "33061:3306" 35 | volumes: 36 | - "./volumes/mha_share/:/root/mha_share/" 37 | - "./volumes/mha_node1/lib/:/var/lib/mysql/" 38 | - "./volumes/mha_node1/conf/:/etc/mysql/conf.d/" 39 | env_file: 40 | - ./parameters.env 41 | environment: 42 | - CONTAINER_NAME=mha_node1 43 | slave2: 44 | image: breeze2/mha4mysql-node:0.57 45 | container_name: mha_node2 46 | depends_on: 47 | - master 48 | restart: always 49 | mem_limit: 256m 50 | networks: 51 | net1: 52 | ipv4_address: 10.5.0.12 53 | ports: 54 | - "33062:3306" 55 | volumes: 56 | - "./volumes/mha_share/:/root/mha_share/" 57 | - "./volumes/mha_node2/lib/:/var/lib/mysql/" 58 | - "./volumes/mha_node2/conf/:/etc/mysql/conf.d/" 59 | env_file: 60 | - ./parameters.env 61 | environment: 62 | - CONTAINER_NAME=mha_node2 63 | 64 | manager: 65 | image: breeze2/mha4mysql-manager:0.57 66 | container_name: mha_manager 67 | depends_on: 68 | - master 69 | - slave1 70 | - slave2 71 | restart: always 72 | mem_limit: 256m 73 | networks: 74 | net1: 75 | ipv4_address: 10.5.0.9 76 | volumes: 77 | - "./volumes/mha_share/:/root/mha_share/" 78 | - "./volumes/mha_manager/conf:/etc/mha" 79 | - "./volumes/mha_manager/work:/usr/local/mha" 80 | entrypoint: "tailf /dev/null" 81 | env_file: 82 | - ./parameters.env 83 | environment: 84 | - CONTAINER_NAME=mha_manager 85 | networks: 86 | net1: 87 | driver: bridge 88 | ipam: 89 | config: 90 | - subnet: 10.5.0.0/16 91 | gateway: 10.5.0.1 92 | -------------------------------------------------------------------------------- /parameters.env: -------------------------------------------------------------------------------- 1 | ROOT_PASSWORD=123456 2 | MYSQL_ROOT_PASSWORD=123456 3 | MYSQL_DATABASE=testing 4 | MYSQL_User=testing 5 | MYSQL_PASSWORD=testing 6 | MHA_SHARE_SCRIPTS_PATH=/root/mha_share/scripts 7 | MHA_SHARE_SSHKEYS_PATH=/root/mha_share/sshkeys 8 | -------------------------------------------------------------------------------- /scripts/mha_check_repl.sh: -------------------------------------------------------------------------------- 1 | docker exec -it mha_manager masterha_check_repl --conf=/etc/mha/app1.conf -------------------------------------------------------------------------------- /scripts/mha_check_ssh.sh: -------------------------------------------------------------------------------- 1 | docker exec -it mha_manager masterha_check_ssh --conf=/etc/mha/app1.conf -------------------------------------------------------------------------------- /scripts/mha_start_manager.sh: -------------------------------------------------------------------------------- 1 | docker exec -it mha_manager masterha_manager --conf=/etc/mha/app1.conf -------------------------------------------------------------------------------- /scripts/mysql_set_mbs.sh: -------------------------------------------------------------------------------- 1 | docker exec -it mha_node0 /bin/bash /root/mha_share/scripts/mysql_grant_slave.sh 2 | docker exec -it mha_node1 /bin/bash /root/mha_share/scripts/mysql_grant_slave.sh 3 | docker exec -it mha_node1 /bin/bash /root/mha_share/scripts/mysql_start_slave.sh 4 | docker exec -it mha_node2 /bin/bash /root/mha_share/scripts/mysql_start_slave.sh -------------------------------------------------------------------------------- /scripts/ssh_share.sh: -------------------------------------------------------------------------------- 1 | docker exec -it mha_node0 /bin/bash /root/mha_share/scripts/ssh_generate_key.sh 2 | docker exec -it mha_node1 /bin/bash /root/mha_share/scripts/ssh_generate_key.sh 3 | docker exec -it mha_node2 /bin/bash /root/mha_share/scripts/ssh_generate_key.sh 4 | docker exec -it mha_manager /bin/bash /root/mha_share/scripts/ssh_generate_key.sh 5 | 6 | docker exec -it mha_node0 /bin/bash /root/mha_share/scripts/ssh_auth_keys.sh 7 | docker exec -it mha_node1 /bin/bash /root/mha_share/scripts/ssh_auth_keys.sh 8 | docker exec -it mha_node2 /bin/bash /root/mha_share/scripts/ssh_auth_keys.sh 9 | docker exec -it mha_manager /bin/bash /root/mha_share/scripts/ssh_auth_keys.sh 10 | 11 | 12 | -------------------------------------------------------------------------------- /scripts/ssh_start.sh: -------------------------------------------------------------------------------- 1 | docker exec -it mha_node0 /bin/bash service ssh start 2 | docker exec -it mha_node1 /bin/bash service ssh start 3 | docker exec -it mha_node2 /bin/bash service ssh start 4 | docker exec -it mha_manager /bin/bash service ssh start 5 | -------------------------------------------------------------------------------- /services/mha4mysql-manager/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM breeze2/mha4mysql-manager:0.57 2 | 3 | ENV ROOT_PASSWORD 123456 4 | RUN echo "root:$ROOT_PASSWORD" | chpasswd \ 5 | && sed -i "s/PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config \ 6 | && sed -i "s/PermitRootLogin without-password/PermitRootLogin yes/" /etc/ssh/sshd_config 7 | -------------------------------------------------------------------------------- /services/mha4mysql-node/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM breeze2/mha4mysql-node:0.57 2 | 3 | ENV ROOT_PASSWORD 123456 4 | RUN echo "root:$ROOT_PASSWORD" | chpasswd \ 5 | && sed -i "s/PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config \ 6 | && sed -i "s/PermitRootLogin without-password/PermitRootLogin yes/" /etc/ssh/sshd_config -------------------------------------------------------------------------------- /volumes/mha_manager/conf/app1.conf: -------------------------------------------------------------------------------- 1 | [server default] 2 | user=root 3 | password=123456 4 | ssh_user=root 5 | 6 | manager_workdir=/usr/local/mha 7 | remote_workdir=/usr/local/mha 8 | 9 | repl_user=myslave 10 | repl_password=myslave 11 | 12 | [server0] 13 | hostname=10.5.0.10 14 | 15 | [server1] 16 | hostname=10.5.0.11 17 | 18 | [server2] 19 | hostname=10.5.0.12 -------------------------------------------------------------------------------- /volumes/mha_manager/work/app1.failover.complete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/breeze2/mysql-mha-docker/2dcd29996a9ecade0eeda96434180c998368bdfa/volumes/mha_manager/work/app1.failover.complete -------------------------------------------------------------------------------- /volumes/mha_node0/conf/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | server-id=1 3 | log-bin=mysql-bin 4 | binlog-do-db=testing 5 | binlog-ignore-db=mysql 6 | replicate-do-db=testing 7 | replicate-ignore-db=mysql 8 | auto_increment_increment=2 9 | auto_increment_offset=1 10 | expire_logs_days=7 -------------------------------------------------------------------------------- /volumes/mha_node1/conf/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | server-id=2 3 | log-bin=mysql-bin 4 | binlog-do-db=testing 5 | binlog-ignore-db=mysql 6 | replicate-do-db=testing 7 | replicate-ignore-db=mysql 8 | auto_increment_increment=2 9 | auto_increment_offset=2 10 | expire_logs_days=7 -------------------------------------------------------------------------------- /volumes/mha_node2/conf/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | server-id=3 3 | replicate-do-db=testing 4 | replicate-ignore-db=mysql 5 | expire_logs_days=7 -------------------------------------------------------------------------------- /volumes/mha_share/scripts/mysql_grant_slave.sh: -------------------------------------------------------------------------------- 1 | mysql -u root -p$MYSQL_ROOT_PASSWORD < /root/.ssh/authorized_keys -------------------------------------------------------------------------------- /volumes/mha_share/scripts/ssh_generate_key.sh: -------------------------------------------------------------------------------- 1 | ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa 2 | cp /root/.ssh/id_rsa.pub "$MHA_SHARE_SSHKEYS_PATH/id_rsa_$CONTAINER_NAME.pub" --------------------------------------------------------------------------------