跳转至

读写分离

读写分离 是 MySQL 主从复制的一种扩展应用,通过让主库(Master)处理写操作,从库(Slave)处理读操作,实现数据库的负载均衡和性能优化。它通常结合中间件(如 ProxySQL 或 Mycat)实现透明化的读写分离。


读写分离的优势

  1. 性能提升:将读操作分发到从库,减少主库的负载。
  2. 高可用性:主库宕机时,从库可以切换为主库,保证业务连续性。
  3. 扩展性强:通过增加从库支持更多的读请求。

部署读写分离的步骤

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 配置,连接主库和从库。

  1. 登录 ProxySQL 管理界面:
mysql -u admin -p -h 127.0.0.1 -P 6032
  1. 配置后端 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);
  1. 配置用户认证:
-- 设置连接 ProxySQL 的用户
INSERT INTO mysql_users (username, password, default_hostgroup) VALUES ('db_user', 'password', 10);
  1. 配置读写分离规则:
-- 写操作规则(匹配 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);
  1. 应用配置并保存:
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 会自动分发请求。


读写分离的注意事项

  1. 数据延迟:主从复制存在一定延迟,读请求可能获取不到最新写入的数据。
  2. 解决方法:设置从库的 semi-sync 半同步复制模式。
  3. 高可用性:为避免 ProxySQL 本身成为单点故障,可以部署 ProxySQL 集群。
  4. 负载均衡:在多个从库间设置负载均衡规则,避免某一从库过载。
  5. 从库只读:确保从库的 read_only 参数开启,避免意外写入。