基于Docker如何实现MySQL主从复制详解

论坛 期权论坛 脚本     
niminba   2021-5-23 04:43   1206   0

前言

MySQL的主从复制是实现应用的高性能,高可用的基础。对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力。当遇到MySQL单点故障中,也能在短时间内实现故障切换。本文就MySQL的内建的复制功能进行阐述。

版本

  • MySQl: 5.7.17
  • CentOS: 7.4.1708
  • Docker: 1.13.1

概述

MySQL复制数据流程:

  1. 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事务
  2. 从库启动一个I/O线程与主库建立连接,用来请求主库中要更新的binlog。这时主库创建的binlog dump线程,这是二进制转储线程,如果有新更新的事件,就通知I/O线程;当该线程转储二进制日志完成,没有新的日志时,该线程进入sleep状态。
  3. 从库的I/O线程接收到新的事件日志后,保存到自己的relay log(中继日志)中
  4. 从库的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` XXXMKMKMJN^Z[[]\X[[Y\\X[]\X[XX[]]^\K]^YX][\[N[]X[^YX][X[]X[B."gh!:/k]W[[Y\]WS[[Y\"d9m+c9.+xB[[OHb#9iyl9k[BBi9g*9..+y;9%b(:fi9. 9.*l9k`:+g#..9l9kc%BBd$y..9. 9hyl9kB]\HHBH\H\BSS]WX\
YX
HSQT		[NOB]Bkl9kmiz/ixBB[OH^X[Y\[Y[HYHZ[YZZ[Z[[^][KNKNMNYNMMXY[OH\NL\]Y[Z[N	][XXZZI][\\X[Y\\Y]K\XX[\X\X^][NN]Y

LK
LK
LJNY[\[NX[^X[YYY[Y[YX\\[Y[]\\XX[Y[YXXMKMKMJN^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.+ 
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP