TOP云提供高性价比云服务器租用,有中国内地/港澳台、海外等全球各地节点,TOP云国内云服务器只要有域名备案号就能直接用,无须重复备案;港澳台及海外云服务器不用备案,购买之后直接使用,省时省力省心。价格实惠,续费同价,2核2G5M仅需27元每月,8核8G50M仅需66元每月,更多配置套餐请进入下面网址了解:
TOP云总站云服务器:https://topyun.vip/server/buy.html
TOP云C站云服务器:https://c.topyun.vip/cart
在云服务器上配置 MySQL 读写分离(Read/Write Splitting),是提升数据库性能、扩展性和高可用性的重要手段。它通过将读操作(如 SELECT)分散到多个从库(Slave),而写操作(如 INSERT、UPDATE、DELETE)仍然由主库(Master)处理,从而实现负载均衡,减轻主库压力。
一、MySQL 读写分离的基本原理
MySQL 读写分离依赖于主从复制(Replication)架构:
主库(Master):负责处理所有的写操作(INSERT、UPDATE、DELETE 等),并将数据变更通过二进制日志(Binary Log)同步到从库。
从库(Slave):通过复制主库的二进制日志,重放其中的事件,保持与主库的数据一致,主要用于处理读操作(SELECT)。
读写分离的核心是:应用层或中间件将读请求分发到从库,写请求发送到主库。
二、配置 MySQL 读写分离的整体流程
配置读写分离通常需要以下几个步骤:
搭建 MySQL 主从复制环境(确保主从数据同步正常)
配置多个从库(可选,根据需求增加从库数量)
选择读写分离的实现方式:
应用层实现(代码控制)
使用中间件(如 ProxySQL、MySQL Router、Atlas 等)
测试读写分离效果
下面将逐步详细介绍。
三、步骤 1:搭建 MySQL 主从复制(Master-Slave Replication)
⚠️ 注意:读写分离的前提是已经配置好主从复制,且从库能正常同步主库数据。
1.1 主库(Master)配置
① 编辑 MySQL 配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld]
# 启用二进制日志
log-bin=mysql-bin
# 设置 server-id,主从库必须不同
server-id=1
# 可选:设置需要同步的数据库(如果不设置则同步所有库)
# binlog-do-db=your_database_name
# 可选:设置不需要同步的数据库
# binlog-ignore-db=mysql
# binlog-ignore-db=information_schema
保存后重启 MySQL:
sudo systemctl restart mysqld
② 登录 MySQL,创建用于复制的用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
③ 查看主库状态,记录 File 和 Position:
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+
记录 File(如 mysql-bin.000001)和 Position(如 154),后续从库配置会用到。
1.2 从库(Slave)配置
① 编辑 MySQL 配置文件:
[mysqld]
# 启用中继日志
relay-log=mysql-relay-bin
# 设置 server-id,不能与主库相同
server-id=2
# 可选:设置只读模式(推荐)
read-only=1
保存后重启 MySQL:
sudo systemctl restart mysql
② 登录 MySQL,配置主库连接信息:
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='repl',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 替换为主库的 File
MASTER_LOG_POS=154; -- 替换为主库的 Position
③ 启动从库复制线程:
START SLAVE;
④ 检查从库状态:
SHOW SLAVE STATUS\G
重点关注以下两个字段:
Slave_IO_Running: Yes (IO 线程是否运行)
Slave_SQL_Running: Yes (SQL 线程是否运行)
如果均为 Yes,说明主从复制正常。
四、步骤 2:配置多个从库(可选)
如果需要更高的读取性能,可以添加多个从库(Slave2、Slave3...),配置方法与上述从库相同,只需保证:
每个从库的 server-id 唯一
每个从库都正确指向主库,并启动复制线程
多从库架构可以提高读请求的负载均衡能力,但需要应用层或中间件支持多从库连接。
五、步骤 3:实现读写分离的方式
实现读写分离主要有两种方式:
应用层实现(代码控制)
使用中间件(推荐)
方式 1:应用层实现读写分离(适合小型项目或定制化需求)
在应用程序中,通过代码逻辑判断 SQL 类型,将读请求发送到从库,写请求发送到主库。
示例(以 PHP + PDO 为例):
function getDbConnection($isRead) {
if ($isRead) {
// 读操作连接到从库
$dsn = 'mysql:host=从库IP;dbname=your_database';
} else {
// 写操作连接到主库
$dsn = 'mysql:host=主库IP;dbname=your_database';
}
return new PDO($dsn, 'username', 'password');
}
// 使用示例
$isRead = (strpos($sql, 'SELECT') === 0); // 简单判断是否为读操作
$db = getDbConnection($isRead);
$stmt = $db->query($sql);
缺点:
需要在代码中硬编码主从库地址,维护成本高
无法自动感知从库延迟或故障,可能导致读取到旧数据或失败
方式 2:使用中间件实现读写分离(推荐)
使用专门的数据库中间件,由中间件负责将读写请求路由到对应的数据库实例,无需修改应用代码。
常见的 MySQL 读写分离中间件包括:
中间件 | 特点 |
---|---|
ProxySQL | 轻量级、高性能、支持动态配置、支持查询缓存和故障转移 |
MySQL Router | MySQL 官方提供的轻量级中间件,与 MySQL InnoDB Cluster 集成良好 |
Atlas | 由奇虎 360 开源,支持分库分表 + 读写分离 |
MaxScale | MariaDB 官方提供的中间件,功能强大,支持读写分离、防火墙等 |
下面以 ProxySQL 为例,介绍如何配置读写分离。
六、步骤 4:使用 ProxySQL 实现读写分离(推荐)
6.1 安装 ProxySQL
以 Ubuntu 为例:
# 添加 ProxySQL 仓库
wget https://repo.proxysql.com/ProxySQL/repo_proxysql_2.0.deb
sudo dpkg -i repo_proxysql_2.0.deb
# 更新并安装
sudo apt update
sudo apt install proxysql
启动 ProxySQL:
sudo systemctl start proxysql
sudo systemctl enable proxysql
默认管理界面监听在 127.0.0.1:6032,可以使用 mysql 客户端连接:
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> '
默认用户名/密码:admin / admin
6.2 配置 ProxySQL
登录 ProxySQL 管理界面后,执行以下 SQL 配置:
① 配置主从库服务器信息
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '主库IP', 3306); -- 主库加入 hostgroup 10(写组)
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '从库1IP', 3306); -- 从库加入 hostgroup 20(读组)
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '从库2IP', 3306); -- 如果有多个从库
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
hostgroup_id=10:表示写组(主库)
hostgroup_id=20:表示读组(从库)
② 配置读写分离规则
-- 默认所有 SELECT 查询路由到读组(20)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT', 20, 1);
-- 所有写操作(INSERT/UPDATE/DELETE)路由到写组(10)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (2, 1, '^(INSERT|UPDATE|DELETE|REPLACE)', 10, 1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
③ 配置 MySQL 用户认证信息
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('root', 'your_password', 10); LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK;
这里配置的用户名和密码是应用连接 ProxySQL 时使用的凭据。
④ 配置监控模块(可选但推荐)
让 ProxySQL 监控主从库的状态,自动剔除不可用的从库:
UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-monitor_enabled'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK;
6.3 应用连接 ProxySQL
应用只需将数据库连接地址指向 ProxySQL 的 IP 和端口(默认 6033),无需关心后端是主库还是从库。
示例(PHP PDO):
$dsn = 'mysql:host=ProxySQL_IP;port=6033;dbname=your_database';
$db = new PDO($dsn, 'root', 'your_password');
ProxySQL 会根据配置的规则自动将读写请求路由到正确的后端数据库。
七、步骤 5:测试读写分离效果
7.1 写操作测试
在应用中执行一条 INSERT 或 UPDATE 语句,然后登录主库查看数据是否更新:
SELECT * FROM your_table;
7.2 读操作测试
执行 SELECT 查询,可以通过以下方式验证是否路由到从库:
在从库上执行 SHOW PROCESSLIST;,查看是否有来自 ProxySQL 的连接
在 ProxySQL 的管理界面执行:
SELECT * FROM stats_mysql_query_digest;
查看查询的路由情况。
八、注意事项与建议
主从同步延迟:
如果从库同步延迟较大,可能导致读取到旧数据。可以通过监控 Seconds_Behind_Master(在 SHOW SLAVE STATUS 中)来评估延迟情况。
对于一致性要求高的场景,可以强制某些查询走主库(如事务中的 SELECT)。
故障转移:
如果主库宕机,需要手动或通过工具(如 MHA、Orchestrator)将从库提升为主库,并更新 ProxySQL 配置。
ProxySQL 本身不提供自动故障转移功能,但可以与外部工具结合实现高可用。
读负载均衡:
ProxySQL 支持对多个从库进行负载均衡,确保读请求均匀分布。
监控与日志:
监控 ProxySQL 和 MySQL 的运行状态,及时发现并处理问题。
开启 ProxySQL 的查询日志(mysql-query-log_enabled)有助于排查问题。
九、总结
步骤 | 操作 |
---|---|
1 | 搭建 MySQL 主从复制环境(确保主从同步正常) |
2 | (可选)添加多个从库以提高读取性能 |
3 | 选择读写分离实现方式: - 应用层实现(代码控制) - 使用中间件(如 ProxySQL) |
4 | 测试读写分离效果,确保读写请求正确路由 |
5 | 监控主从同步状态和中间件运行情况 |
推荐方案:在生产环境中,使用 ProxySQL 等中间件实现读写分离,既能简化应用代码,又能灵活管理读写流量,同时支持高可用和负载均衡。