ProxySQL 详细安装与配置指南(MySQL主从集群)
一、环境准备
- 主库(Master): 192.168.1.160
- 从库(Slave1): 192.168.1.20
- 从库(Slave2): 192.168.1.29
- ProxySQL节点: 建议独立服务器(可与应用同机)
二、ProxySQL安装
1. 安装ProxySQL
# Ubuntu/Debian
wget https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/$(lsb_release -cs)/proxysql_2.4.2-ubuntu20_amd64.deb
sudo dpkg -i proxysql_*.deb
sudo systemctl start proxysql
sudo systemctl enable proxysql
# CentOS/RHEL
cat <<EOF | sudo tee /etc/yum.repos.d/proxysql.repo
[proxysql]
name=ProxySQL
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/repo_pub_key
EOF
sudo yum install proxysql
sudo systemctl start proxysql
sudo systemctl enable proxysql
2. 验证安装
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt="ProxySQL Admin> "
# 密码默认是admin:admin
三、基础配置
1. 添加MySQL服务器
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'192.168.1.160',3306), -- 主库hostgroup 10
(20,'192.168.1.20',3306), -- 从库hostgroup 20
(20,'192.168.1.29',3306); -- 从库hostgroup 20
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
2. 配置监控用户
在主库创建监控账号:
CREATE USER 'monitor'@'%' IDENTIFIED BY 'Monitor@123';
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;
ProxySQL配置:
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='Monitor@123' WHERE variable_name='mysql-monitor_password';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
3. 配置读写分离规则
-- 设置主库组
INSERT INTO mysql_replication_hostgroups VALUES (10,20,'read_only','ProxySQL集群');
LOAD MYSQL SERVERS TO RUNTIME;
-- 验证自动检测
SELECT hostgroup_id,hostname,status FROM runtime_mysql_servers;
四、高级路由配置
1. 创建应用访问用户
在主库执行:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppUser@123';
GRANT ALL ON *.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
ProxySQL配置:
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES
('appuser','AppUser@123',10); -- 默认路由到主库
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
2. 读写分离规则
-- 写操作路由到主库(hostgroup 10)
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^INSERT',10,1),
(2,1,'^UPDATE',10,1),
(3,1,'^DELETE',10,1),
(4,1,'^ALTER',10,1);
-- 读操作路由到从库(hostgroup 20)
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(5,1,'^SELECT.*FOR UPDATE',10,1), -- SELECT FOR UPDATE特殊处理
(6,1,'^SELECT',20,1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
3. 验证路由
-- 查看路由统计
SELECT hostgroup,sum_time,count_star FROM stats_mysql_query_digest;
五、健康检查与故障转移
1. 配置健康检查
UPDATE global_variables SET variable_value='2000' WHERE variable_name='mysql-monitor_connect_timeout';
UPDATE global_variables SET variable_value='2000' WHERE variable_name='mysql-monitor_read_only_timeout';
UPDATE global_variables SET variable_value='3000' WHERE variable_name='mysql-monitor_replication_lag_interval';
UPDATE global_variables SET variable_value='10' WHERE variable_name='mysql-monitor_replication_lag_count';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
2. 自动故障转移
-- 设置主库故障时提升从库
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,max_connections) VALUES
(10,'192.168.1.20',3306,1000,1000); -- 从库1作为备用主库
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
六、生产环境优化
1. 连接池配置
UPDATE global_variables SET variable_value='300' WHERE variable_name='mysql-max_connections';
UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-use_tcp_keepalive';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
2. 启用统计功能
UPDATE global_variables SET variable_value='true' WHERE variable_name='admin-stats_credentials';
UPDATE global_variables SET variable_value='statsuser:Stats@123' WHERE variable_name='admin-stats_credentials';
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;
七、监控与管理
1. 常用监控命令
-- 查看后端状态
SELECT hostgroup_id,hostname,status,ConnUsed,MaxConnUsed FROM runtime_mysql_servers;
-- 查询统计
SELECT hostgroup,digest,count_star,sum_time FROM stats_mysql_query_digest;
-- 连接池状态
SELECT * FROM stats_mysql_connection_pool;
2. 集成Prometheus
# 启用Prometheus exporter
UPDATE global_variables SET variable_value='0.0.0.0:42000' WHERE variable_name='admin-web_enabled';
LOAD ADMIN VARIABLES TO RUNTIME;
八、故障排查
1. 日志检查
tail -f /var/lib/proxysql/proxysql.log
2. 常见问题解决
-- 重置所有配置
LOAD MYSQL SERVERS FROM DISK;
LOAD MYSQL USERS FROM DISK;
LOAD MYSQL QUERY RULES FROM DISK;
九、配置备份
-- 导出配置
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
SAVE MYSQL VARIABLES TO DISK;
SAVE ADMIN VARIABLES TO DISK;
-- 物理备份
cp /var/lib/proxysql/proxysql.db /backup/
通过以上配置,您将获得:
✅ 自动读写分离
✅ 主库故障自动切换
✅ 细粒度SQL路由控制
✅ 连接池和性能优化
✅ 完善的监控体系
作者:admin 创建时间:2025-06-06 11:14
最后编辑:admin 更新时间:2025-06-07 09:49
最后编辑:admin 更新时间:2025-06-07 09:49