# 容器化部署:MySQL主从复制原理与Docker实战
MySQL主从复制是构建高可用架构的基石,通过将主库的数据变更同步到从库,实现读写分离和数据备份。结合Docker容器技术,开发者可以在统一环境中快速搭建完整的复制集群,深入理解其运行机制。
## 复制架构的核心原理
MySQL主从复制的本质是二进制日志(Binlog)的同步过程。主库(Master)将所有数据变更操作写入Binlog文件,从库(Slave)通过I/O线程读取这些日志并写入本地的中继日志(Relay Log),最后由SQL线程重放日志中的操作。这一过程中,三个线程协同工作:主库的Binlog Dump线程负责发送日志,从库的I/O线程负责接收和存储,SQL线程负责应用。
主从复制支持多种模式以适应不同场景。异步复制下主库不等待从库确认,性能最优但可能存在数据延迟;半同步复制要求至少一个从库确认收到日志后才提交事务,在性能与一致性间取得平衡;同步复制则需要所有从库都完成写入,数据最为可靠但延迟最高。生产环境中常采用异步或半同步模式,配合监控机制管理复制延迟。
## Docker环境下的主从搭建
使用Docker容器化部署可以避免多服务器配置的复杂性,通过容器名称即可实现网络通信。首先创建专用的Docker网络,使容器能够相互发现:
```bash
docker network create mysql-net
```
启动主库容器时,需通过命令行参数启用Binlog并设置唯一的server-id:
```bash
docker run -d --name mysql-master \
--network mysql-net \
-e MYSQL_ROOT_PASSWORD=root123 \
-v /data/mysql-master:/var/lib/mysql \
mysql:5.7 \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=row
<"q2.p5k3.org.cn"><"t5.p5k3.org.cn"><"i1.p5k3.org.cn">
```
从库容器需要配置server-id和中继日志,并设置为只读模式以防范意外写入:
```bash
docker run -d --name mysql-slave \
--network mysql-net \
-e MYSQL_ROOT_PASSWORD=root123 \
-v /data/mysql-slave:/var/lib/mysql \
mysql:5.7 \
--server-id=2 \
--relay-log=mysql-relay-bin \
--read->
```
## 配置主从同步关系
在主库中创建专用于复制的用户,授予REPLICATION SLAVE权限:
```sql
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
```
查看主库当前的Binlog文件名和偏移量位置,这些信息将用于从库的同步起点配置:
```sql
SHOW MASTER STATUS;
-- 记录File和Position的值,例如 mysql-bin.000003 和 154
```
进入从库容器,使用CHANGE MASTER TO命令指定主库连接信息和同步起点:
```sql
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl123',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;
START SLAVE;
```
## 验证与监控复制状态
通过SHOW SLAVE STATUS命令确认复制是否正常运行,重点关注两个关键指标:
```sql
SHOW SLAVE STATUS\G
-- 确保 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes
-- Seconds_Behind_Master 表示复制延迟时间,0表示完全同步
<"o8.p5k3.org.cn"><"l0.p5k3.org.cn"><"c4.p5k3.org.cn">
```
若IO线程未运行,需检查网络连通性和复制用户权限;若SQL线程停止,则可能因主从数据冲突导致,可通过设置slave_skip_errors参数跳过指定错误。
验证同步功能时,在主库创建测试表并插入数据,观察从库是否实时同步:
```sql
-- 在主库执行
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT, name VARCHAR(50));
INSERT INTO users VALUES (1, 'docker');
-- 在从库查询
USE testdb;
SELECT * FROM users; -- 应能看到相同数据
```
## 应用场景与注意事项
读写分离是主从复制最常见的应用场景,应用程序将写操作发往主库,读操作分发到从库,有效降低主库负载。从库也可用作数据备份源,避免备份操作影响主库性能。在主库发生故障时,可将从库提升为新主库,实现高可用切换。
部署时需注意容器时间同步问题,主从节点系统时间差异会导致Seconds_Behind_Master计算不准确。大事务可能引起复制延迟,建议拆分批量操作为小批次提交。若需要从库之间级联复制,需配置log_slave_updates参数使从库生成自己的Binlog。
从单机容器到主从集群,Docker降低了MySQL复制架构的搭建门槛。通过亲手实践这一过程,开发者能够更深入地理解Binlog流转机制与同步线程的协作方式,为生产环境的高可用设计积累经验。