Docker 快速搭建 MySQL 5.7 主从复制环境_mysql 5.7 dockers
Docker 快速搭建 MySQL 5.7 主从复制环境
MySQL 的主从复制是实现数据备份、高可用、读写分离的关键技术之一。今天我们用 Docker 快速搭建一个 MySQL 5.7 主从复制环境,方便本地测试和学习。
环境准备
- 操作系统:CentOS / Ubuntu / WSL / Mac 均可
- Docker:已安装并启动
- MySQL 镜像:
mysql:5.7
# 拉取MySQL 5.7官方镜像docker pull mysql:5.7---## 目录结构```bash/opt/├── mysql_master/│ ├── conf/ # 主库配置│ ├── data/ # 主库数据挂载│ └── log/ # 主库日志挂载└── mysql_slave/ ├── conf/ # 从库配置 ├── data/ # 从库数据挂载 └── log/ # 从库日志挂载
创建目录并授权给 MySQL 容器使用:
mkdir -p /opt/mysql_master/{conf,data,log}mkdir -p /opt/mysql_slave/{conf,data,log}chown -R 999:999 /opt/mysql_*
配置文件(主从基本一致)
主库 /opt/mysql_master/conf/my.cnf
:
[client]# 客户端默认使用的字符集default-character-set=utf8[mysql]# mysql命令行客户端默认使用的字符集default-character-set=utf8[mysqld]# 服务器启动时初始化连接,设置字符集校对规则init_connect=\'SET collation_connection = utf8_unicode_ci\'# 服务器启动时初始化连接,设置字符集编码init_connect=\'SET NAMES utf8\'# 服务器默认字符集character-set-server=utf8# 服务器默认字符集的排序规则collation-server=utf8_unicode_ci# 跳过客户端字符集协商,强制使用服务器设置的字符集skip-character-set-client-handshake# 禁用DNS反向解析,提升连接速度skip-name-resolve# MySQL服务器唯一标识ID,主从复制时必须不同server_id=1# 启用二进制日志功能,主库必须开启log-bin=mysql-bin# 只读模式,主库一般设为0,从库设为1read-only=0# 指定只对school数据库进行二进制日志记录(只记录school数据库的变更)binlog-do-db=school# 复制过滤,忽略以下数据库的复制(避免复制系统库)replicate-ignore-db=mysqlreplicate-ignore-db=sysreplicate-ignore-db=information_schemareplicate-ignore-db=performance_schema
从库 /opt/mysql_slave/conf/my.cnf
:
[client]# 客户端默认使用的字符集default-character-set=utf8[mysql]# mysql命令行客户端默认使用的字符集default-character-set=utf8[mysqld]# 服务器启动时初始化连接,设置字符集校对规则init_connect=\'SET collation_connection = utf8_unicode_ci\'# 服务器启动时初始化连接,设置字符集编码init_connect=\'SET NAMES utf8\'# 服务器默认字符集character-set-server=utf8# 服务器默认字符集的排序规则collation-server=utf8_unicode_ci# 跳过客户端字符集协商,强制使用服务器设置的字符集skip-character-set-client-handshake# 禁用DNS反向解析,提升连接速度skip-name-resolve# 从库唯一的server_id,不能与主库相同server_id=2# 中继日志,用于记录从主库接收的二进制日志relay-log=relay-log# 从库也可以开启二进制日志,方便做多级复制或备份log-bin=mysql-slave-bin# 只读模式,从库一般设置为只读,防止误操作写入数据read-only=1# 复制过滤,忽略系统库,避免复制系统数据库内容replicate-ignore-db=mysqlreplicate-ignore-db=sysreplicate-ignore-db=information_schemareplicate-ignore-db=performance_schema
启动主库容器
docker run -p 3306:3306 \\ --name mysql_master \\ -v /opt/mysql_master/log:/var/log/mysql \\ -v /opt/mysql_master/data:/var/lib/mysql \\ -v /opt/mysql_master/conf:/etc/mysql/conf.d \\ -e MYSQL_ROOT_PASSWORD=root \\ -d mysql:5.7
主库配置
进入主库容器:
docker exec -it mysql_master bashmysql -uroot -proot
执行 SQL:
CREATE USER \'backup\'@\'%\' IDENTIFIED BY \'123456\';GRANT REPLICATION SLAVE ON *.* TO \'backup\'@\'%\';FLUSH PRIVILEGES;SHOW MASTER STATUS;
记住 File
和 Position
(如 mysql-bin.000001
, 154
)
启动从库容器
docker run -p 3307:3306 \\ --name mysql_slave \\ -v /opt/mysql_slave/log:/var/log/mysql \\ -v /opt/mysql_slave/data:/var/lib/mysql \\ -v /opt/mysql_slave/conf:/etc/mysql/conf.d \\ -e MYSQL_ROOT_PASSWORD=root \\ --link mysql_master:mysql_master \\ -d mysql:5.7
--link
会在容器内创建主库的别名mysql_master
,用于网络通信
配置从库复制
连接从库:
mysql -h 127.0.0.1 -P 3307 -uroot -proot
执行复制配置 SQL:
CHANGE MASTER TO MASTER_HOST=\'mysql_master\', MASTER_USER=\'backup\', MASTER_PASSWORD=\'123456\', MASTER_LOG_FILE=\'mysql-bin.000001\', MASTER_LOG_POS=154, MASTER_PORT=3306;START SLAVE;SHOW SLAVE STATUS\\G
确认两个关键字段是 Yes
:
Slave_IO_Running: YesSlave_SQL_Running: Yes
清算效果
在主库执行:
CREATE DATABASE school;USE school;CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(20));INSERT INTO test VALUES (1, \'hello slave\');
然后在从库查看是否同步:
USE school;SELECT * FROM test;
如果能查到,说明主从配置成功!
常见问题排查
999:999
,my.cnf 配置是否正确Slave_IO_Running
或 Slave_SQL_Running
为 No
SHOW SLAVE STATUS\\G
最底部 Last_IO_Error
/ Last_SQL_Error
小结
你现在已经学会:
- 使用 Docker 构建 MySQL 主从环境
- 掌握基本主从配置参数
- 成功实现主从数据同步
这是后续实现读写分离、负载均衡、灾处备份的基石。
如果这篇文章对你有帮助,欢迎点一下赞或收藏!