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),它会自动将写请求分流到主库、读请求分流到从库,实现负载均衡,减轻单台服务器压力。
后续可根据实际需求,添加更多从库节点,调整节点权重,实现更合理的分流,新手先掌握基础配置,再逐步优化即可。