本次笔记系统的记录了MySQL主从复制与读写分离的核心原理、实操配置流程及MaxScale代理部署。
一、MySQL高可用架构设计总览
1.1架构组成要素
主从辅助、读写分离、负载均衡、高可用(HA)四者一体,构成MySQL集群建设的核心问题域。
1.2关键设计目标
| 目标 | 实现方式 |
| 数据一致性保障 | 通过不同复制类型实现 |
| 负载压力分担 | 通过读写分离与多节点扩展 |
| 故障自动转移能力 | 任一节点宕机后服务可持续 |
二、复制类型概念与选型依据
2.1主流复制方式对比
| 复制类型 | 数据一致性 | 性能 | 配置复杂的 |
| 异步复制 | 最弱 | 最高 | 最简单 |
| 半同步复制 | 中等 | 中等 | 中等 |
| 组复制 | 强一致 | 低 | 复杂 |
| GTID复制 | 中等 | 中等 | 中等 |
2.2业务场景适配原则
| 复制类型 | 适用场景 |
| 异步复制 | 游戏、读写分离、数据归档等对一致性容忍度高、性能要求极致的场景 |
| 半同步复制 | 中等一致性要求、性能可接受折中的通用场景 |
| 组复制 | 金融核心系统等强一致性、高容错性场景(如股票交易、数据不一致将引发严重后果) |
| GTID复制 | 简化运维、支持故障切换,一致性与复杂度均为中等 |
三、异步复制原理详解
3.1定义与特性
主库执行事务后立即返回客户端,不等待从库确认;数据一致性最弱,但性能最高,配置最简单。
3.2与IO模型类比
| 模型 | 特点 |
| 异步I/O | 任务发出即返回,无需等待结果 |
| 同步 | 必须等待前序任务完成才发起下一任务 |
3.3位置复制(Position-Based Replication)本质
基于二进制日志文件名(如 mysql-bin.000001 )与偏移量( position )进行数据同步。
四、主从复制底层机制
4.1、主库关键组件
| 组件 | 说明 |
| 二进制日志(binary log) | 记录所有DML/DDL操作(不含SELECT) |
配置项
ini
log-bin = mysql-bin
binlog-fornat = ROW #或 MIXED
日志轮转
每个事务提交后,日志按顺序追加至当前文件,满则轮转新文件( mysql-bin.000002 等)。
4.2从库关键组件
| 组件 | 说明 |
| IO线程( I/O Thread ) | 连接主库,读取其binary log内容, 写入本地中继日志( rela log ) |
| SQL线程( SQL Thread ) | 读取relay log, 重放其中语句,使从库数据与主库一致 |
| 中继日志( relay log ) | 文件名由 relay-log = mysql-relay-bin 指定,内容与主库binary log完全一致 |
五、主从复制配置全流程
5.1前置环境准备
| 准备项 | 要求 |
| 时间同步 |
所有节点启用NTP服务,指向权威时间服务器 (如 ntp1.aliyun.com 、cn.ntp.org.cn ) |
| 时区统一 | 设置为 Asia/Shanghai |
| 免密登录 | 通过SSH秘钥实现主从节点间无密码通信 |
5.2主库配置(my.cnf)
ini
[mysqld]
server-id = 128
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7
5.3从库配置(my.cnf)
ini
[mysqld]
server-id = 129
relay-log = mysql-relay-bin
5.4用户权限与CHANGE MASTER TO指令
主库创建复制用户
sql
CREATE USER 'slave'@'192.168.160.%'
IDENTIFIED WITH mysql_native_password BY '123.com';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.160.%';
从库执行复制命令
sql
CHANGE MASTER TO
MASTER_HOST='192.168.160.128',
MASTER_USER='slave',
MASTER_PASSWORD='123.COM',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
START SLAVE;
六、典型故障排查与解决
6.1IO线程连接失败(Error 2003)
| 项目 | 说明 |
| 原因 | 网络不通,防火墙拦截(如firewalld未开放3306端口) |
| 验证 | ping 测试连通性, telnet 192.168.160.128 3306 检测端口 |
| 解决 | firewall-cmd --permanent --add-port= 3306/tcp && firewall-cmd --reload |
6.2认证插件不兼容(Error 1045)
| 项目 | 说明 |
| 原因 | MySQL8默认 caching_sha2_password 插件要求TLS安全连接,而实验环境未配置 |
解决方案
方案一:修改用户认证方式
sql
ALTER USER 'slave'@'%'
IDENTIFIED WITH mysql_native_password BY '123.com';
方案二:全局配置
ini
[mysqld]
default_authentication_plugin = mysql_native_password
6.3从库状态异常诊断
关键命令
sql
SHOW SLAVE STATUS\G;
核心字段
| 字段 | 正常状态 |
|
Slave_IO_Running | Yes |
| Slave_SQL_Running | Yes |
错误定位
| 字段 | 说明 |
| Seconds_Behind_Master | 延迟秒数 |
|
Last_IO_Erroe | IO线程错误信息 |
| Last_SQL_Error | SQL线程错误信息 |
七、数据一致性增强策略
7.1新节点加入同步集群
问题
后加入从库若直接配置复制,仅同步配置后的新数据,历史数据缺失。
解决方案
步骤1:主库全逻辑备份
hash
mysqldump --all-databases --master-data=2 > full_backup.sql
步骤2:从库导入备份
sql
mysql < full_backuo.sql
步骤3:执行CHANGE MASTER TO并启动复制
sql
CHANGE MASTER TO ...;
START SLAVE;
八、复制过滤机制实践
8.1白名单(Reolicate_Do_DB)
配置
ini
[mysqld]
replicate-do-db = DB2
效果
仅同步指定数据库(如DB2),其他库(DB1、DB3)不复制。
8.2黑名单(Replicate_lgnore_DB)
配置
ini
[mysqld]
replicate-ignore-db = musql
效果
忽略指定系统库,避免权限表冲突
注意:实际验证中黑名单功能存在兼容性问题,白名单更稳定可靠。
九、读写分离代理:MaxScale部署
9.1工具定位与能力
1.MariaDB官方提供,兼容MySQL协议
2.支持读写分离、负载均衡、查询路由、连接加密、防火墙等功能
9.2部署障碍与绕行方案
环境限制
| 问题 | 说明 |
| 官方RPM包限制 | 仅支持CentOS 7/Ubuntu20.04等 |
| openEuler适配 | 需手动编译或寻找适配包 |
配置要点
1.后端服务器定义(servers)
ini
[server1]
type=server
address=192.168.160.128
port=3306
protocol=MySQLBackend
[server2]
type=server
address=192.168.160.129
port=3306
protocol=MySQLBackend
2.监控模块(monitor)
ini
[MySQL Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=monitor
password=monitor_password
monitor_interval=2000
3.路由模块(service)
ini
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2
user=maxscale_user
password=maxscale_password
用户权限要求
| 用户 | 所需权限 |
| monitor | REPLICATION CLIENT,REPLICATION SLAVE |
| maxscale_user | SELECT 权限 |
9.3配置避坑指南
注释格式
ini
#正确:注释独占一行
option = value
#错误:注释置于配置项末尾(会报错)
option = value # comment
版本匹配
确保MaxScale版本与后端MySQL/MariaDB版本兼容(如MySQL 8.0对应MaxScale 22.x)。
十、总结与建议
10.1核心原则重申
主从复制是所有高可用架构的前提,必须首选确保数据同步稳定,再叠加读写分离等高级功能。
10.2运维实践提示
二进制日志恢复
支持两种方式:
| 方式 | 说明 |
| 基于时间 | --start-datetime / --stop-datetime |
| 基于位置 | --start-position / --stop-position |
生产环境规范
禁用 reolicate-ignore-db = mysql 等可能引发权限同步混乱的配置
故障相应
SHOW SLAVE STATUS 是首要诊断入口,重点关注IO/SQL Running 状态及错误日志字段。
十一、常用命令速查
主库操作
sql
--查看二进制日志
SHOW MASTER LOGS;
--查看当前binlog位置
SHOW MASTER STATUS;
--创建复制用户
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
从库操作
sql
--配置主从复制
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='slave',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
--启动复制
STARI SLAVE;
--查看复制状态
SHOW SLACE STATUS\G;
--停止复制
STOP SLAVE;
--重置复制
RESET SLAVE ALL;
备份与恢复
bash
--全量备份
mysqldum --all-databases --master-data=2 --single-transaction >
backup.sql
--导入备份
mysql < backup.sql
--基于时间点回复
mysqlbinlog --start-datetime="2026-04-09 14:00:00" --stio-
datetime="2026-04-09 15:00:00" mysql-bin.000001 | mysql -u root -p
主从复制是高可用基础,数据同步稳定后再叠加读写分离;生产环境优先考虑白名单过滤和GTID复制。

&spm=1001.2101.3001.5002&articleId=159987002&d=1&t=3&u=1f29795081404929a74f9c41212812c0)
1664

被折叠的 条评论
为什么被折叠?



