一、主从复制原理与核心作用
1.1 什么是MySQL主从复制
MySQL主从复制是一种数据同步机制,通过将主数据库(Master)的更新操作异步复制到一个或多个从数据库(Slave),实现数据的多副本存储。这是MySQL数据库自带的高可用和性能扩展方案,无需借助第三方工具。
核心特点:
- 基于二进制日志(Binary Log)实现
- 异步复制,不阻塞主库写入
- 支持一主多从、多主一从、级联复制等多种拓扑
1.2 主从复制工作原理
主从复制的核心流程涉及三个线程 和四个文件:
plaintext
┌─────────────────────────────────────────────────────────────────┐
│ 主库 (Master) │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ Client │ │ Binlog Dump │◄────── 写操作写入 │
│ │ (写请求) │───►│ Thread │ Binlog │
│ └─────────────┘ └────────┬─────────┘ │
└─────────────────────────────┼───────────────────────────────────┘
│ 推送Binlog事件
▼
┌─────────────────────────────────────────────────────────────────┐
│ 从库 (Slave) │
│ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐ │
│ │ I/O Thread │───►│ Relay Log │───►│ SQL Thread │ │
│ │ (接收Binlog) │ │ (中继日志) │ │ (回放SQL) │ │
│ └────────────────┘ └────────────────┘ └───────────────┘ │
│ │ ▲ │
│ │ │ │
│ ▼ │ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ master.info │ │ relaylog.info │ │
│ │ (主库连接信息) │ │ (同步位点信息) │ │
│ └────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
详细流程:
-
主库Binlog Dump线程:每当主库执行写操作(INSERT/UPDATE/DELETE),将变更记录写入二进制日志,并为每个连接的从库创建独立线程推送最新Binlog事件。
-
从库I/O线程:连接主库获取Binlog内容,写入本地中继日志(Relay Log),记录主库位点信息(File/Position)用于断点续传。
-
从库SQL线程:解析中继日志中的SQL语句,在从库执行实现数据同步,通过Relay Log Info File保存已执行的位置信息。
1.3 主从复制的作用与优势
| 应用场景 | 说明 |
|---|---|
| 读写分离 | 主库负责写操作,从库分担读请求,提升系统并发性能 |
| 数据备份 | 从库作为热备节点,可快速切换保障业务连续性 |
| 容灾架构 | 异地部署从库构建高可用集群 |
| 数据分析 | 从库用于报表查询、BI分析,不影响主库业务 |
1.4 复制类型与选型
MySQL支持多种复制模式,根据业务需求选择合适的复制类型:
| 复制模式 | 特点 | 适用场景 |
|---|---|---|
| 异步复制 | 主库不等待从库确认,性能最高,存在数据丢失风险 | 读多写少、允许短暂延迟的业务 |
| 半同步复制 | 至少一个从库确认接收后才提交,平衡性能与一致性 | 对数据一致性有要求的业务 |
| 全同步复制 | 所有从库确认后才提交,数据零丢失,性能较低 | 金融级核心系统 |
二、MaxScale读写分离中间件详解
2.1 MaxScale简介
MaxScale是由MariaDB官方开发的数据库代理和负载均衡器,支持MySQL和MariaDB。相较于其他中间件(如ProxySQL、MySQL Router),MaxScale具有以下优势:
- 可视化配置:提供Web管理界面,配置更直观
- 智能读写分离:自动识别SQL类型,路由到合适的后端节点
- 自动故障切换:后端节点故障时自动剔除和恢复
- 连接池复用:减少数据库连接开销
2.2 读写分离原理
MaxScale的读写分离基于SQL语句解析实现:
plaintext
┌──────────────────────────────────────────────────────────────┐
│ 客户端应用 │
└───────────────────────────┬──────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ MaxScale 中间件 │
│ ┌────────────────┐ ┌──────────────────────────────────┐ │
│ │ SQL Parser │───►│ Router (路由分发) │ │
│ │ (SQL解析器) │ │ - SELECT/INSERT/UPDATE/DELETE │ │
│ └────────────────┘ │ - 事务内语句 │ │
│ └───────────────┬──────────────────┘ │
└────────────────────────────────────────┼─────────────────────┘
│
┌─────────────────────────────┼─────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Master │ │ Slave 1 │ │ Slave 2 │
│ (写节点) │ │ (读节点) │ │ (读节点) │
└─────────────┘ └─────────────┘ └─────────────┘
路由规则:
- 写操作:INSERT、UPDATE、DELETE、CREATE、ALTER、DROP → 主库
- 读操作:普通SELECT → 从库(负载均衡)
- 事务内语句:BEGIN/COMMIT/ROLLBACK及事务中的所有SQL → 主库
- SELECT FOR UPDATE:悲观锁查询 → 主库
2.3 MaxScale核心组件
| 组件类型 | 说明 |
|---|---|
| Server | 定义后端MySQL服务器节点 |
| Service | 路由服务,如readwritesplit(读写分离)、readconnroute(读负载均衡) |
| Listener | 监听端口,接收客户端连接 |
| Monitor | 监控后端节点状态,自动故障检测 |
三、MySQL主从复制详细配置
3.1 环境准备
| 组件 | IP地址 | 角色 |
|---|---|---|
| Master | 192.168.1.100 | 主库 |
| Slave1 | 192.168.1.101 | 从库1(读节点) |
| Slave2 | 192.168.1.102 | 从库2(读节点) |
3.2 主库配置
编辑MySQL配置文件 /etc/my.cnf:
ini
[mysqld]
# 服务器唯一标识(必须唯一)
server-id = 1
# 启用二进制日志,指定日志文件路径
log-bin = /var/lib/mysql/mysql-bin
# 推荐使用行模式复制,数据一致性更高
binlog-format = ROW
# 日志保留天数
expire-logs-days = 7
# 启用日志校验
binlog-checksum = CRC32
# 单个日志文件最大大小
max-binlog-size = 100M
# 开启GTID模式(可选,推荐生产环境使用)
gtid-mode = on
enforce-gtid-consistency = on
# sync_binlog确保事务提交时同步日志到磁盘
sync-binlog = 1
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
重启MySQL服务使配置生效:
bash
systemctl restart mysqld
3.3 从库配置
编辑从库配置文件 /etc/my.cnf:
ini
[mysqld]
# 服务器唯一标识
server-id = 2
# 启用中继日志
relay-log = /var/lib/mysql/mysql-relay-bin
# 允许从库记录自身二进制日志(级联复制需要)
log-slave-updates = 1
# 从库设置为只读
read-only = 1
# 确保中继日志写入磁盘
sync-relay-log = 1
# 并行复制线程数(根据CPU核心数调整)
slave-parallel-workers = 4
# GTID模式
gtid-mode = on
enforce-gtid-consistency = on
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
3.4 建立主从复制连接
3.4.1 主库创建复制账号
sql
-- 创建复制专用账号
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
-- 如果使用GTID模式,简化命令
-- GRANT REPLICATION SLAVE, SELECT ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
3.4.2 查看主库状态
sql
-- 查看当前二进制日志位置
SHOW MASTER STATUS;
-- 输出示例:
-- +------------------+----------+--------------+------------------+-------------------------------------------+
-- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
-- +------------------+----------+--------------+------------------+-------------------------------------------+
-- | mysql-bin.000003 | 456 | | | 3e4f5a6b-1234-5678-9abc-def0123456789:1-10 |
-- +------------------+----------+--------------+------------------+-------------------------------------------+
3.4.3 从库配置主库连接信息
方式一:基于文件位置的复制(传统方式)
sql
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'StrongP@ssw0rd!',
MASTER_PORT = 3306,
MASTER_LOG_FILE = 'mysql-bin.000003',
MASTER_LOG_POS = 456,
MASTER_CONNECT_RETRY = 10;
方式二:基于GTID的复制(推荐)
sql
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'StrongP@ssw0rd!',
MASTER_PORT = 3306,
MASTER_AUTO_POSITION = 1;
3.4.4 启动并验证复制
sql
-- 启动复制进程
START SLAVE;
-- 查看复制状态
SHOW SLAVE STATUS\G
关键状态检查:
plaintext
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 456
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 720
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes ← 必须为Yes
Slave_SQL_Running: Yes ← 必须为Yes
3.5 多从库配置(级联复制示例)
对于一主多从场景,所有从库配置相同,只需修改 server-id:
ini
# Slave2 配置文件
[mysqld]
server-id = 3
relay-log = /var/lib/mysql/mysql-relay-bin
log-slave-updates = 1
read-only = 1
四、MaxScale安装与配置详解
4.1 MaxScale安装
4.1.1 YUM安装(CentOS/RHEL 7/8)
bash
# 添加MariaDB yum源
cat > /etc/yum.repos.d/MariaDB.repo << 'EOF'
[mariadb]
name = MariaDB
baseurl = https://yum.mariadb.org/10.6/centos7-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
# 安装MaxScale
yum install -y maxscale
4.1.2 APT安装(Debian/Ubuntu)
bash
curl -LsS https://downloads.mariadb.com/MaxScale/<version>/<distro>/<release>/ | bash
apt-get install maxscale
4.2 MaxScale用户创建
在所有MySQL节点上创建MaxScale专用用户:
sql
-- 创建监控用户(MaxScale用于检测后端节点状态)
CREATE USER 'maxscale_mon'@'%' IDENTIFIED WITH mysql_native_password BY 'Monitor@2024';
GRANT SELECT ON mysql.* TO 'maxscale_mon'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'maxscale_mon'@'%';
-- 创建路由用户(用于实际SQL路由)
CREATE USER 'maxscale_router'@'%' IDENTIFIED WITH mysql_native_password BY 'Router@2024';
GRANT ALL PRIVILEGES ON *.* TO 'maxscale_router'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
4.3 MaxScale配置文件详解
编辑 /etc/maxscale.cnf:
ini
# ===========================================
# 全局配置
# ===========================================
[maxscale]
# 线程数,auto表示自动检测CPU核心数
threads = auto
# 管理界面配置
admin_host = 0.0.0.0
admin_port = 8989
admin_secure_gui = false
# 日志配置
log_messages = all
log_notice = true
log_debug = false
# ===========================================
# 后端服务器定义
# ===========================================
[master-server]
type = server
address = 192.168.1.100
port = 3306
protocol = MariaDBBackend
[slave1-server]
type = server
address = 192.168.1.101
port = 3306
protocol = MariaDBBackend
[slave2-server]
type = server
address = 192.168.1.102
port = 3306
protocol = MariaDBBackend
# ===========================================
# 监控模块
# ===========================================
[MySQL-Monitor]
type = monitor
module = mariadbmon
# 监控的服务器列表
servers = master-server, slave1-server, slave2-server
# 监控用户(刚才创建的用户)
user = maxscale_mon
password = Monitor@2024
# 监控间隔(毫秒)
monitor_interval = 10000
# 主从复制延迟阈值(毫秒)
max_slave_replication_lag = 3000
# 自动故障切换配置
auto_failover = true
auto_rejoin = true
# ===========================================
# 读写分离服务
# ===========================================
[ReadWrite-Service]
type = service
router = readwritesplit
# 后端服务器
servers = master-server, slave1-server, slave2-server
# 路由用户
user = maxscale_router
password = Router@2024
# 路由选项
router_options = master_failure_timeout=5, slave_failure_timeout=5, use_sql_in_executing=yes
# 最大连接数
max_connections = 1000
# ===========================================
# 只读服务(可选)
# ===========================================
[ReadOnly-Service]
type = service
router = readconnroute
servers = slave1-server, slave2-server
user = maxscale_router
password = Router@2024
router_options = slave
# ===========================================
# 监听器定义
# ===========================================
# 读写分离监听器(默认端口4006)
[ReadWrite-Listener]
type = listener
service = ReadWrite-Service
protocol = MariaDBClient
port = 4006
# 只读监听器(默认端口4008)
[ReadOnly-Listener]
type = listener
service = ReadOnly-Service
protocol = MariaDBClient
port = 4008
# 管理界面监听器
[Admin-Listener]
type = listener
service = ReadWrite-Service
protocol = maxscaled
address = 0.0.0.0
port = 8989
4.4 启动MaxScale
bash
# 创建maxscale用户(如不存在)
useradd -r maxscale
# 设置数据目录权限
mkdir -p /var/lib/maxscale
chown -R maxscale:maxscale /var/lib/maxscale
mkdir -p /var/log/maxscale
chown -R maxscale:maxscale /var/log/maxscale
# 启动MaxScale
maxscale -f /etc/maxscale.cnf
# 或使用systemd管理
systemctl start maxscale
systemctl enable maxscale
# 检查运行状态
maxadm list services
maxadm list servers
maxadm list listeners
4.5 验证读写分离
bash
# 通过MaxScale连接数据库
mysql -umaxscale_router -pRouter@2024 -h192.168.1.200 -P4006
# 执行查询(应路由到从库)
mysql> SELECT @@server_id;
# 返回结果应为从库的server_id
# 执行写入(应路由到主库)
mysql> INSERT INTO test.t1 VALUES (1, 'test');
# 查看返回的受影响行数
# 开启查询日志验证路由
# 在MaxScale配置中启用详细日志
# log_debug = true
五、实际应用场景
5.1 电商平台读多写少场景
场景特点:
- 商品浏览(读):占比95%以上
- 商品下单(写):占比不足5%
- 促销活动时读压力激增
架构方案:
plaintext
┌──────────────────────────────────┐
│ MaxScale │
│ ┌────────────┐ ┌────────────┐ │
│ │ 读写分离 │ │ 监控 │ │
│ │ 服务4006 │ │ 模块 │ │
│ └────────────┘ └────────────┘ │
└──────────┬───────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Master │ │ Slave1 │ │ Slave2 │
│ (订单写入) │ │ (商品查询) │ │ (商品查询) │
│ 库存更新 │ │ 用户查询 │ │ 评价查询 │
└─────────────┘ └─────────────┘ └─────────────┘
5.2 数据分析报表场景
场景特点:
- 需要定期执行大量复杂查询
- 查询不影响在线业务
- 允许一定数据延迟
配置建议:
- 单独配置只读从库用于报表
- 通过
readonly过滤器区分业务
ini
# 报表专用只读服务
[Report-Service]
type = service
router = readconnroute
servers = report-slave
user = maxscale_router
password = Router@2024
router_options = slave
[Report-Listener]
type = listener
service = Report-Service
protocol = MariaDBClient
port = 4009
5.3 多级缓存架构
配合Redis/本地缓存,构建多层缓存体系:
plaintext
应用层 → Redis缓存 → MaxScale读写分离 → MySQL主从集群
↑
│
┌─────────┴─────────┐
│ │
┌─────┴─────┐ ┌─────┴─────┐
│ 主库 │ │ 从库群 │
│ (热数据) │ │ (历史数据) │
└───────────┘ └───────────┘
六、常见问题与解决方案
6.1 主从复制常见问题
问题1:Slave_IO_Running 显示 Connecting
原因分析:
- 网络不通
- 复制账号密码错误
- 主库防火墙未开放3306端口
- 主库未启用二进制日志
排查步骤:
bash
# 1. 测试网络连通性
telnet 192.168.1.100 3306
# 2. 测试账号登录
mysql -h192.168.1.100 -urepl_user -p'StrongP@ssw0rd!'
# 3. 查看错误日志
tail -f /var/log/mysqld.log
解决方案:
sql
-- 检查主库是否允许从库IP连接
SELECT user, host FROM mysql.user WHERE user = 'repl_user';
-- 如果不允许,添加允许的IP
CREATE USER 'repl_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.%';
FLUSH PRIVILEGES;
问题2:主从数据不一致
原因分析:
- 执行了跳过错误的操作
- 从库意外写入数据
- 网络中断导致部分事务丢失
解决方案:
sql
-- 方法1:使用pt-table-checksum检查一致性
pt-table-checksum h=master,u=checksum,p=checksum --databases=db_name
-- 方法2:使用pt-table-sync修复不一致
pt-table-sync --sync-to-master h=slave,u=checksum,p=checksum --database=db_name --table=tbl_name
-- 方法3:重新同步表(不推荐,影响业务)
-- 在主库导出数据
mysqldump -uroot -p --single-transaction --master-data=2 db_name tbl_name > tbl_name.sql
-- 在从库导入(需先停止复制)
STOP SLAVE;
SET SQL_LOG_BIN=0;
source /path/to/tbl_name.sql;
SET SQL_LOG_BIN=1;
START SLAVE;
问题3:复制延迟过大
原因分析:
- 从库硬件性能不足
- 网络带宽瓶颈
- 大事务阻塞
- 从库负载过高
解决方案:
ini
# 1. 优化从库配置
[mysqld]
slave-parallel-workers = 8
slave-parallel-type = LOGICAL_CLOCK
slave-preserve-commit-order = 1
# 2. 调整主库Binlog格式
binlog-format = ROW # 行模式避免大事务问题
# 3. 启用半同步复制减少延迟
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
sql
-- 监控复制延迟
SHOW SLAVE STATUS\G
-- 查看 Seconds_Behind_Master 字段
-- 优化大表结构
ALTER TABLE large_table ADD INDEX idx_column(column_name);
6.2 MaxScale常见问题
问题1:客户端连接超时
原因分析:
- MaxScale未启动
- 后端服务器配置错误
- 连接数达到上限
解决方案:
bash
# 检查MaxScale状态
systemctl status maxscale
maxadm show events
# 检查服务器连接
maxadm list servers
# 确保状态为 "Running"
# 增加最大连接数
# 编辑maxscale.cnf
max_connections = 2000
maxscale -f /etc/maxscale.cnf -U maxscale
问题2:读写分离不生效
原因分析:
- 配置文件路由规则错误
- 后端服务器未正确识别主从关系
- SQL语句在事务中执行
解决方案:
bash
# 启用详细日志
# 在maxscale.cnf中设置
log_debug = true
log_messages = all
# 重启后查看日志
tail -f /var/log/maxscale/maxscale.log
# 检查主从关系
maxadm list servers
# Master应显示 "Master" 角色
ini
# 确保读写分离服务正确配置
[ReadWrite-Service]
type = service
router = readwritesplit
servers = master-server, slave1-server, slave2-server
问题3:从库故障未自动剔除
排查步骤:
bash
# 检查监控模块是否启用
maxadm show monitor
# 查看监控配置
maxadm show config MySQL-Monitor
# 手动测试故障检测
# 停止一台从库
systemctl stop mysqld
# 查看状态变化
maxadm list servers
# 应该显示该服务器为 "Down"
ini
# 确保监控模块配置正确
[MySQL-Monitor]
type = monitor
module = mariadbmon
servers = master-server, slave1-server, slave2-server
user = maxscale_mon
password = Monitor@2024
monitor_interval = 5000 # 缩短检测间隔
6.3 生产环境最佳实践
安全加固
bash
# 1. 限制复制账号IP范围
CREATE USER 'repl_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.%';
# 2. 启用SSL加密复制
CHANGE MASTER TO
MASTER_SSL = 1,
MASTER_SSL_CA = '/etc/mysql/ca.pem',
MASTER_SSL_CERT = '/etc/mysql/client-cert.pem',
MASTER_SSL_KEY = '/etc/mysql/client-key.pem';
# 3. MaxScale启用TLS
# 在maxscale.cnf中添加
[maxscale]
ssl = true
ssl_cert = /etc/maxscale/ssl/cert.pem
ssl_key = /etc/maxscale/ssl/key.pem
ssl_ca = /etc/maxscale/ssl/ca.pem
监控告警
bash
# 监控脚本示例 - 检查主从复制状态
#!/bin/bash
SLAVE_STATUS=$(mysql -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running")
IO_RUNNING=$(echo "$SLAVE_STATUS" | grep "Slave_IO_Running" | awk '{print $2}')
SQL_RUNNING=$(echo "$SLAVE_STATUS" | grep "Slave_SQL_Running" | awk '{print $2}')
LAG=$(mysql -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk '{print $2}')
if [ "$IO_RUNNING" != "Yes" ] || [ "$SQL_RUNNING" != "Yes" ]; then
echo "CRITICAL: Replication failed"
# 发送告警通知
curl -X POST "http://alert-system/api/alert" -d '{"level":"critical","message":"MySQL replication failed"}'
fi
if [ "$LAG" != "0" ] && [ "$LAG" -gt 60 ]; then
echo "WARNING: Replication lag: $LAG seconds"
fi
七、架构演进与高级特性
7.1 GTID复制模式
GTID(Global Transaction Identifier)提供了更强大的复制管理能力:
ini
# 主库配置
[mysqld]
gtid-mode = on
enforce-gtid-consistency = on
# 从库配置
[mysqld]
gtid-mode = on
enforce-gtid-consistency = on
sql
-- GTID复制优势:
-- 1. 自动定位复制位置,无需手动指定binlog位置
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
-- 2. 轻松跳过错误事务
SET gtid_next = '3e4f5a6b-1234-5678-9abc-def0123456789:100';
BEGIN;
COMMIT;
SET gtid_next = AUTOMATIC;
-- 3. 简化故障切换
-- 使用MHA或Orchestrator工具自动处理
7.2 MGR组复制
MySQL Group Replication(MGR)提供原生高可用方案:
plaintext
┌─────────────────────────────────────────────────────────┐
│ 应用层 │
└─────────────────────────┬───────────────────────────────┘
│
┌─────────────────────────▼───────────────────────────────┐
│ MySQL Router / MaxScale │
└─────────────────────────┬───────────────────────────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1 │◄────►│ Node 2 │◄────►│ Node 3 │
│ Primary │ │ Secondary│ │ Secondary│
└─────────┘ └─────────┘ └─────────┘
▲ ▲ ▲
│ │ │
└────────────────┴────────────────┘
组复制通信
7.3 性能优化参数汇总
ini
# 主库优化
[mysqld]
sync_binlog = 1 # 事务提交时同步binlog
innodb_flush_log_at_trx_commit = 1 # 完全刷盘保证数据安全
binlog_cache_size = 4M # binlog缓存大小
# 从库优化
[mysqld]
slave_parallel_workers = 8 # 并行复制线程数
slave_parallel_type = LOGICAL_CLOCK # 基于组提交的并行
relay_log_recovery = 1 # 启用中继日志恢复
read_only = 1 # 从库只读
super_read_only = 1 # 禁止SUPER权限用户写入
# MaxScale优化
[maxscale]
threads = auto # 自动线程数
max_connections = 2000 # 最大连接数
connection_timeout = 300 # 连接超时(秒)
总结
本文详细介绍了MySQL主从复制的核心原理和MaxScale读写分离的完整配置方案。通过这套架构,可以实现:
- 数据安全:主从备份,异地容灾
- 性能提升:读流量分散到多个从库
- 高可用:故障自动切换,业务不中断
- 可扩展:水平扩展从库数量
在实际生产环境中,建议配合完善的监控告警系统,定期检查主从状态和延迟情况,确保系统稳定运行。
📚 参考资料
💡 推荐工具
- MySQL Workbench - 图形化数据库管理
- Percona Toolkit - 数据库运维工具集
- pt-table-checksum - 数据一致性检查
- Orchestrator - MySQL 高可用管理