安装 docker

具体步骤可以参考官网文档 https://docs.docker.com/engine/install/,根据不同的系统进行选择,我这里用的是 WSL2 加 docker desktop 版本

下载 MySQL 镜像,我这里用的是 5.7.29 版本

  1. `docker pull mysql:5.7.29`

创建存储 MySQL 数据的 volume

  1. docker volume create mysql1data
  2. docker volume create mysql1conf
  3. docker volume create mysql1log
  4. docker volume create mysql2data
  5. docker volume create mysql2conf
  6. docker volume create mysql2log

创建完毕之后可以查看一下是否创建成功
docker volume ls
image.png

启动数据库

分别执行以下命令

  1. docker run --name mysql1 -d -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql1log:/var/log/mysql -v mysql1data:/var/lib/mysql -v mysql1conf:/etc/mysql mysql:5.7.29
  2. docker run --name mysql2 -d -p 33062:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql2log:/var/log/mysql -v mysql2data:/var/lib/mysql -v mysql2conf:/etc/mysql mysql:5.7.29

参数解释

  • —name 指定容器名称
  • -d 在后台运行,返回容器id
  • -e 设置环境变量,目前用到的是设置数据库密码
  • -v 设置磁盘挂载,左边是主机,右边是容器内目录

    设置 MySQL Replication

    新建配置文件 my.cnf

    查看 volume 所在路径
    docker volume inspect mysql1conf
    image.png
    进入 Mounpoint 的路径,新建 my.cnf 文件,内容如下:

mysql1conf :

  1. [mysqld]
  2. #服务id号,不要出现重复
  3. server_id = 1
  4. #需要记录 binlog 的库
  5. binlog-do-db = ifutures_ymd
  6. # 存储同步数据,开启bin-log日志,记录数据库的操作
  7. log-bin = mysql-bin
  8. #不需要与主库同步的库
  9. replicate-ignore-db = mysql
  10. replicate-ignore-db = sys
  11. replicate-ignore-db = information_schema
  12. replicate-ignore-db = performance_schema
  13. #确保 binlog 日志写入后与硬盘同步
  14. sync_binlog = 1
  15. !includedir /etc/mysql/conf.d/
  16. !includedir /etc/mysql/mysql.conf.d/

mysql2conf :

  1. [mysqld]
  2. #服务id号,不要出现重复
  3. server_id = 2
  4. # 存储同步数据,开启bin-log日志,记录数据库的操作
  5. log-bin=mysql-bin
  6. #需要记录 binlog 的库
  7. binlog-do-db = ifutures_ymd
  8. #不需要与主库同步的库
  9. replicate-ignore-db=mysql
  10. replicate-ignore-db=sys
  11. replicate-ignore-db=information_schema
  12. replicate-ignore-db=performance_schema
  13. #确保 binlog 日志写入后与硬盘同步
  14. sync_binlog=1
  15. !includedir /etc/mysql/conf.d/
  16. !includedir /etc/mysql/mysql.conf.d/

重启容器

  1. docker stop mysql1 mysql2
  2. docker start mysql1 mysql2

设置mysql1

进入容器内部

docker exec -it mysql1 bash
参数解释

  • -i 打开一个标准输入接口
  • -t 分配一个虚拟终端

image.png

进入 MySQL 操作界面

mysql -u root -p
输入密码后进入
image.png

创建备服务器用于登录主服务器同步数据的用户

Grant replication slave on *.* to 'tongbu'@'%' identified by '123456';

查看 mysql2 master 状态

Show master status;

image.png
若出现上述截图中的状态,说明主服务器配置成功。记住上面两个值,后面会用到。

创建主从同步

  1. stop slave; #执行同步前,要先关闭slave
  2. change master to
  3. master_host='172.24.200.148', #主库地址,这里可以填 docker 宿主机ip
  4. master_port=33062, #同步端口,可以填写宿主机映射端口
  5. master_user='tongbu',
  6. master_password='123456',
  7. master_log_file='mysql_bin.000005',
  8. master_log_pos=154;
  9. set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; #与主服务event对齐
  10. start slave ; #启动备服务
  11. Show slave status\G # 查看同步状态

若出现下红色框中的状态,即配置成功。
image.png

设置mysql2

进入到 mysql 操作界面

同上

创建备服务器用于登录主服务器同步数据的用户

Grant replication slave on *.* to 'tongbu'@'%' identified by '123456';

查看 mysql1 master 状态

Show master status;
image.png
若出现上述截图中的状态,说明主服务器配置成功。记住上面两个值,后面会用到。

创建主从同步

  1. stop slave; #执行同步前,要先关闭slave
  2. change master to
  3. master_host='172.24.200.148', #主库地址,这里可以填 docker 宿主机ip
  4. master_port=33061, #同步端口,可以填写宿主机映射端口
  5. master_user='tongbu',
  6. master_password='123456',
  7. master_log_file='mysql_bin.000004',
  8. master_log_pos=154;
  9. set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; #与主服务event对齐
  10. start slave ; #启动备服务
  11. Show slave status\G # 查看同步状态

若出现下红色框中的状态,即配置成功。
image.png

注意

  1. host 如果配的是宿主机的 ip 需要配的是主机的映射端口

    host 如果配的是容器的 ip,需要配的是 3306 端口
    查看容器 ip 的方式
    docker inspect mysql1|grep IPA

    验证

    可通过分别在两个服务中插入或修改一条数据,查看备数据库中是否发生同样的变化。