Docker环境搭建keepalived+mysql主从复制高可用
mysql docker keepalived 高可用
概述
目的
为解决Mysql数据库单点问题,实现两台MySQL数据库互为主备,双向replication。当一Master出现问题,则将Slave切换为Master继续工作。
环境说明
序号
服务器IP
用途
备注
1
172.19.0.2
主机A
Master
2
172.19.0.3
主机B
Slave
3
172.19.0.110
VIP
切换原理和过程
Keepalived可实现将虚拟IP地址在实体物理机上来回漂移。Keepalived在转换状态时会依照状态来呼叫配置文件中内置的定义。
当进入Master状态时会呼叫notify_master定义的脚本
当进入Backup状态时会呼叫notify_backup定义的脚本
当keepalived程序终止时呼叫notify_stop定义的脚本
当发现异常情况时进入Fault状态呼叫notify_fault定义的脚本
切换的过程如下:
1)在Master主机上keepalived运行时执行mycheck.sh脚本不停的检查mysql的运行状态,当发现mysql停止后将keepalived进程杀掉。
2)此时Slave主机上会接管虚拟IP地址,并调用notify_master定义的脚本
3)当原Master主机上的mysql和keepalived进程恢复正常后,会调用notify_backup定义的脚本,此时数据库的主端还在Savle主机上。
4)回切,关闭Slave端的keepavlied进程,会调用notify_stop脚本,同时Master主机上会调用notify_master定义的脚本。此时数据库的主端在Master主机上
5)启动Slave端的keepavlied进程,会调用notify_backup脚本,此时完成数据同步。
docker-compose配置Mysql主从高可用
文件列表
├── docker-compose.yml
└── mysql
├── master
│ ├── config
│ │ ├── keepalived.conf
│ │ ├── my.cnf
│ │ └── mysqlenv
│ ├── data
│ └── init
├── slave
│ ├── config
│ │ ├── keepalived.conf
│ │ ├── my.cnf
│ │ └── mysqlenv
│ ├── data
│ └── init
├── scripts
│ ├── master
│ │ └── logs
│ ├── slave
│ │ └── logs
│ ├── mybackup.sh
│ ├── mycheck.sh
│ ├── mymaster.sh
│ ├── mystop.sh
docker-compose.yml文件说明(文件内容)
创建mysql-master和mysql-slave容器的配置文件
#创建并启动容器
#docker-compose up -d
#登陆Master
#docker exec -it mysql-master /bin/bash
注意:docker宿主机需安装keepalived和ipvsadm,否则容器中的keepalived服务无法正常启动
#在宿主机中执行以下指令安装keepalived和ipvsadm
#yum install -y keepalived ipvsadm
#ipvsadm --save > /etc/sysconfig/ipvsadm
#echo 1 > /proc/sys/net/ipv4/ip_forward
#systemctl enable ipvsadm
#systemctl start ipvsadm
#开机启动需配置net.ipv4.ip_forward=1到/etc/sysctl.conf
切换脚本说明
检查脚本mycheck(文件内容)
检查mysql运行状态,如果运行正常,退出。如果运行不正常调用pkill keepalived
切换脚本mymaster(文件内容)
先判断同步复制是否执行完成,如果未执行完成等待1分钟后,停止同步(stop slave),并且记录切换后的日志和pos
回切脚本mybackup(文件内容)
清空slave配置,重新获取远程日志文件及Pos,并开启同步
停止脚本mystop(文件内容)
设置参数保证数据不丢失,最后检查看是否还有写操作,最后1分钟退出
文件详情
docker-compose
docker-compose.yml
version: '3'
services:
mysql-master:
image: 'oracle/mysql:5.7'
hostname: master
restart: always
container_name: mysql-master
privileged: true
volumes:
- ./mysql/master/data:/var/lib/mysql
- ./mysql/scri