前言
MySQL的主从复制是实现应用的高性能,高可用的基础。对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力。当遇到MySQL单点故障中,也能在短时间内实现故障切换。本文就MySQL的内建的复制功能进行阐述。
版本
- MySQl: 5.7.17
- CentOS: 7.4.1708
- Docker: 1.13.1
概述
MySQL复制数据流程:
- 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事务
- 从库启动一个I/O线程与主库建立连接,用来请求主库中要更新的binlog。这时主库创建的binlog dump线程,这是二进制转储线程,如果有新更新的事件,就通知I/O线程;当该线程转储二进制日志完成,没有新的日志时,该线程进入sleep状态。
- 从库的I/O线程接收到新的事件日志后,保存到自己的relay log(中继日志)中
- 从库的SQL线程读取中继日志中的事件,并执行更新保存。
配置主从库
主库my.cnf配置
在主库的my.cnf中打开二进制日志,并设置服务Id。
log-bin = mysql-binserver-id = 1
注意server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项。
从库my.cnf配置
log-bin = mysql-binserver-id = 2log-slave-updates = 1read-only = 1
从库也开启log-bin,log-slave-updates设置为从库重放中继日志时,记录到自己的二进制日志中,可以让从库作为其他服务器的主库,将二进制日志转发给其他从库,在做一主多从方案时可考虑该种方案。
Dockerfile构建MySQL镜像
构建所需文件
这里master和slave文件各自保存不共用,先创建文件夹 /usr/local/mysql 然后在目录创建master和slave两个目录,再各自创建data文件夹
- data 目录用来保存数据文件的目录
- Dockerfile 保存Dockerfile内容
- init.sql 初始化数据库的SQL
- my.cnf 数据库配置文件,配置方式上面已提到
- start.sh Dockerfile构建MySQL时的脚本
Dockerfile 内容
# 利用 mysql 镜像创建新的镜像FROM mysql:5.7.17ENV MYSQL_ROOT_PASSWORD ytaoCOPY start.sh /mysql/start.shCOPY my.cnf /etc/mysql/my.cnf COPY init.sql /mysql/init.sqlEXPOSE 3306CMD ["sh