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 读写分离的整体流程

配置读写分离通常需要以下几个步骤:

  1. 搭建 MySQL 主从复制环境(确保主从数据同步正常)

  2. 配置多个从库(可选,根据需求增加从库数量)

  3. 选择读写分离的实现方式

    • 应用层实现(代码控制)

    • 使用中间件(如 ProxySQL、MySQL Router、Atlas 等)

  4. 测试读写分离效果

下面将逐步详细介绍。


三、步骤 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. 应用层实现(代码控制)

  2. 使用中间件(推荐)


方式 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 RouterMySQL 官方提供的轻量级中间件,与 MySQL InnoDB Cluster 集成良好
Atlas由奇虎 360 开源,支持分库分表 + 读写分离
MaxScaleMariaDB 官方提供的中间件,功能强大,支持读写分离、防火墙等

下面以 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;

    查看查询的路由情况。


八、注意事项与建议

  1. 主从同步延迟

    • 如果从库同步延迟较大,可能导致读取到旧数据。可以通过监控 Seconds_Behind_Master(在 SHOW SLAVE STATUS 中)来评估延迟情况。

    • 对于一致性要求高的场景,可以强制某些查询走主库(如事务中的 SELECT)。

  2. 故障转移

    • 如果主库宕机,需要手动或通过工具(如 MHA、Orchestrator)将从库提升为主库,并更新 ProxySQL 配置。

    • ProxySQL 本身不提供自动故障转移功能,但可以与外部工具结合实现高可用。

  3. 读负载均衡

    • ProxySQL 支持对多个从库进行负载均衡,确保读请求均匀分布。

  4. 监控与日志

    • 监控 ProxySQL 和 MySQL 的运行状态,及时发现并处理问题。

    • 开启 ProxySQL 的查询日志(mysql-query-log_enabled)有助于排查问题。


九、总结

步骤操作
1搭建 MySQL 主从复制环境(确保主从同步正常)
2(可选)添加多个从库以提高读取性能
3选择读写分离实现方式:
- 应用层实现(代码控制)
- 使用中间件(如 ProxySQL)
4测试读写分离效果,确保读写请求正确路由
5监控主从同步状态和中间件运行情况

推荐方案:在生产环境中,使用 ProxySQL 等中间件实现读写分离,既能简化应用代码,又能灵活管理读写流量,同时支持高可用和负载均衡。



不容错过
Powered By TOPYUN 云产品资讯