Docker上部署MySQL主从复制
Date: 2021-01-24
- 实现一主两从的MySQL架构;
- 当前实战是在Mac上实现的,如果是Windows,挂在的目录需要注意一下,使用D:/xxx/yyy。
- 背景:搭建MySQL一主多从目的是为了搭建可靠的Nacos集群,需要搭建一主多从MySQL数据库;
- 在此基础上,了解 Docker的挂在技术;MySQL的主从复制底层原理binlog文件;MySQL的6个log文件及各自功能;
1、拉取镜像并创建容器
docker pull mysql:5.7
## 一般情况下,需要将配置文件和data目录挂载在宿主机上,因此首先在宿主机创建好目录,
## /Users/zhaohong/Documents/study_test/mysql
## ①配置文件(创建个空文件):/conf/mysql.cnf /conf/mysql_01.cnf /conf/mysql_02.cnf
## ②数据目录:/data /data_02 /data_02
## mysql容器默认的配置文件目录:/etc/mysql/mysql.cnf (注意my.cnf是个链接,请使用mysql.cnf)
## mysql容器默认的数据目录:/var/lib/mysql
## master
docker run -d --privileged=true
-v /Users/zhaohong/Documents/study_test/mysql/conf/mysql.cnf:/etc/mysql/mysql.cnf
-v /Users/zhaohong/Documents/study_test/mysql/data:/var/lib/mysql
--name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
## mysql_01 第一个slave
docker run -d --privileged=true
-v /Users/zhaohong/Documents/study_test/mysql/conf/mysql_01.cnf:/etc/mysql/mysql.cnf
-v /Users/zhaohong/Documents/study_test/mysql/data_01:/var/lib/mysql
--name mysql_01 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
## mysql_02 第二个slave
docker run -d --privileged=true
-v /Users/zhaohong/Documents/study_test/mysql/conf/mysql_02.cnf:/etc/mysql/mysql.cnf
-v /Users/zhaohong/Documents/study_test/mysql/data_01:/var/lib/mysql
--name mysql_02 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
## 查看所有的容器
docker ps
2、修改配置文件并重启容器
这次配置MySQL主从复制的目的是搭建可靠的Nacos服务,因此首选需要创建nacos数据库,将创建表的语句导入即可。
nacos-mysql.sql : https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
# master mysql.cnf
[mysqld]
port=3306
server-id=1
log-bin=mysql-bin
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-do-db=nacos
# slave mysql_01.cnf
[mysqld]
port=3306
server-id=2
log-bin=mysql-bin
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
replicate-do-db=nacos
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
# slave mysql_02.cnf
[mysqld]
port=3306
server-id=3
log-bin=mysql-bin
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
replicate-do-db=nacos
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
重启容器:
docker restart mysql
docker restart mysql_01
docker restart mysql_02
docker ps #查看容器
## 3、主从MySQL建立连接
## mysql mater 对slave授权(master username:root,password:root)
GRANT FILE ON *.* TO 'root'@'从机IP' IDENTIFIED BY '连接密码';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'从机IP' IDENTIFIED BY '连接密码';
FLUSH PRIVILEGES;
## 对第1个slave授权 172.17.0.3
GRANT FILE ON *.* TO 'root'@'172.17.0.3' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.0.3' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
## 对第2个slave授权 172.17.0.4
GRANT FILE ON *.* TO 'root'@'172.17.0.4' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.0.4' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
```
## 查看下master状态
show master status;
show variables like 'log_bin';
show binary logs;
## mysql slave 连接master(两个slave均执行相同命令)
stop slave;
change master to master_host='172.17.0.2', master_user='root', master_password='root',
master_log_file='mysql-bin.000001', master_log_pos=2044;
start slave;
## 查看slave状态,从信息中可以看出是否成功,若失败,可看出失败原因
show slave status;
一切OK之后,就可以验证一下。DDL、DML语句均会同步,如创建表格、删除表格、表格增加字段、update、insert、delete等。
## 4、 配置说明
### (1) binlog文件
- 默认情况下binlog是关闭状态;
查看binlog是否开启:
show variables like ‘log_bin’; ## OFF/ON
show binary logs; - 开启binlog
## 在配置文件mysql.cnf中,配置log-bin=xxx即开启binlog日志;
log-bin=mysql-bin #{datadir}/mysql-bin.000001.log
## 或者指定绝对路径
log-bin=/var/lib/Mysql-binlog/mysql-bin - binlog文件以xxxx.000001… xxx.000003等编号文件,当前文件xxxx.index。
### (2) mysql.cnf配置说明
log-bin=mysql-bin ##开启bin-log;
server-id=1 ##集群每个实例唯一标志;
binlog-ignore-db=mysql ##忽略的数据库;
binlog-do-db=nacos ##需要执行binlog的数据库;
## slave
replicate-do-db=nacos ##需要复制同步数据的数据库;
slave-skip-errors=all ##跳过所有同步错误;
slave-net-timeout=60
### (3) binlog文件大小限制
## log-bin文件太多,占用空间,可以指定过时时间及大小。
log-bin = /usr/local/var/mysql/logs/mysql-bin
expire-logs-days = 14
max-binlog-size = 500M
### (4) 遇到的问题
① MySQL主从复制遭遇 'Misconfigured master - server id was not set'
问题:今天在配主从复制时,遇到从库的IO ERROR,提示如下
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - server id was not set'
原因及解决办法:每个实例都需要指定唯一的server-id,注意不要指定为0,需要从1开始,重启即可。
② MySQL无法重启Warning: World-writable config file ‘/etc/mysql/my.cnf’ is ignored
https://blog.csdn.net/qilovehua/article/details/45508925
root@cd196102c70b:/# mysql -uroot -p
mysql: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
Enter password:
问题分析:根据提示可知,配置文件是全局可写,任何一个用户都可以写。mysql担心这种文件被其他用户恶意修改,所以忽略掉这个配置文件,这样mysql无法关闭。
解决办法:查看my.cnf文件权限:
ls -l /etc/mysql/my.cnf
-rwxrwxrwx 权限777,任何一个用户都可以修改my.cnf,存在很大隐患。
chmod 644 /etc/mysql/my.cnf
然后重启mysql,不会再报Warning,配置文件就生效了。