基于Docker实现MySQL主从复制

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

版本 概述

MySQL复制数据流程:

主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事务

从库启动一个I/O线程与主库建立连接,用来请求主库中要更新的binlog。这时主库创建的binlog dump线程,这是二进制转储线程,如果有新更新的事件,就通知I/O线程;当该线程转储二进制日志完成,没有新的日志时,该线程进入sleep状态。

从库的I/O线程接收到新的事件日志后,保存到自己的relay log(中继日志)中

从库的SQL线程读取中继日志中的事件,并执行更新保存。

基于Docker实现MySQL主从复制

配置主从库 主库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文件夹

基于Docker实现MySQL主从复制

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` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建data_copy数据库和person表。

start.sh 脚本 #!/bin/sh echo '启动mysql' service mysql start sleep 5 echo '初始化数据库' mysql -uroot -pytao < /mysql/init.sql echo '初始化完成!' tail -f /dev/null 构建master和slave镜像并运行容器

构建master镜像

docker build -t master/mysql .

构建slave镜像

docker build -t slave/mysql .

构建成功会返回 Successfuly,或通过docker images命令查看镜像

基于Docker实现MySQL主从复制

使用刚构建的镜像来运行容器

# master 容器 docker run --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql # slave 容器 docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d slave/mysql

指定master端口为3306,slave端口为3307,挂载data目录为保存数据的目录。

连接到数据库后验证数据库是否初始化成功

基于Docker实现MySQL主从复制

查看 log-bin 是否开启

基于Docker实现MySQL主从复制

创建复制账号

前面有提到从库I/O线程要与主库建立连接,所以需要用到账号进行验证。账号除了要有连接权限(REPLICATION CLIENT),同时还要有复制权限(REPLICATION SLAVE)。

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%' IDENTIFIED BY 'ytao';

这里设置的访问地址是开放的,实际使用过程中安全起见一定要指定访问地址。

从库启动复制

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d975060407b2d1258335b327d5d246a9.html