答案:mysql读写分离通过主从复制和路由策略实现,写操作走主库,读操作分发至从库以提升性能。首先配置主从复制,主库开启二进制日志并创建复制账号,从库设置唯一server-id并启动复制线程;其次在应用层通过动态数据源或中间件(如proxySQL、MaxScale)根据SQL类型路由读写请求;需注意主从延迟问题,关键读操作应直连主库,并采用半同步复制优化一致性,结合监控与负载均衡策略确保系统稳定高效运行。

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 STATUSG检查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)减少数据不一致风险。
- 某些关键业务读操作(如订单支付结果)建议直连主库,保证数据实时性。
- 定期监控从库同步状态,及时发现并处理复制中断。
- 合理设计负载策略,避免所有读请求集中到某一个从库。
基本上就这些,关键是先搭好主从,再选合适的方式分流,兼顾性能与一致性。