14.8.2 ProxySQL集群部署与同步机制
ProxySQL 集群部署的核心目标是在多节点间保持配置一致、路由规则统一与故障时快速切换。推荐采用“单点变更、多点同步”策略:选择一个配置主节点进行变更,其余节点仅接收同步,避免配置漂移。
原理草图(集群同步与对外服务)#
关键概念与同步对象#
ProxySQL 配置分为三层:RUNTIME(运行态)、MEMORY(内存配置态)、DISK(持久化)。
集群同步围绕“管理表”进行,常见同步表:
- mysql_servers
- mysql_users
- mysql_query_rules
- mysql_replication_hostgroups
安装与基础配置示例(两节点)#
示例环境:
- ProxySQL-A:10.0.0.11
- ProxySQL-B:10.0.0.12
- 管理口:6032,代理口:6033
1)安装#
# CentOS/RHEL 7/8
sudo yum install -y https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/centos/7/x86_64/proxysql-2.5.x-1.x86_64.rpm
# Ubuntu/Debian
wget -O /tmp/proxysql.deb https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/debian/proxysql_2.5.x-1_amd64.deb
sudo dpkg -i /tmp/proxysql.deb
# 启动
sudo systemctl enable --now proxysql
2)设置 admin 账号与密码(两节点一致)#
编辑 /etc/proxysql.cnf:
admin_variables=
{
admin_credentials="admin:admin"
mysql_ifaces="0.0.0.0:6032"
}
mysql_variables=
{
interfaces="0.0.0.0:6033"
}
重启生效:
sudo systemctl restart proxysql
3)主节点配置后端与账号(ProxySQL-A)#
-- 登录管理口
mysql -uadmin -padmin -h10.0.0.11 -P6032
-- 1) 配置后端 MySQL
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES
(10,'10.0.0.21',3306,100),
(10,'10.0.0.22',3306,100);
-- 2) 配置用户
INSERT INTO mysql_users(username,password,default_hostgroup,active)
VALUES('appuser','app_pass',10,1);
-- 3) 加载到运行态并保存
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
集群同步配置示例#
1)配置 cluster 参数(两节点)#
-- ProxySQL-A (10.0.0.11)
UPDATE global_variables SET variable_value='cluster_user' WHERE variable_name='cluster_username';
UPDATE global_variables SET variable_value='cluster_pass' WHERE variable_name='cluster_password';
UPDATE global_variables SET variable_value='2000' WHERE variable_name='cluster_check_interval_ms';
-- ProxySQL-B (10.0.0.12)
UPDATE global_variables SET variable_value='cluster_user' WHERE variable_name='cluster_username';
UPDATE global_variables SET variable_value='cluster_pass' WHERE variable_name='cluster_password';
UPDATE global_variables SET variable_value='2000' WHERE variable_name='cluster_check_interval_ms';
2)添加 peer(两节点互相添加)#
-- 在 A 上添加 B
INSERT INTO proxysql_servers(hostname,port,weight,comment) VALUES ('10.0.0.12',6032,1,'proxysql-b');
-- 在 B 上添加 A
INSERT INTO proxysql_servers(hostname,port,weight,comment) VALUES ('10.0.0.11',6032,1,'proxysql-a');
LOAD PROXYSQL SERVERS TO RUNTIME;
SAVE PROXYSQL SERVERS TO DISK;
3)启用同步表(主节点)#
UPDATE global_variables SET variable_value='true' WHERE variable_name='cluster_mysql_servers';
UPDATE global_variables SET variable_value='true' WHERE variable_name='cluster_mysql_users';
UPDATE global_variables SET variable_value='true' WHERE variable_name='cluster_mysql_query_rules';
UPDATE global_variables SET variable_value='true' WHERE variable_name='cluster_mysql_replication_hostgroups';
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;
4)触发同步(主节点)#
-- 在主节点完成变更后执行
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
同步验证与预期结果#
-- 在从节点验证同步是否完成
SELECT * FROM mysql_servers;
SELECT * FROM mysql_users;
-- 检查集群状态
SELECT * FROM stats_proxysql_servers;
预期效果:
- 从节点 mysql_servers、mysql_users 行数与主节点一致。
- stats_proxysql_servers 中状态为 Online。
常见排错与定位命令#
1)管理口不通或认证失败
# 检查端口
ss -lntp | grep 6032
# 验证账号
mysql -uadmin -padmin -h10.0.0.11 -P6032 -e "SELECT 1;"
2)不同步或漂移
-- 检查集群开关
SELECT variable_name,variable_value FROM global_variables
WHERE variable_name LIKE 'cluster%';
-- 对比表内容
SELECT COUNT(*) FROM mysql_servers;
SELECT COUNT(*) FROM mysql_users;
3)忘记 LOAD/SAVE 导致重启丢失
-- 发现配置在 RUNTIME 有、DISK 没有时,补保存
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
4)避免多点修改
- 只在主节点改配置;
- 从节点只接收同步,不执行变更。
练习(动手验证)#
- 在主节点新增一个
mysql_users账号并同步到从节点。 - 在从节点确认用户存在,然后用该账号通过 ProxySQL 连接 MySQL。
- 手动停止主节点 ProxySQL,验证从节点仍能代理服务。
示例验证命令:
# 使用应用账号走代理连接
mysql -uappuser -papp_pass -h10.0.0.11 -P6033 -e "SELECT @@hostname;"