环境: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 数据库没有发生改动,否则会连接失败


且乐生前一杯酒