在MySQL高可用架构中,读写分离不仅是性能优化的手段,更是提升系统容错能力的关键策略。通过将写操作(INSERT、UPDATE、DELETE) 集中到主节点,读操作(SELECT) 分散到多个从节点或双主节点,系统可实现以下目标:
文档中的案例采用 MySQL双主复制(Master1 ↔ Master2) 架构,两节点互为主从,均支持读写操作。结合HAProxy的负载均衡能力,可通过以下方式实现读写分离:
HAProxy作为反向代理,通过监听客户端请求并将其分发至后端MySQL节点,支持多种负载均衡算法(如轮询、最少连接数)。在读写分离场景中,需通过配置区分写请求与读请求的路由逻辑
listen mysql
bind 0.0.0.0:3306
mode tcp
balance leastconn
server mysql1 192.168.10.101:3306 check port 3306 maxconn 300
server mysql2 192.168.10.102:3306 check port 3306 maxconn 300
默认将所有请求(包括读写)均衡分发到双主节点,未显式区分读写操作。
需通过ACL规则识别SQL类型,将写请求定向到指定主节点,读请求分发到所有节点。
frontend mysql_frontend
bind *:3306
mode tcp
# 定义ACL规则识别写请求(如包含INSERT/UPDATE/DELETE关键字)
acl is_write payload(0,7) -m bin 494e53455254 555044415445 44454c455445
# 路由写请求至主节点组
use_backend master_group if is_write
# 默认路由读请求至从节点组
default_backend slave_group
backend master_group
mode tcp
server master1 192.168.10.101:3306 check
server master2 192.168.10.102:3306 check backup # 主节点故障时切换
backend slave_group
mode tcp
balance roundrobin
server slave1 192.168.10.101:3306 check
server slave2 192.168.10.102:3306 check
494e53455254
)。global
log /dev/log local0
log-tag HAProxy-MySQL
defaults
log global
option tcplog
timeout client 30s
timeout server 30s
timeout connect 5s
双主架构中,数据同步依赖MySQL的二进制日志(Binlog)与GTID(全局事务标识),确保事务在双节点间有序执行:
配置优化建议
# 在my.cnf中配置
binlog_format = ROW # 使用行级复制
gtid_mode = ON # 启用GTID
enforce_gtid_consistency = ON # 强制GTID一致性
slave_parallel_workers = 4 # 并行复制线程数
双主架构可能因同时写入相同数据引发冲突,需通过以下方式规避:
# Master1配置
auto_increment_increment = 2
auto_increment_offset = 1
# Master2配置
auto_increment_increment = 2
auto_increment_offset = 2
Keepalived通过VRRP协议管理虚拟IP(VIP),监控HAProxy进程状态,实现故障自动转移:
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100 # Keepalived1优先级高于Keepalived2(99)
virtual_ipaddress {
192.168.10.100
}
track_script {
chk_haproxy
}
}
-- 通过VIP执行写操作
INSERT INTO orders (user_id, amount) VALUES (1001, 150.00);
验证点:数据应同步至双主节点,通过SHOW SLAVE STATUS
确认复制状态。
-- 多次执行读操作
SELECT * FROM orders WHERE user_id = 1001;
SHOW PROCESSLIST
确认请求分发至不同节点。# SysBench读写混合测试
sysbench oltp_read_write \
--mysql-host=192.168.10.100 \
--mysql-port=3306 \
--mysql-user=test \
--mysql-password=123456 \
--mysql-db=test \
--tables=10 \
--table-size=100000 \
--threads=32 \
--time=300 \
--report-interval=10 \
run