前言
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-bin
server-id = 1
注意server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项。
从库my.cnf配置
log-bin = mysql-bin
server-id = 2
log-slave-updates = 1
read-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.17
ENV MYSQL_ROOT_PASSWORD ytao
COPY start.sh /mysql/start.sh
COPY my.cnf /etc/mysql/my.cnf
COPY init.sql /mysql/init.sql
EXPOSE 3306
CMD ["sh", "/mysql/start.sh"]
这里的master和slave都是基于同一个镜像构建,使用的存储引擎和其他的组件最好是同一中,不然在复制过程中可能会出现异常。
init.sql 初始化数据
-- 创建 data_copy 数据库
DROP DATABASE IF EXISTS `data_copy`;
CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */;
-- 创建 person 表
USE `data_copy`;
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int(32) NOT NULL,
`name` XXXMKMKMJN^Z[[]\X[[Y\\X[]\X[XX[]]^\K]^YX][\[N[]X[^YX][X[]X[B."gh!:/k]W[[Y\]WS[[Y\"d9m+c9.+xB[[OHb#9iyl9k[BBi9g*9..+y;9%b(:fi9. 9.*l9k`:+g#..9l9kc%BBd$y..9. 9hyl9kB]\HHBH\H\BSS]WX\
Y[YX
HSQT [NOB]Bkl9kmiz/ixBB[OH^X[Y\[Y[HYHZ[YZZ[Z[[^][KNKNMNYNMMXY[OH\NL\]Y[Z[N ][XXZZI][\\X[Y\\Y]K\XX[\X\X^][NN]Y
LK
LK
LJNY[\[NX[^X[YYY[Y[YX\\[Y[]\\XX[Y[YXXMKMKMJN^Z[[]\X[[Y\\X[]\X[XX[]]^\K]^YX][\[N[]X[^YX][X[]X[B[[OH.[BB."/+9cey 9g+9acy/a+"ghacy/",yc.yk!ykb-.#yd#9yb;k. 9..#9..#yb-....%..((yo#byiy`BB^T9i#yb-&oy/o9ceyy/a.g 9.:g :)y$y.*9/o+z/c:).#z #ybyfj9o n.9`g9h.+yhi#{l9kd#9iynby/oyg*:`a9i)!e9g*:(c9.&.+ym9)zgh'"*:)9.+zeyb8Bioy.."l,y+9aj:`yky.n#9&ykyk)9ki.h9% !ymg9am 9kc h9./;,(,(i)/c.+ |