基于Docker实现MySQL主从复制

前言

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-binserver-id = 1

注意server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项。

从库my.cnf配置

log-bin = mysql-binserver-id = 2log-slave-updates = 1read-only = 1

从库也开启log-binlog-slave-updates设置为从库重放中继日志时,记录到自己的二进制日志中,可以让从库作为其他服务器的主库,将二进制日志转发给其他从库,在做一主多从方案时可考虑该种方案。

Dockerfile构建MySQL镜像

构建所需文件

这里masterslave文件各自保存不共用,先创建文件夹 /usr/local/mysql 然后在目录创建masterslave两个目录,再各自创建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", "/mysql/start.sh"]

这里的masterslave都是基于同一个镜像构建,使用的存储引擎和其他的组件最好是同一中,不然在复制过程中可能会出现异常。

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/shecho '启动mysql'service mysql startsleep 5echo '初始化数据库'mysql -uroot -pytao < /mysql/init.sqlecho '初始化完成!'tail -f /dev/null

构建masterslave镜像并运行容器

构建master镜像

docker build -t master/mysql .

构建slave镜像

docker build -t slave/mysql .

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

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

# 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目录为保存数据的目录。

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

查看 log-bin 是否开启

创建复制账号

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

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

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

从库启动复制

从库连接到主库,获取到二进制日志后重放。这里首先要配置上面创建的账号进行连接,使用命令进行相应的设置。

CHANGE MASTER TO MASTER_HOST = '47.107.xx.xxx',MASTER_PORT = 3306,MASTER_USER = 'muser',MASTER_PASSWORD = 'ytao',MASTER_LOG_FILE = 'mysql-bin.000006';

到这里复制还没有启动,需要再从库中启动

START SLAVE;

使用SHOW SLAVE STATUS\G;命令查看启动后的情况

上面标记的输出信息Slave_IO_Running: YesSlave_SQL_Running: Yes可以看到I/O线程和SQL线程已启动运行中。

测试同步数据

如果在主库中添加,更新或删除一个数据,那么从库中应该也有与主库对应的数据变化。
向主库添加一条数据

INSERT INTO `data_copy`.`person` (`id`, `name`) VALUES ('1', 'ytao');

查询从库数据,数据已被同步过来。

总结

上述是最简单最基本的配置,但是理解上面的配置过程,就可以根据自身情况定制不同方案,实现一主多从,主主复制(主动-主动或主动-被动模式)等等来满足自身需求。
MySQL的复制虽然使用简单方便,但也伴随着一些问题需要我们在使用中进行解决,比如:不能从服务器异常停止中恢复,数据同步的延迟等等,还好现在遇到的大部分问题在行业中已得到相应的解决。对这方面感兴趣的可以去了解下现在解决这些问题的中间件实现方案。

个人博客: https://ytao.top
我的公众号 ytao

(0)

相关推荐

  • mysql主从复制

    一.主从复制简介 2015年5月28日11时,12小时后恢复,损失:平均每小时106.48W$ 1)高可用 2)辅助备份 3)分担负载 复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到 ...

  • 什么是MySQL主从复制读写分离,看这篇就够了

    思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 前言 在很多项目,特别是互联网项目,在使用MySQL时都会 ...

  • 面试被问MySQL 主从复制,怎么破?

    一.前言 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作. 此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求 ...

  • MySQL主从复制的实现过程

    一.什么是主从复制 将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数据库保持一致. 基本原理: MySQL支持单向.异步复制 ...

  • MySQL主从复制配置步骤如何操作?linux运维

    MySQL的主从复制是一个异步的复制过程,数据将从一个MySQL数据库(Master)复制到另一个MySQL数据库(Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完 ...

  • Linux系统环境基于Docker搭建Mysql数据库服务实战

    开放端口规划: mysql-develop:3407 mysql-test: 3408 mysql-release: 3409 ps: 1.不推荐使用默认端口-3306,建议自定义端口 2.如果采用阿 ...

  • Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  • Docker实战之MySQL主从复制

    前言 曾几何时,看着高大上的架构和各位前辈高超的炫技,有没有怦然心动,也想一窥究竟?每当面试的时候,拿着单应用的架构,吹着分库分表的牛X,有没有心里慌的一批? 其实很多时候,我们所缺少的只是对高大上的 ...

  • MySQL主从复制应用场景有哪些?怎样才能学好linux

    MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,同时有效地保护了物理服务器宕机场景的数据备份.那么MySQL主从复制的企业应用场景有哪些?Linux运维工作人员要注意什么? ...

  • Docker 安装MySQL 5.7

    首先已经安装好了docker应用: 1.查看docker仓库中的mysql命令 ➜  ~ docker search mysql NAME                              D ...

  • MySQL主从复制集群—gtid实现详解

    老哥唠叨 上一篇发了MySQL主从复制集群搭建流程,不过好像小伙伴们对这个文章并不感兴趣,但是老哥出于对技术的热爱,和对小伙伴们的负责,我还是要写主从复制另一种实现方式:GTID.这些技术真的蛮重要的 ...

  • MySQL主从复制集群搭建—binlog二进制文件方式

    老哥絮叨 上篇文章我们大致介绍了什么是MySQL主从复制,主从复制的几种集群架构图大概都有哪几种,今天我们就来讲讲如何实现MySQL集群的搭建.主从复制有两种方式可以实现,binlog和GTID,这期 ...