准备 MySQL 一个主节点与两个从节点(基于 Docker 镜像部署)
# 注意替换<Root密码>
sudo docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<Root密码> --name mysql-master mysql:5.7
sudo docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=<Root密码> --name mysql-slave-01 mysql:5.7
sudo docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=<Root密码> --name mysql-slave-02 mysql:5.7
修改主节点 MySQL 配置文件(mysql-master)
# 进入主节点容器
saisimon@saisimon:~$ sudo docker exec -it mysql-master /bin/bash
# 更新 apt-get 源并安装 vim 编辑器
apt-get update && apt-get install vim
# 编辑 MySQL 配置文件
vim /etc/mysql/my.cnf
[mysqld]
server-id=100 # 同一个组下 Server ID 需要唯一
log-bin=mysql-bin # 开启二进制日志记录
# 登录 MySQL
mysql -u root -p
# 创建 slave 用户
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '<slave 密码>';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 退出 MySQL 命令行
mysql> exit
# 退出容器
exit
# 重启 mysql-master 容器
saisimon@saisimon:~$ sudo docker restart mysql-master
# 进入 mysql-master 容器
saisimon@saisimon:~$ sudo docker exec -it mysql-master /bin/bash
# 登录 MySQL
mysql -u root -p
# 查看主节点状态,记录下 File 与 Position 的值,避免对主节点有写入的操作,否则 File 与 Position的值会发生变化
mysql> show master status;
![](https://i-blog.csdnimg.cn/blog_migrate/8288542ad7277b88fd0b718d87a7c5a0.jpeg)
# 查看是否开启了二进制日志记录,log_bin 为 ON 即为开启
show VARIABLES like '%log_bin%';
![](https://i-blog.csdnimg.cn/blog_migrate/a464190214b4d1cf28adb9818380f3ca.jpeg)
修改从节点 MySQL 配置文件(mysql-slave-01、mysql-slave-02)
# 分别进入各个从节点容器
saisimon@saisimon:~$ sudo docker exec -it mysql-slave-01 /bin/bash
# 更新 apt-get 源并安装 vim 编辑器
apt-get update && apt-get install vim
# 编辑 MySQL 配置文件
vim /etc/mysql/my.cnf
# mysql-slave-01 容器的 my.cnf 文件
[mysqld]
server-id=101 # 同一个组下 Server ID 需要唯一,多个从节点的Server ID 也需要唯一
log-bin=mysql-bin # 开启二进制日志记录(从节点可选)
# mysql-slave-02 容器的 my.cnf 文件
[mysqld]
server-id=102 # 同一个组下 Server ID 需要唯一,多个从节点的Server ID 也需要唯一
log-bin=mysql-bin # 开启二进制日志记录(从节点可选)
# 重启 mysql-slave-01 容器
saisimon@saisimon:~$ sudo docker restart mysql-slave-01
# 重启 mysql-slave-02 容器
saisimon@saisimon:~$ sudo docker restart mysql-slave-02
# 获取主节点 MySQL IP
saisimon@saisimon:~$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
# 进入 mysql-slave-01 容器
saisimon@saisimon:~$ sudo docker exec -it mysql-slave-01 /bin/bash
# 登录 MySQL
mysql -u root -p
# 添加主节点关联,注意替换<XXX>中的值
mysql> change master to master_host='<主节点 MySQL IP>', master_user='slave', master_password='<slave 密码>', master_port=<主节点 MySQL 端口>, master_log_file='<File>', master_log_pos=<Position>;
# 启动复制
mysql> start slave;
# 查看从节点状态
mysql> show slave status\G;
常见错误
- ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
# 从节点已启动复制,需要先停止复制才能修改与主节点的关联
mysql> stop slave;
- 启动从节点的复制后,查看从节点的状态,Slave_IO_Running的值一直为 Connection,需要根据 Last_IO_Error 来推断出问题原因
- 用户的名称或密码不正确
- 从节点无法连接至主节点
- File 或 Position 的值设置错误