读写分离
读写分离 是 MySQL 主从复制的一种扩展应用,通过让主库(Master)处理写操作,从库(Slave)处理读操作,实现数据库的负载均衡和性能优化。它通常结合中间件(如 ProxySQL 或 Mycat)实现透明化的读写分离。
读写分离的优势
- 性能提升:将读操作分发到从库,减少主库的负载。
- 高可用性:主库宕机时,从库可以切换为主库,保证业务连续性。
- 扩展性强:通过增加从库支持更多的读请求。
部署读写分离的步骤
1. 搭建主从复制
在实现读写分离之前,首先需要完成 MySQL 主从复制的部署(见ab复制文章)。
2. 选择读写分离方案
常见的读写分离实现方案: 1. 应用程序级实现: - 在应用程序代码中明确区分读写操作,通过数据源连接到主库或从库。 2. 中间件实现: - 使用数据库中间件(如 ProxySQL、Mycat、MaxScale)自动管理读写分离。
以下以 ProxySQL 为例。
基于 ProxySQL 实现读写分离
2.1 安装 ProxySQL
在代理服务器(或同一应用服务器)上安装 ProxySQL:
sudo apt install proxysql # Ubuntu/Debian
sudo yum install proxysql # CentOS
2.2 配置 ProxySQL
编辑 ProxySQL 配置,连接主库和从库。
- 登录 ProxySQL 管理界面:
mysql -u admin -p -h 127.0.0.1 -P 6032
- 配置后端 MySQL 节点:
-- 添加主库(写操作)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (10, '主库IP', 3306);
-- 添加从库(读操作)
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (20, '从库IP', 3306);
- 配置用户认证:
-- 设置连接 ProxySQL 的用户
INSERT INTO mysql_users (username, password, default_hostgroup) VALUES ('db_user', 'password', 10);
- 配置读写分离规则:
-- 写操作规则(匹配 INSERT/UPDATE/DELETE)
INSERT INTO mysql_query_rules (rule_id, match_pattern, destination_hostgroup) VALUES (1, '^INSERT|UPDATE|DELETE', 10);
-- 读操作规则(匹配 SELECT)
INSERT INTO mysql_query_rules (rule_id, match_pattern, destination_hostgroup) VALUES (2, '^SELECT', 20);
- 应用配置并保存:
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
2.3 配置应用程序
将应用程序连接 ProxySQL 的地址:
- 主机:代理服务器 IP 或 127.0.0.1
(本地)
- 端口:3306
应用程序不需要关心主库或从库的区别,ProxySQL 会自动分发请求。
读写分离的注意事项
- 数据延迟:主从复制存在一定延迟,读请求可能获取不到最新写入的数据。
- 解决方法:设置从库的
semi-sync
半同步复制模式。 - 高可用性:为避免 ProxySQL 本身成为单点故障,可以部署 ProxySQL 集群。
- 负载均衡:在多个从库间设置负载均衡规则,避免某一从库过载。
- 从库只读:确保从库的
read_only
参数开启,避免意外写入。