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_serversmysql_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)避免多点修改
- 只在主节点改配置;
- 从节点只接收同步,不执行变更。

练习(动手验证)#

  1. 在主节点新增一个 mysql_users 账号并同步到从节点。
  2. 在从节点确认用户存在,然后用该账号通过 ProxySQL 连接 MySQL。
  3. 手动停止主节点 ProxySQL,验证从节点仍能代理服务。

示例验证命令:

# 使用应用账号走代理连接
mysql -uappuser -papp_pass -h10.0.0.11 -P6033 -e "SELECT @@hostname;"