MySQL负载均衡配置详细步骤(新手易操作版)

MySQL负载均衡配置详细步骤(新手易操作版)

一、开篇说明:为什么需要MySQL负载均衡?

新手无需深入理解底层原理,只需记住核心:当MySQL服务器面临高并发访问(比如网站高峰期、APP用户暴涨)时,单台服务器会卡顿、崩溃,而负载均衡能将访问请求"分摊"到多台MySQL服务器上,实现"分流减压",同时提升系统稳定性------一台服务器故障,其他服务器可正常工作,避免服务中断。

本文选用 ProxySQL 实现负载均衡(新手首选),理由:轻量、配置简单、专门适配MySQL,无需复杂部署,全程步骤化操作,复制命令即可完成,避开Nginx负载均衡的复杂配置,专注MySQL场景。

前置准备(必做,避免后续踩坑):

  • 服务器准备(3台,建议CentOS7系统,新手可先用虚拟机模拟):

  • ProxySQL服务器:1台(负载均衡核心,接收所有请求并分流),IP:192.168.1.100

  • MySQL主库:1台(负责写入数据),IP:192.168.1.101

  • MySQL从库:1台(负责读取数据),IP:192.168.1.102

  • 前提条件:主库、从库已搭建好主从同步(主从同步教程),确保主从数据一致;3台服务器之间可相互ping通,关闭防火墙(或开放3306、6033端口)。

  • 工具准备:Xshell(远程连接服务器)、Navicat(可选,可视化测试连接)。

二、核心步骤:ProxySQL安装(负载均衡服务器操作)

重点:所有操作在ProxySQL服务器(192.168.1.100)上执行,全程复制命令即可,无需手动修改(除了自己的服务器IP)。

步骤1:安装ProxySQL(CentOS7系统,新手直接抄命令)

bash 复制代码
# 1. 下载ProxySQL官方安装包(适配CentOS7,64位)
wget https://github.com/sysown/proxysql/releases/download/v2.5.5/proxysql-2.5.5-1-centos7.x86_64.rpm

# 2. 安装依赖(避免安装失败)
yum install -y perl-DBI perl-DBD-MySQL

# 3. 安装ProxySQL
rpm -ivh proxysql-2.5.5-1-centos7.x86_64.rpm

# 4. 启动ProxySQL服务,并设置开机自启(避免服务器重启后失效)
systemctl start proxysql
systemctl enable proxysql

# 5. 验证是否安装成功(查看服务状态)
systemctl status proxysql

验证标准:执行最后一条命令后,显示"active (running)",说明ProxySQL启动成功(如下截图参考)。

步骤2:连接ProxySQL(核心操作,后续配置都在这里)

ProxySQL有两个管理端口,我们用默认的管理端口(6032)连接,默认用户名和密码都是admin,直接执行命令即可:

bash 复制代码
# 连接ProxySQL管理端(直接复制,无需修改)
mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt='ProxySQLAdmin>'

连接成功后,命令行提示符会变成"ProxySQLAdmin>",后续所有配置都在这个窗口执行,不要退出。

三、核心配置:ProxySQL关联MySQL主从库(关键步骤)

核心目的:让ProxySQL"认识"主库和从库,知道哪些是写库、哪些是读库,后续才能实现请求分流。全程在ProxySQL管理端(ProxySQLAdmin>)执行命令。

步骤1:添加MySQL主库、从库节点(告诉ProxySQL有哪些MySQL服务器)

sql 复制代码
-- 1. 添加主库节点(IP:192.168.1.101,端口3306,权重1,优先级1)
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, priority) VALUES (1, '192.168.1.101', 3306, 1, 1);

-- 2. 添加从库节点(IP:192.168.1.102,端口3306,权重1,优先级2)
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, priority) VALUES (2, '192.168.1.102', 3306, 1, 2);

-- 3. 查看添加的节点(验证是否添加成功)
SELECT * FROM mysql_servers;

关键说明(新手必看):

  • hostgroup_id(分组ID):我们约定"1"代表写组(主库),"2"代表读组(从库),固定不变,后续配置会用到。

  • weight(权重):数值越大,分配到的请求越多,新手默认设为1即可(主从请求均分)。

  • priority(优先级):数值越小,优先级越高,主库优先级设为1,从库设为2,确保写请求优先走主库。

验证标准:执行SELECT命令后,能看到主库(192.168.1.101)和从库(192.168.1.102)的信息,即为添加成功。

步骤2:配置MySQL用户(ProxySQL连接主从库的权限)

需要创建一个专门用于ProxySQL连接MySQL主从库的用户(主库、从库都要创建,用户名密码一致),分两步操作:先在MySQL主库创建用户,再在ProxySQL中配置该用户。

第一步:在MySQL主库(192.168.1.101)创建用户

sql 复制代码
-- 登录MySQL主库(执行命令,输入主库root密码)
mysql -uroot -p

-- 创建用户(用户名:proxysql_user,密码:Proxysql@123,可自定义,记好后续要用)
CREATE USER 'proxysql_user'@'%' IDENTIFIED BY 'Proxysql@123';

-- 授予该用户所有权限(确保ProxySQL能正常读写主从库)
GRANT ALL PRIVILEGES ON *.* TO 'proxysql_user'@'%';

-- 刷新权限(立即生效)
FLUSH PRIVILEGES;

-- 退出主库
exit;

说明:主库创建用户后,因为主从同步,从库会自动同步该用户,无需在从库重复创建。

第二步:在ProxySQL管理端配置该用户

sql 复制代码
-- 切换到ProxySQL管理端(之前已连接,若退出重新连接即可)
-- 插入用户信息(用户名、密码,与主库创建的一致)
INSERT INTO mysql_users (username, password, default_hostgroup, active) 
VALUES ('proxysql_user', 'Proxysql@123', 1, 1);

-- 查看用户配置(验证是否添加成功)
SELECT * FROM mysql_users;

关键说明:default_hostgroup=1,代表默认连接写组(主库),写请求优先走主库,读请求会自动分流到读组(从库)。

步骤3:配置读写分离规则(核心,实现请求分流)

通过规则设置:所有写操作(INSERT、UPDATE、DELETE)走主库(hostgroup_id=1),所有读操作(SELECT)走从库(hostgroup_id=2),新手直接复制命令执行,无需修改。

sql 复制代码
-- 插入读写分离规则(写操作走主库)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (1, 1, '^INSERT|^UPDATE|^DELETE', 1, 1);

-- 插入读写分离规则(读操作走从库)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (2, 1, '^SELECT', 2, 1);

-- 查看规则(验证是否添加成功)
SELECT * FROM mysql_query_rules;

说明:match_digest是匹配规则,INSERT|UPDATE|^DELETE 表示匹配所有以INSERT、UPDATE、DELETE开头的写语句,路由到主库;^SELECT 表示匹配所有读语句,路由到从库。

步骤4:应用配置(关键,所有配置生效的最后一步)

前面所有配置都存在ProxySQL的内存中,需要执行以下命令,将配置保存到磁盘并应用,否则重启ProxySQL后配置会丢失:

sql 复制代码
-- 1. 保存配置到磁盘(永久生效)
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

-- 2. 应用配置(立即生效,无需重启ProxySQL)
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

执行后无报错,说明配置已生效,ProxySQL负载均衡核心配置完成!

四、测试验证:确认负载均衡生效(新手必做)

核心:通过ProxySQL连接MySQL,执行读写操作,验证写请求走主库、读请求走从库,确认负载均衡生效,步骤简单,直接复制命令。

步骤1:通过ProxySQL连接MySQL(任意一台服务器都可执行)

bash 复制代码
# 连接ProxySQL的MySQL服务端口(6033,不是管理端口6032)
# 用户名、密码是之前创建的proxysql_user,IP是ProxySQL服务器IP(192.168.1.100)
mysql -uproxysql_user -pProxysql@123 -h192.168.1.100 -P6033

连接成功后,即可执行读写操作,测试分流效果。

步骤2:测试写操作(验证走主库)

sql 复制代码
-- 1. 创建测试数据库(写操作,应走主库)
CREATE DATABASE IF NOT EXISTS test_load;

-- 2. 切换到测试数据库
USE test_load;

-- 3. 创建测试表(写操作)
CREATE TABLE IF NOT EXISTS user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);

-- 4. 插入测试数据(写操作)
INSERT INTO user (name, age) VALUES ('test1', 20), ('test2', 22);

验证方法:登录主库(192.168.1.101),查看是否有test_load数据库和user表,有则说明写操作走主库,正确。

步骤3:测试读操作(验证走从库)

sql 复制代码
-- 1. 继续在ProxySQL连接窗口执行读操作(SELECT)
SELECT * FROM user;

-- 2. 验证读操作走从库:登录从库(192.168.1.102),执行同样的查询,能看到相同数据
-- 3. 进一步验证:在从库中手动修改一条数据(比如将test1的age改为25)
-- 登录从库执行:
UPDATE user SET age=25 WHERE name='test1';
-- 4. 回到ProxySQL连接窗口,再次执行SELECT * FROM user; 会看到age=25,说明读操作走从库

验证标准:读操作能查询到从库修改后的数据,写操作只在主库生效,说明负载均衡和读写分离都已生效!

五、常见问题排查(新手必看,避坑指南)

新手配置中最容易遇到的3个问题,直接对照排查,快速解决:

  • 问题1:ProxySQL连接MySQL失败(报错"Access denied")

解决方案:1. 检查主库创建的proxysql_user用户密码是否正确;2. 检查主库用户授权是否正确(GRANT ALL PRIVILEGES);3. 检查主从库防火墙是否关闭,3306端口是否开放。

  • 问题2:读操作没有走从库(查询不到从库修改的数据)

解决方案:1. 检查mysql_query_rules规则是否添加正确(rule_id、match_digest是否正确);2. 重新执行"LOAD MYSQL QUERY RULES TO RUNTIME"应用规则;3. 检查主从同步是否正常(从库Slave_IO_Running和Slave_SQL_Running是否为Yes)。

  • 问题3:ProxySQL重启后,配置丢失

解决方案:确认已执行"SAVE MYSQL SERVERS/USERS/QUERY RULES TO DISK"命令,将配置保存到磁盘;重启ProxySQL后,执行"LOAD"命令重新加载配置。

六、总结(新手重点)

MySQL负载均衡(ProxySQL)配置核心就4步:安装ProxySQL → 添加MySQL主从节点 → 配置用户和读写规则 → 应用配置并测试,全程无需复杂理论,复制命令即可完成。

新手重点记住:ProxySQL是"中间层",所有MySQL访问都要通过ProxySQL(端口6033),它会自动将写请求分流到主库、读请求分流到从库,实现负载均衡,减轻单台服务器压力。

后续可根据实际需求,添加更多从库节点,调整节点权重,实现更合理的分流,新手先掌握基础配置,再逐步优化即可。

相关推荐
kcuwu.3 小时前
从Python\+MySQL到Redis:非关系型数据库详解(PyCharm实操版)
redis·python·mysql
工具罗某人3 小时前
docker compose 部署MySQL InnoDB Cluster + Router 高可用集群-亲测可用
mysql·docker·容器
猿小喵3 小时前
MySQL长时间未提交事务分析
数据库·mysql·性能优化
江不清丶3 小时前
深入剖析 MySQL 日志系统:Redo Log、Undo Log 与 Binlog 的协同工作原理
数据库·mysql·adb
cyber_两只龙宝3 小时前
【Nginx】Nginx配置负载均衡详解
linux·运维·nginx·云原生·负载均衡
光泽雨4 小时前
mysql中的事务
数据库·mysql
黑牛儿4 小时前
MySQL 备份与恢复详细步骤(新手版)
数据库·mysql·dba
fundoit4 小时前
MySQL问题收集
数据库·人工智能·mysql·智能体
计算机学姐4 小时前
基于SpringBoot的在线学习网站平台【个性化推荐+数据可视化+课程章节学习】
java·vue.js·spring boot·后端·学习·mysql·信息可视化