环境:Ubuntu19.10,Docker19.03.2,MySQL5.7
首先我们把 MySQL 镜像拉下来
docker pull mysql:5.7
然后 docker run 先把 master 跑起来
docker run --name mysql-master -d -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --server-id=1 --log-bin=mysql-bin
- --name 容器名为了方便区分,设置为 mysql-master
- -p 33306:3306 映射 3306 端口到本地 33306 端口
- -e MYSQL_ROOT_PASSWORD=root 设置 root 密码为 root
- --server-id=1 标示数据库的唯一编号
- --log-bin=mysql-bin 设置二进制日志文件的名称
可以看到 master 已经跑起来了

然后开始创建从库
docker run --name mysql-node1 --link mysql-master:master -d -p 33308:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --server-id=2 --log-bin=mysql-bin
跟主库稍微有区别的是使用了 --link 参数,用来链接 master 主库,mysql-master:master,前面是容器名称,后面的是别名,到时候使用两个名称都可以连接到数据库。
可以看到从数据库也跑起来了

然后进入 master 数据库进行配置
docker exec -it mysql-master /bin/bash
root@d3306271a64e:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
首先新建一个用于同步的用户,密码也使用 root
GRANT replication slave ON *.* TO 'slave'@'%' IDENTIFIED BY 'root';

把 File 和 Position 的值记录下来,然后就不要操作 master 数据库了,防止数据发生变化。接下来操作 slave 数据库
docker exec -it mysql-node1 /bin/bash
root@746663bc40e2:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
首先停止主从复制
mysql> stop slave;
然后修改配置
mysql> change master to
-> master_host="mysql-master", # 逗号不要忘了
-> master_user="slave", # 主库的用户名
-> master_password="root", # 主库的密码
-> master_log_file="mysql-bin.000003", # 二进制日志文件的名称
-> master_log_pos=438; # 当前日志所记录的 Position 的值
然后打开主从复制,查看是否同步成功
mysql> start slave;
mysql> show slave status\G;

看到 Slave_IO_Running 和 Slave_SQL_Running 状态都是 Yes 且没有其他报错,可以判断成功了,接下来可以验证一下。
在 master 里新建一个数据库 test_db
mysql> CREATE DATABASE test_db;

然后就能在 slave 数据库查询到同步成功了

主从同步完成
- Tips: 如果还需要第二个 slave 节点,需要在添加第一个节点后立即添加,一定要保证 master 数据库没有发生改动,否则会连接失败
Comments | NOTHING