MySQL中的读写分离主要是通过主从复制(Master-Slave Replication)配合应用层或中间件的路由策略来实现。核心思路是:写操作发送到主库,读操作分发到一个或多个从库,从而减轻主库压力,提高系统整体性能。
1. 配置主从复制
读写分离的基础是搭建MySQL主从架构,确保数据能从主库同步到从库。
主库配置(Master):
在my.cnf中启用二进制日志并设置server-id: [mysqld]server-id = 1
log-bin = mysql-bin重启MySQL服务后,创建用于复制的账号: CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
从库配置(Slave):
在my.cnf中设置唯一的server-id(不能和主库相同): [mysqld]server-id = 2重启服务后,配置连接主库并启动复制: CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 4;
START SLAVE;使用
SHOW SLAVE STATUS\G检查
Slave_IO_Running和
Slave_SQL_Running是否为Yes。
2. 应用层实现读写分离
在代码中根据SQL类型决定连接哪个数据库实例。
使用两个数据源:一个指向主库(写),一个指向从库(读)。 在Java项目中可通过Spring的AbstractRoutingDataSource动态切换数据源。 对INSERT、UPDATE、DELETE使用主库连接;SELECT使用从库连接。 注意主从延迟问题,某些强一致性读操作仍需走主库。3. 使用中间件自动分流
借助代理工具可透明化读写分离过程,应用无需修改SQL。
常用中间件: MaxScale:MariaDB官方提供的数据库代理,支持自动解析SQL并路由。 ProxySQL:高性能MySQL代理,支持查询规则、缓存和负载均衡。 MyCat:开源的分布式数据库中间件,支持分库分表和读写分离。配置示例(ProxySQL):
添加主从实例到ProxySQL后端服务器列表。 设置查询规则,如以SELECT开头的语句转发到从库。 监控主从延迟,避免将读请求发往延迟过高的从库。4. 注意事项与优化
主从延迟是读写分离的主要挑战,可通过半同步复制(semi-sync)减少数据不一致风险。 某些关键业务读操作(如订单支付结果)建议直连主库,保证数据实时性。 定期监控从库同步状态,及时发现并处理复制中断。 合理设计负载策略,避免所有读请求集中到某一个从库。基本上就这些,关键是先搭好主从,再选合适的方式分流,兼顾性能与一致性。
