基于Docker容器的MySQL 5.7主从复制最佳实践

环境准备

CentOS 7 / Docker CE V19.03.12 / Docker-Compose v1.26 / MySQL 5.7.30

复制采用传统的mysql的binlog复制技术,具体概念和细节可先参考博文

深入MySQL复制(一) - 骏马金龙 - 博客园本文非常详细地介绍MySQL复制相关的内容,包括基本概念、复制原理、如何配置不同类型的复制(传统复制)等等。在此文章之后,还有几篇文章分别介绍GTID复制、半同步复制、实现MySQL的动静分离,以及Mhttps://www.cnblogs.com/f-ck-need-u/p/9155003.html

步骤

1.创建主从数据库容器

在/tmp目录下创建docker-compose.yml

version: "3.8"
services:
  mysql:
    image: mysql:5.7
    volumes:
     - /tmp/data:/var/lib/mysql
    environment:
     - MYSQL_ROOT_PASSWORD=123456
    container_name: mysql

  mysql2:
    image: mysql:5.7
    volumes:
     - /tmp/data2:/var/lib/mysql
    environment:
     - MYSQL_ROOT_PASSWORD=123456
    container_name: mysql2

在tmp目录下输入

docker-compose up -d

docker ps查看已经成功的启动了两个mysql容器

在tmp目录下出现了data和data2目录,这两个目录分别绑定了容器mysql和mysql2的/var/lib/mysql目录。在这里我们把mysql作为主数据(master),mysql2作为从数据库(slave), 你可以用mysql命令在master创建一些表和插入一些记录,便于后面的测试,具体步骤略。

 

2.启动master

2.1启动binlog日志

在/tmp下创建一个mysql.cnf文件,内容如下

[mysqld]
log-bin=mysql-bin
server-id=1

 修改docker-compose.yml文件, 在mysql配置里增加一项volume配置 

输入 docker-compose up -d使应用生效,重新生成mysql容器

输入docker exec -it mysql sh进入容器

输入mysql -u root -p进入mysql命令行  (密码123456)

输入show master status;

如上图所示,说明binlog已启动

2.2 创建复制专用用户

在master上创建复制专用的用户

create user 'repl'@'172.%' identified by '123456';
grant REPLICATION SLAVE ON *.* to 'repl'@'172.%';

  注:使用docker inspect命令可以查看mysql的IP地址为172.20.0.2, mysql2的IP地址为172.20.0.3,因此创建用户时使用了 '172.%'通配符来匹配host。

查看已创建的repl用户, 可输入 

select * from mysql.user where user='repl'\G;

2.备份master数据到slave

2.1备份master数据

在启动slave之前,slave上必须具有master部分完整内容作为复制基准数据以及这个基准的位置。

因此需要先手动将master数据备份并还原到slave,笔者选择了xtrabackup这个工具来实现。

先下载xtrabackup工具的docker镜像

docker pull percona/percona-xtrabackup:2.4

  输入备份命令

docker run --rm --network tmp_default -v /tmp/backup:/backup --volumes-from mysql percona/percona-xtrabackup:2.4 xtrabackup --backup --port=3306 --target-dir=/backup --host=mysql --user=root --password=123456

 --network 参数是mysql,mysql2两个容器所在的docker网络环境,一般docker-compose在启动后默认会用当前目录名字加上_default创建网络,可以使用docker inspect mysql查看里面的network就是tmp_default,用这个参数是为了让xtrabackup容器与mysql在同一个网络,能够通过TCP/IP方式访问到mysql容器。

--volumes-from mysql 表示将mysql容器的volume也映射到xtrabackup容器上,这样就能访问到/var/lib/mysql目录,否则会提示报错。

实际核心命令就是

xtrabackup --backup --target-dir=/backup

运行后会出现大量的日志提示,显示正在copying....

 注:红色提示框显示的binlog文件名以及position记住了,这个后面要用到

 然后可以看到/tmp目录下生成了backup目录,这个也是上面那个命令通过volume挂载映射生成的,进入backup目录可以看到备份的数据文件

2.2 预备master数据 

备份过的数据,需要对数据进行“预备”(Prepare)操作,使数据文件完全一致,然后才能用于数据恢复及在 InnoDB 中运行。

输入预备命令

docker run --rm -v /tmp/backup:/backup percona/percona-xtrabackup:2.4 xtrabackup --prepare --target-dir=/backup

第一次预备时,会在开头有个提示:This target seems to be not prepared yet.

当完成后,最后提示completed OK!   

预备只需要执行一次即可,如果再一次运行预备命令时,会出现提示如下:

当然,多执行一次预备也不会有什么影响。

2.3 还原slave数据库

先清空slave数据库的数据目录

cd /tmp/data2
sudo rm -rf *

 输入还原命令

docker run --rm --network tmp_default -v /tmp/backup:/backup --volumes-from mysql2 percona/percona-xtrabackup:2.4 xtrabackup --copy-back --port=3306 --target-dir=/backup --datadir=/var/lib/mysql --host=mysql2 --user=root --password=123456

 会出现大量的日志提示显示正在copying....

 还原完成后,输入docker restart mysql2 来重启容器mysql2

 输入命令docker exec -it mysql2 sh 进入容器

 输入命令mysql -u root -p 进入mysql命令行

 查看数据库和表是否和mysql一样

2.启动slave

在tmp目录创建mysql2.cnf文件,内容如下

[mysqld]
relay-log=slave-bin
server-id=2

修改docker-compose.yml文件, 在mysql2配置里增加一项volume配置

 

输入 docker-compose up -d 应用设置,重新创建容器mysql2

输入docker exec -it mysql2 sh进入mysql2容器

输入mysql -u root -p 进入mysql命令行

设置master, 输入

change master to 
        master_host='mysql',
        master_port=3306,
        master_user='repl',
        master_password='123456',
        master_log_file='mysql-bin.000001',
        master_log_pos=603;

注:这里master_log_file和master_log_pos用到的就是上面备份时日志输出的信息,用红圈标出来的值。

 输入命令启动slave

start slave;

  如果要停止复制,可以输入

stop slave;

输入命令show processlist;可以看到如下信息

这个时候表示主从复制已经已启动了,只要master有数据变化,就能同步到slave数据库上。

可以输入命令,查看相关日志信息

show slave status;

现在你可以试试在master上添加或修改些数据,你会发现show master status命令显示position发生了变化,而slave数据库也出现了你在master数据库所做的修改。

参考:

深入MySQL复制(一) - 骏马金龙 - 博客园本文非常详细地介绍MySQL复制相关的内容,包括基本概念、复制原理、如何配置不同类型的复制(传统复制)等等。在此文章之后,还有几篇文章分别介绍GTID复制、半同步复制、实现MySQL的动静分离,以及Mhttps://www.cnblogs.com/f-ck-need-u/p/9155003.html

Percona XtraBackup - DocumentationPercona XtraBackup - Documentationhttps://www.percona.com/doc/percona-xtrabackup/2.4/index.html 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值