MySQL主从部署与配置详解

# MySQL主从部署与配置详解

## 主从复制原理

### 复制架构
– **主库(Master)**: 接受写操作,记录二进制日志
– **从库(Slave)**: 从主库复制二进制日志,执行中继日志,保持数据同步

### 复制过程
1. **主库写入**: 主库执行写操作,记录到二进制日志(Binlog)
2. **从库请求**: 从库的I/O线程向主库请求二进制日志
3. **主库发送**: 主库的Binlog Dump线程发送二进制日志到从库
4. **从库接收**: 从库的I/O线程接收二进制日志,写入中继日志(Relay Log)
5. **从库执行**: 从库的SQL线程执行中继日志中的SQL语句

### 复制类型
– **基于语句的复制(SBR)**: 复制SQL语句
– **基于行的复制(RBR)**: 复制行的更改
– **混合复制(MBR)**: 结合SBR和RBR的优点

## 主从部署准备

### 环境准备
– **硬件要求**: 主库需要更高的配置,从库配置可略低
– **网络要求**: 主从之间网络连接稳定,延迟低
– **软件要求**: 主从MySQL版本尽量一致,至少从库版本不低于主库

### 配置准备
1. **主库配置文件(my.cnf)**: 启用二进制日志,设置服务器ID
2. **从库配置文件(my.cnf)**: 设置服务器ID,启用中继日志
3. **防火墙设置**: 开放主库3306端口

## 主库配置

### 基本配置
“`ini
# 启用二进制日志
log-bin=mysql-bin
# 设置服务器ID
server-id=1
# 设置二进制日志格式
binlog-format=ROW
# 跳过错误(生产环境不建议)
# slave-skip-errors=1062
“`

### 高级配置
“`ini
# 二进制日志保留时间(秒)
expire_logs_days=7
# 最大二进制日志大小
max_binlog_size=1G
# 同步刷盘(安全性高,性能略低)
sync_binlog=1
# 自动清理过期二进制日志
binlog_expire_logs_seconds=604800
“`

### 创建复制用户
“`sql
CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘password’;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
FLUSH PRIVILEGES;
“`

### 锁定主库并获取状态
“`sql
— 锁定主库
FLUSH TABLES WITH READ LOCK;
— 查看主库状态
SHOW MASTER STATUS;
“`

## 从库配置

### 基本配置
“`ini
# 设置服务器ID
server-id=2
# 启用中继日志
relay-log=relay-bin
# 从库只读
read-only=1
# 跳过错误(生产环境不建议)
# slave-skip-errors=1062
“`

### 高级配置
“`ini
# 中继日志保留时间
relay_log_purge=1
# 从库并行复制线程数
slave_parallel_workers=4
# 从库延迟复制(可选)
# slave-delay=300
“`

### 配置主从连接
“`sql
— 配置主库信息
CHANGE MASTER TO
MASTER_HOST=’master_ip’,
MASTER_USER=’repl’,
MASTER_PASSWORD=’password’,
MASTER_LOG_FILE=’mysql-bin.000001′,
MASTER_LOG_POS=154;

— 启动从库复制
START SLAVE;

— 查看从库状态
SHOW SLAVE STATUS\G;
“`

## 数据初始化

### 方法一: 物理备份
1. **使用mysqldump备份主库**:
“`bash
mysqldump -u root -p –all-databases –master-data=2 –single-transaction > backup.sql
“`

2. **恢复到从库**:
“`bash
mysql -u root -p < backup.sql ``` ### 方法二: 逻辑备份 1. **使用xtrabackup备份主库**: ```bash xtrabackup --backup --target-dir=/backup ``` 2. **准备备份**: ```bash xtrabackup --prepare --target-dir=/backup ``` 3. **复制到从库**: ```bash rsync -av /backup/ slave:/var/lib/mysql/ ``` ## 监控与维护 ### 监控复制状态 - **查看从库状态**: ```sql SHOW SLAVE STATUS\G; ``` - **关键状态参数**: - `Slave_IO_Running`: I/O线程状态 - `Slave_SQL_Running`: SQL线程状态 - `Seconds_Behind_Master`: 从库延迟时间 ### 常见问题与解决方案 #### 复制延迟 - **原因**: 主库写入量过大,从库性能不足,网络延迟等 - **解决方案**: 增加从库配置,使用并行复制,优化网络 #### 复制中断 - **原因**: 主库和从库数据不一致,从库执行错误等 - **解决方案**: 跳过错误,重新初始化数据,检查SQL语句 #### 主库故障 - **解决方案**: 提升从库为主库,重新配置其他从库 ## 主从架构优化 ### 读写分离 - **实现方式**: 应用层分离,代理层分离(如ProxySQL、MySQL Router) - **优势**: 减轻主库压力,提高系统吞吐量 ### 多级复制 - **架构**: 主库 → 从库1 → 从库2 - **优势**: 减轻主库复制压力,提高扩展性 ### 半同步复制 - **配置**: 在主库启用半同步插件 ```sql INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SET GLOBAL rpl_semi_sync_master_enabled = 1; ``` - **优势**: 提高复制可靠性,确保至少一个从库收到二进制日志 ### 并行复制 - **配置**: 在从库设置并行线程数 ```sql SET GLOBAL slave_parallel_workers = 4; ``` - **优势**: 提高从库复制速度,减少复制延迟 ## 最佳实践 1. **定期备份**: 主库和从库都要定期备份 2. **监控复制状态**: 使用监控工具监控复制状态 3. **合理配置**: 根据实际业务需求配置主从参数 4. **定期维护**: 定期清理二进制日志和中继日志 5. **安全配置**: 限制复制用户的权限,使用SSL加密传输 6. **灾备方案**: 制定主库故障的应急方案 7. **版本管理**: 主从MySQL版本保持一致 8. **性能优化**: 根据硬件配置优化MySQL参数 ## 故障演练 ### 主库故障演练 1. **模拟主库故障**: 关闭主库服务 2. **提升从库为主库**: ```sql STOP SLAVE; RESET MASTER; ``` 3. **更新应用连接**: 将应用连接指向新的主库 4. **重新配置其他从库**: 将其他从库指向新的主库 ### 从库故障演练 1. **模拟从库故障**: 关闭从库服务 2. **恢复从库**: 启动从库服务,检查复制状态 3. **重新同步**: 如果数据不一致,重新初始化数据 ## 总结 MySQL主从复制是一种常用的高可用架构,通过将主库的数据复制到从库,可以实现数据备份、读写分离、负载均衡等功能。正确配置和维护主从复制,可以提高系统的可用性和可靠性。在实际部署中,需要根据业务需求和硬件条件,选择合适的复制策略和配置参数,确保复制的稳定性和性能。