环境准备
CentOS 7 / Docker CE V19.03.12 / Docker-Compose v1.26 / MySQL 5.7.30
复制采用传统的mysql的binlog复制技术,具体概念和细节可先参考博文
步骤
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数据库所做的修改。
参考: