docker部署mysql主主备份(keepalived)跨主机自动切换
docker部署mysql主主备份 haproxy代理(swarm)

主主复制即在两台MySQL主机内都可以变更数据,而且另外一台主机也会做出相应的变更。聪明的你也许已经想到该怎么实现了。对,就是将两个主从复制有机合并起来就好了。只不过在配置的时候我们需要注意一些问题,例如,主键重复,server-id不能重复等等。
两台MySQL之间互为彼此的从库,同时又是主库。这种方案,既做到了访问量的压力分流,同时也解决了“单点故障”问题。任何一台故障,都还有另外一套可供使用的服务。
主主复制----->互为主从
搭建一个两主的Mysql环境
| 从属关系 | 容器名称 | 服务器 | 端口 |
|---|---|---|---|
| 主 | mysql-master1 | 192.168.56.100 | 3306 |
| 主 | mysql-master2 | 192.168.56.101 | 3306 |
主从都需要执行
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="3306" accept"
systemctl restart firewalld.service
firewall-cmd --list-all
systemctl restart docker
mkdir -p /home/scsdm/services/mysql
vi /home/scsdm/services/mysql/docker-compose.yml
version: '3'
services:
node1:
image: mysql:5.7.23
hostname: mysql-master1
container_name: mysql-master1
restart: always
ports:
- "3306:3306"
network_mode: host
environment:
- MYSQL_ROOT_PASSWORD=hancloud1234!
- TZ=Asia/Shanghai
volumes:
- $PWD/mysql_master1/slowSql:/data/mysql
- $PWD/mysql_master1/data:/var/lib/mysql
- $PWD/mysql_master1/logs:/var/log/mysql
- $PWD/mysql_master1/conf/my.cnf:/etc/mysql/my.cnf
privileged: true
command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']
entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
mkdir -p /home/scsdm/services/mysql/mysql_master1/conf
vi /home/scsdm/services/mysql/mysql_master1/conf/my.cnf
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone=+08:00
max_connections=1000
# 开启binlog
log-bin=mysql-bin
log-bin-index=mysql-bin.index
# 服务器唯一id,默认值1
server-id=1
max_binlog_size=1G
max_binlog_cache_size=1G
# 设置日志格式,默认值ROW
binlog_format=mixed
expire_logs_days=7
# 开启慢查询
slow_query_log=1
long_query_time=2
slow_query_log_file=/data/mysql/slow.log
# 错误日志
log_error=/var/log/mysql/error.log
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mcp_manager
# 设置不需要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=infomation_schema
cd /home/scsdm/services/mysql
# my.cnf 权限不能是777,会被忽略
chmod 644 /home/scsdm/services/mysql/mysql_master1/conf/my.cnf
docker-compose up -d
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-master1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p

-- 创建slave用户
CREATE USER 'slave'@'%';
-- 设置密码
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
查看创建的用户信息
select host,user from mysql.user;

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
SHOW MASTER STATUS;
记下File和Position的值。
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

主从都需要执行
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" port protocol="tcp" port="3306" accept"
systemctl restart firewalld.service
firewall-cmd --list-all
systemctl restart docker
mkdir -p /home/scsdm/services/mysql
vi /home/scsdm/services/mysql/docker-compose.yml
version: '3'
services:
node1:
image: mysql:5.7.23
hostname: mysql-master2
container_name: mysql-master2
restart: always
ports:
- "3306:3306"
network_mode: host
environment:
- MYSQL_ROOT_PASSWORD=hancloud1234!
- TZ=Asia/Shanghai
volumes:
- $PWD/mysql_master2/slowSql:/data/mysql
- $PWD/mysql_master2/data:/var/lib/mysql
- $PWD/mysql_master2/logs:/var/log/mysql
- $PWD/mysql_master2/conf/my.cnf:/etc/mysql/my.cnf
privileged: true
command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']
entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
mkdir -p /home/scsdm/services/mysql/mysql_master2/conf
vi /home/scsdm/services/mysql/mysql_master2/conf/my.cnf
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone=+08:00
max_connections=1000
# 开启binlog
log-bin=mysql-bin
log-bin-index=mysql-bin.index
# 服务器唯一id,默认值1
server-id=2
max_binlog_size=1G
max_binlog_cache_size=1G
# 设置日志格式,默认值ROW
binlog_format=mixed
expire_logs_days=7
# 开启慢查询
slow_query_log=1
long_query_time=2
slow_query_log_file=/data/mysql/slow.log
# 错误日志
log_error=/var/log/mysql/error.log
# 设置需要复制的数据库,默认复制全部数据库
#binlog-do-db=mcp_manager
# 设置不需要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=infomation_schema
cd /home/scsdm/services/mysql
# my.cnf 权限不能是777,会被忽略
chmod 644 /home/scsdm/services/mysql/mysql_master2/conf/my.cnf
docker-compose up -d
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-master2 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p

-- 创建slave用户
CREATE USER 'slave'@'%';
-- 设置密码
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
SHOW MASTER STATUS;
记下File和Position的值。

# 配置主Mysql地址
CHANGE MASTER TO MASTER_HOST='192.168.56.100',
# 配置主Mssql创建的用于备份的用户名和密码和端口
MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,
# 配置主Mssql的binlog日志名称和当前所在位置(上面记录的位置)
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=959;
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

# 配置主Mysql地址
CHANGE MASTER TO MASTER_HOST='192.168.56.101',
# 配置主Mssql创建的用于备份的用户名和密码和端口
MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,
# 配置主Mssql的binlog日志名称和当前所在位置(上面记录的位置)
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=959;
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
stop slave;
-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;
-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;
CREATE DATABASE mcp_manager;
USE mcp_manager;
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT,
uname VARCHAR(30),
PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES('xiaohong');
INSERT INTO t_user(uname) VALUES('xiaoming');


INSERT INTO t_user(uname) VALUES('xiaohong2');
INSERT INTO t_user(uname) VALUES('xiaoming2');


tar -zcvf mysqlPackage.tar.gz ./mysqlPackage
脚本文件地址 :
链接:https://pan.baidu.com/s/1ezBfa3WDYG3-Ur3NDbLvCA
提取码:1234
前提:
将文件 mysqlPackage主主.zip上传到服务器上
unzip mysqlPackage主主.zip
修改mysqlPackage文件夹里面的install.conf配置
#安装之前需要配置如下信息
master1Ip="192.168.56.100"
master2Ip="192.168.56.101"
base_dir="/home/scsdm/services/mysql"
主1服务器
cd mysqlPackage
chmod +x install.sh
./install.sh
主1执行后到主2
主2服务器
cd /root/mysqlPackage
chmod +x installMaster2.sh
./installMaster2.sh
安装过程中如有停顿等待输入,输入yes即可

(1)在主1服务器执行下面的命令查看
docker exec -i mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_SQL_Running:"
docker exec -i mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_IO_Running:"
(2)在主2服务器执行下面的命令查看
docker exec -i mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_SQL_Running:"
docker exec -i mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_IO_Running:"