分享新加坡服务器 MySQL 主从复制实战,从配置到故障切换的完整流程。
MySQL 主从复制是高可用架构的基础。本文分享新加坡服务器 MySQL 主从实战。
主从复制原理 1) 主库记录变更到 binlog 2) 从库 IO 线程读取 binlog 写入 relay log 3) 从库 SQL 线程执行 relay log 4) 异步复制,有一定延迟 5) 支持一主多从、级联复制
主库配置 ```ini [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW expire_logs_days = 7 max_binlog_size = 100M binlog_do_db = mydb ```
从库配置 ```ini [mysqld] server-id = 2 relay_log = /var/log/mysql/relay-bin.log read_only = 1 super_read_only = 1 relay_log_recovery = 1 ```
配置复制 1) 主库创建复制用户 ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` 2) 主库锁表,记录 binlog 位置 ```sql FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; ``` 3) 备份主库数据,导入从库 4) 从库配置复制 ```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; ``` 5) 检查复制状态 ```sql SHOW SLAVE STATUS\G ```
半同步复制 1) 主库等待至少一个从库确认 2) 减少数据丢失风险 3) 性能略有下降 4) 适合金融等对一致性要求高的场景 5) 配置 rpl_semi_sync_master_enabled
GTID 复制 1) 全局事务 ID,自动定位 2) 切换更简单,不用记 binlog 位置 3) 配置 gtid_mode = ON 4) 自动跳过已执行事务 5) MySQL 5.6+ 支持
读写分离 1) 写操作走主库 2) 读操作走从库 3) 应用层路由(中间件或代码) 4) 实时性要求高的读走主库 5) 中间件:ProxySQL、MyCat
故障切换 手动切换: 1) 停应用写请求 2) 等待从库追平 3) 从库提升为主(STOP SLAVE; RESET SLAVE ALL) 4) 应用连接新主库 5) 旧主库重新加入为从
自动切换: 1) MHA、Orchestrator 等工具 2) 检测主库故障 3) 自动选择最新从库提升 4) VIP 漂移到新主库 5) 应用自动重连
复制延迟优化 1) 并行复制:slave_parallel_workers 2) 减少大事务:拆分大事务 3) 优化主库写入:批量写入 4) 网络优化:低延迟专线 5) 硬件:NVMe SSD
监控告警 1) 复制状态:Slave_IO_Running、Slave_SQL_Running 2) 延迟:Seconds_Behind_Master 3) binlog 大小和增长速度 4) 错误日志 5) 延迟超过阈值告警
常见问题 问题一:复制延迟大 原因:大事务、从库性能差、网络慢。 解决:拆分事务、升级从库、优化网络。
问题二:复制中断 原因:主从数据不一致、SQL 错误。 解决:跳过错误(set global sql_slave_skip_counter)或重新同步。
问题三:主库宕机 原因:硬件故障、系统崩溃。 解决:切换到从库,修复后重新加入。
问题四:数据不一致 原因:从库被修改、复制出错。 解决:从库设为 read_only;定期校验(pt-table-checksum)。
问题五:binlog 磁盘满 原因:binlog 保留太长、增长太快。 解决:expire_logs_days 缩短;定期清理。
总结:MySQL 主从复制要配置正确、监控到位、故障切换预案完善。半同步和 GTID 能提升可靠性,读写分离能提升性能。