ProxySQL 多业务接口配置指南
ProxySQL 是一款功能强大的高性能MySQL代理,它允许用户通过灵活的配置来管理和路由数据库流量。其中一项重要的功能是支持监听多个网络接口和端口,从而为不同的应用或业务场景提供独立的连接接入点。本文将详细介绍如何在ProxySQL中配置和启用多个业务接口。
核心配置参数:mysql-interfaces
ProxySQL通过全局变量 mysql-interfaces 来定义其监听的客户端连接请求的网络接口和端口。这个变量接受一个以分号分隔的字符串列表,每个字符串代表一个 IP地址:端口号 的组合。例如,配置ProxySQL同时监听本地所有IP地址的6033端口和6034端口,可以将 mysql-interfaces 设置为 “0.0.0.0:6033;0.0.0.0:6034″。如果希望监听特定的IP地址,也可以进行相应配置,如 “192.168.1.100:6033;10.0.0.10:6034″。
需要特别注意的是,mysql-interfaces 是少数几个在运行时无法动态修改的全局变量之一。对其进行更改后,必须重启ProxySQL服务才能使新的配置生效。
配置步骤详解
以下步骤将指导您如何通过ProxySQL的管理接口来配置多个业务接口:
- 连接到ProxySQL管理接口: 首先,您需要使用MySQL客户端连接到ProxySQL的管理接口。默认情况下,管理接口监听在6032端口。您可以使用类似如下的命令进行连接(请根据您的实际用户名和密码进行替换):
mysql -u admin -padmin_password -h 127.0.0.1 -P 6032 –prompt=’ProxySQLAdmin> ‘
- 设置 mysql-interfaces 变量: 连接成功后,通过 SET 命令修改 mysql-interfaces 全局变量的值。例如,如果您希望ProxySQL监听在所有网络接口的6033端口和6034端口,可以执行:
SET mysql-interfaces=’0.0.0.0:6033;0.0.0.0:6034′;
或者,如果您只想在特定的IP地址上监听,例如 192.168.0.100 的 3306 和 3307 端口:
SET mysql-interfaces=’192.168.0.100:3306;192.168.0.100:3307′;
- 保存配置到磁盘: 为了确保ProxySQL重启后配置依然生效,需要将当前的运行时配置保存到磁盘。执行以下命令:
SAVE MYSQL VARIABLES TO DISK;
- 重启ProxySQL服务: 如前所述,mysql-interfaces 的更改需要重启ProxySQL才能生效。在管理接口中执行:
PROXYSQL RESTART;
或者,您也可以通过操作系统的服务管理工具(如 systemctl restart proxysql)来重启ProxySQL进程。
基于端口的流量路由
配置了多个业务接口后,您可能希望将来自不同端口的连接请求路由到不同的后端MySQL服务器集群(Hostgroups)。这可以通过在 mysql_query_rules 表中定义规则,并利用 proxy_port 字段来实现。
例如,假设您已经配置了两个后端主机组:hostgroup 1 用于写操作,hostgroup 2 用于读操作。现在,您希望所有通过 6033 端口进来的连接都路由到 hostgroup 1,所有通过 6034 端口进来的连接都路由到 hostgroup 2。可以插入如下查询规则:
INSERT INTO mysql_query_rules (rule_id, active, proxy_port, destination_hostgroup, apply) VALUES
(10, 1, 6033, 1, 1),
(20, 1, 6034, 2, 1);
- rule_id: 规则的唯一标识。
- active: 设置为1表示启用该规则。
- proxy_port: 指定该规则应用于哪个ProxySQL监听端口的流量。
- destination_hostgroup: 指定匹配该规则的流量将被路由到的目标主机组ID。
- apply: 设置为1表示应用该规则并停止处理后续规则(对于这种明确的端口路由场景)。
插入规则后,需要将规则加载到运行时并保存到磁盘:
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
注意事项与最佳实践
- 适用场景:配置多个业务接口在以下场景中非常有用:
- 为不同的应用程序或服务提供隔离的数据库接入点。
- 实现基于端口的读写分离,应用层可以直接连接到不同的端口来区分读写请求。
- 在迁移过程中,可以逐步将应用切换到新的端口,而旧端口仍然可用。
- 端口数量管理:虽然ProxySQL支持配置多个监听端口,但过多的端口可能会增加管理的复杂性。在某些情况下,例如需要为大量不同的数据库(schemas)提供路由,可以考虑使用单一监听端口,并结合 mysql_query_rules_fast_routing 表基于 schemaname 进行路由,或者使用更复杂的查询规则来区分流量。这种方式可以简化客户端配置,并将路由逻辑集中在ProxySQL内部。
- IP地址绑定:使用 0.0.0.0 会使ProxySQL监听在所有可用的网络接口上。如果您的服务器有多个网络接口,而您只想让ProxySQL在特定的接口上提供服务,请明确指定该接口的IP地址。
- 防火墙配置:确保您的防火墙规则允许外部连接到您在 mysql-interfaces 中配置的所有新端口。
- 监控与测试:配置完成后,务必从客户端测试连接到所有新配置的业务接口,并验证流量是否按照预期路由到正确的后端主机组。
总结
ProxySQL通过 mysql-interfaces 参数和灵活的查询规则,为用户提供了强大的多业务接口配置能力。通过合理规划和配置,您可以有效地管理不同来源的数据库连接请求,实现流量隔离、读写分离以及更精细化的路由控制。记住,对 mysql-interfaces 的修改需要重启ProxySQL服务,并在配置后进行充分的测试以确保其按预期工作。
ProxySQL 监控故障排查与解决指南
ProxySQL 全面故障排查与解决指南
ProxySQL 作为一款强大的 MySQL 代理工具,在高可用架构中扮演着至关重要的角色。然而,在实际运维过程中,可能会遇到各种问题,如后端服务器状态监控异常、连接池问题、查询路由失效等。本指南提供了一套系统化的 ProxySQL 故障排查方法,帮助您快速定位和解决问题。
排查流程概览
ProxySQL 故障排查应遵循以下基本流程:
- 基础状态检查:验证 ProxySQL 进程状态和基本连通性
- 后端服务器状态检查:检查 MySQL 服务器在 ProxySQL 中的状态
- 监控模块检查:验证健康检查机制是否正常工作
- 连接池状态分析:检查连接池使用情况和错误统计
- 查询路由与规则检查:验证查询路由规则是否正确应用
- 日志分析:检查 ProxySQL 日志和监控日志
- 配置一致性检查:确认配置在内存、运行时和磁盘间的一致性
- 性能指标分析:检查关键性能指标
- 解决方案实施:应用针对性解决方案
- 验证与监控:验证解决方案效果并持续监控
1. 基础状态检查
1.1 ProxySQL 进程状态检查
# 检查 ProxySQL 进程是否运行
ps aux | grep proxysql
# 检查 ProxySQL 服务状态(如果使用 systemd)
systemctl status proxysql
# 检查 ProxySQL 监听端口
netstat -tlnp | grep proxysql
# 或
ss -tlnp | grep proxysql
说明:首先确认 ProxySQL 进程是否正常运行。通常,ProxySQL 会监听多个端口:
- 默认 MySQL 客户端端口:6033
- 管理接口端口:6032
- 可能的其他自定义端口
1.2 基本连通性测试
# 测试管理接口连接
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQL Admin> '
# 测试客户端接口连接
mysql -u <用户名> -p<密码> -h 127.0.0.1 -P 6033 --prompt='ProxySQL> '
说明:验证是否能成功连接到 ProxySQL 的管理接口和客户端接口。如果连接失败,可能是 ProxySQL 进程问题、认证问题或网络问题。
2. 后端服务器状态检查
2.1 查看后端服务器配置和状态
-- 在 ProxySQL 管理接口执行
SELECT hostgroup_id, hostname, port, status, weight, max_connections
FROM mysql_servers;
说明:此命令显示所有配置的后端 MySQL 服务器及其状态。关注 status 列,可能的值包括:
ONLINE:服务器正常,接收流量SHUNNED:服务器暂时被隔离(通常因健康检查失败)OFFLINE_SOFT:服务器软下线,不接收新连接但保持现有连接OFFLINE_HARD:服务器硬下线,不接收新连接且断开现有连接
2.2 检查后端服务器网络连通性
# 从 ProxySQL 服务器测试到后端 MySQL 的网络连通性
ping <mysql_hostname>
# 测试 MySQL 端口连通性
telnet <mysql_hostname> <mysql_port>
# 或
nc -zv <mysql_hostname> <mysql_port>
说明:验证 ProxySQL 服务器是否能够网络层面访问后端 MySQL 服务器。如果网络不通,ProxySQL 的健康检查也会失败。
2.3 直接连接后端 MySQL 服务器
mysql -u <用户名> -p<密码> -h <mysql_hostname> -P <mysql_port>
说明:尝试直接连接后端 MySQL 服务器,验证 MySQL 服务是否正常运行且认证信息正确。
3. 监控模块检查
3.1 检查监控模块配置
-- 查看所有监控相关参数
SELECT variable_name, variable_value
FROM global_variables
WHERE variable_name LIKE 'mysql-monitor_%';
说明:检查监控模块的配置参数。特别关注以下关键参数:
mysql-monitor_enabled:监控模块是否启用(应为 1 或 true)mysql-monitor_username和mysql-monitor_password:用于健康检查的凭证mysql-monitor_connect_interval和mysql-monitor_connect_timeout:连接检查的频率和超时mysql-monitor_ping_interval和mysql-monitor_ping_timeout:PING 检查的频率和超时mysql-monitor_ping_max_failures:将服务器标记为 SHUNNED 前允许的连续 PING 失败次数
3.2 检查连接检查日志
-- 查看最近的连接检查日志
SELECT hostname, port, time_start_us, connect_success_time_us, connect_error
FROM monitor.mysql_server_connect_log
ORDER BY time_start_us DESC
LIMIT 20;
-- 针对特定服务器查看连接检查日志
SELECT hostname, port, time_start_us, connect_success_time_us, connect_error
FROM monitor.mysql_server_connect_log
WHERE hostname = '<mysql_hostname>'
ORDER BY time_start_us DESC
LIMIT 10;
说明:连接检查日志记录了 ProxySQL 尝试连接后端服务器的结果。connect_success_time_us 为 0 且 connect_error 不为 NULL 表示连接失败。如果没有特定服务器的日志记录,可能是监控模块未正确配置或未运行。
3.3 检查 PING 检查日志
-- 查看最近的 PING 检查日志
SELECT hostname, port, time_start_us, ping_success_time_us, ping_error
FROM monitor.mysql_server_ping_log
ORDER BY time_start_us DESC
LIMIT 20;
-- 针对特定服务器查看 PING 检查日志
SELECT hostname, port, time_start_us, ping_success_time_us, ping_error
FROM monitor.mysql_server_ping_log
WHERE hostname = '<mysql_hostname>'
ORDER BY time_start_us DESC
LIMIT 10;
说明:PING 检查日志记录了 ProxySQL 向后端服务器发送 MySQL PING 命令的结果。ping_success_time_us 为 0 且 ping_error 不为 NULL 表示 PING 失败。连续失败达到 mysql-monitor_ping_max_failures 次会触发服务器状态变更。
3.4 检查复制延迟检查日志(如适用)
-- 查看复制延迟检查日志
SELECT hostname, port, time_start_us, success_time_us, repl_lag, error
FROM monitor.mysql_server_replication_lag_log
ORDER BY time_start_us DESC
LIMIT 10;
说明:如果配置了复制延迟监控(max_replication_lag > 0),此日志记录复制延迟检查结果。
3.5 检查只读状态检查日志(如适用)
-- 查看只读状态检查日志
SELECT hostname, port, time_start_us, success_time_us, read_only, error
FROM monitor.mysql_server_read_only_log
ORDER BY time_start_us DESC
LIMIT 10;
说明:如果配置了读写分离(使用 mysql_replication_hostgroups 表),此日志记录只读状态检查结果。
4. 连接池状态分析
4.1 检查连接池统计信息
-- 查看所有连接池状态
SELECT * FROM stats.stats_mysql_connection_pool;
-- 针对特定主机组和服务器查看连接池状态
SELECT * FROM stats.stats_mysql_connection_pool
WHERE hostgroup = <hostgroup_id> AND srv_host = '<mysql_hostname>';
说明:连接池统计信息是诊断 ProxySQL 与后端服务器连接问题的关键。特别关注以下字段:
status:连接池状态,可能与mysql_servers表中的状态不同,更直接反映实时连接决策ConnUsed:当前使用中的连接数ConnFree:当前空闲的连接数ConnOK:成功建立的连接总数ConnERR:连接错误总数Queries:通过此连接池处理的查询总数
重要:stats.stats_mysql_connection_pool 中的 status 可能比 mysql_servers 表中的 status 更快反映服务器的实际状态变化。例如,服务器可能在 stats.stats_mysql_connection_pool 中已标记为 SHUNNED,但在 mysql_servers 表中仍显示为 ONLINE。
4.2 检查连接池内存使用情况
-- 查看连接池内存使用情况
SELECT * FROM stats_memory_metrics WHERE variable_name LIKE '%connection_pool%';
说明:检查连接池相关的内存使用情况,有助于诊断内存压力问题。
5. 查询路由与规则检查
5.1 检查查询规则配置
-- 查看所有查询规则
SELECT rule_id, active, match_pattern, destination_hostgroup, apply
FROM mysql_query_rules
ORDER BY rule_id;
说明:检查查询路由规则配置,确认规则是否正确设置且处于激活状态(active=1)。
5.2 检查查询处理器统计信息
-- 查看查询处理器统计信息
SELECT * FROM stats.stats_mysql_query_digest
ORDER BY sum_time DESC
LIMIT 10;
说明:查看哪些查询被处理以及它们的性能指标,有助于诊断查询路由问题。
5.3 检查查询规则应用情况
-- 查看查询规则应用情况
SELECT * FROM stats.stats_mysql_query_rules;
说明:检查各查询规则的匹配和应用次数,验证规则是否按预期工作。
6. 日志分析
6.1 检查 ProxySQL 错误日志
# 查看 ProxySQL 日志文件(位置可能因安装方式而异)
cat /var/lib/proxysql/proxysql.log
# 或
tail -n 100 /var/lib/proxysql/proxysql.log
# 或
journalctl -u proxysql
说明:ProxySQL 日志记录了服务启动、关闭、配置变更和错误等重要事件。日志位置可能因安装方式而异,常见位置包括 /var/lib/proxysql/proxysql.log 或通过 systemd 日志。
6.2 检查系统日志
# 检查系统日志中与 ProxySQL 相关的条目
grep proxysql /var/log/syslog
# 或
journalctl | grep proxysql
说明:系统日志可能包含 ProxySQL 进程启动、崩溃或资源限制相关的信息。
7. 配置一致性检查
7.1 检查配置在不同层次的一致性
ProxySQL 有三层配置:
- 内存中的配置(修改后的初始状态)
- 运行时配置(通过 LOAD TO RUNTIME 加载,实际生效)
- 磁盘配置(通过 SAVE TO DISK 保存,重启后生效)
-- 检查全局变量在内存和运行时的差异
SELECT variable_name, variable_value AS memory_value,
(SELECT variable_value FROM runtime_global_variables v2
WHERE v2.variable_name = v1.variable_name) AS runtime_value
FROM global_variables v1
WHERE variable_value <> (SELECT variable_value FROM runtime_global_variables v2
WHERE v2.variable_name = v1.variable_name)
ORDER BY variable_name;
-- 检查 mysql_servers 表在内存和运行时的差异
SELECT * FROM mysql_servers
EXCEPT
SELECT * FROM runtime_mysql_servers;
说明:这些查询帮助识别配置不一致问题,例如修改了配置但忘记加载到运行时。
7.2 加载和保存配置
-- 加载 MySQL 用户配置到运行时
LOAD MYSQL USERS TO RUNTIME;
-- 保存 MySQL 用户配置到磁盘
SAVE MYSQL USERS TO DISK;
-- 加载 MySQL 服务器配置到运行时
LOAD MYSQL SERVERS TO RUNTIME;
-- 保存 MySQL 服务器配置到磁盘
SAVE MYSQL SERVERS TO DISK;
-- 加载 MySQL 查询规则到运行时
LOAD MYSQL QUERY RULES TO RUNTIME;
-- 保存 MySQL 查询规则到磁盘
SAVE MYSQL QUERY RULES TO DISK;
-- 加载 MySQL 变量到运行时
LOAD MYSQL VARIABLES TO RUNTIME;
-- 保存 MySQL 变量到磁盘
SAVE MYSQL VARIABLES TO DISK;
-- 加载管理变量到运行时
LOAD ADMIN VARIABLES TO RUNTIME;
-- 保存管理变量到磁盘
SAVE ADMIN VARIABLES TO DISK;
说明:这些命令确保配置更改被正确应用到运行时并持久化到磁盘。许多 ProxySQL 问题源于配置更改后未执行这些命令。
8. 性能指标分析
8.1 检查全局统计信息
-- 查看全局计数器
SELECT * FROM stats.stats_mysql_global;
说明:全局计数器提供了 ProxySQL 整体性能和活动的概览。
8.2 检查命令计数器
-- 查看命令计数器
SELECT * FROM stats.stats_mysql_commands_counters;
说明:命令计数器显示各类 MySQL 命令的执行次数和延迟,有助于识别性能瓶颈。
8.3 检查后端服务器延迟
-- 查看后端服务器延迟
SELECT srv_host, Latency_us FROM stats.stats_mysql_connection_pool;
说明:后端服务器延迟是诊断性能问题的重要指标。
9. 解决方案实施
根据前述步骤的诊断结果,以下是常见问题的解决方案:
9.1 监控模块未正常工作
如果监控模块未检测到后端服务器状态变化:
-- 确保监控模块启用
SET mysql-monitor_enabled = true;
-- 验证监控用户凭证
SET mysql-monitor_username = 'monitor';
SET mysql-monitor_password = 'monitor_password';
-- 调整监控参数(示例值,根据实际需求调整)
SET mysql-monitor_connect_interval = 10000; -- 10秒
SET mysql-monitor_ping_interval = 5000; -- 5秒
SET mysql-monitor_ping_max_failures = 3; -- 3次失败后标记为SHUNNED
-- 加载并保存配置
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
-- 重启监控模块(通过临时禁用再启用)
SET mysql-monitor_enabled = false;
LOAD MYSQL VARIABLES TO RUNTIME;
-- 等待几秒
SET mysql-monitor_enabled = true;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
说明:这些步骤确保监控模块正确配置并重新初始化。
9.2 手动更改服务器状态
在紧急情况下,可以手动更改服务器状态:
-- 手动将服务器标记为离线(软)
UPDATE mysql_servers SET status='OFFLINE_SOFT'
WHERE hostname='<mysql_hostname>' AND port=<mysql_port>;
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
-- 手动将服务器标记为在线
UPDATE mysql_servers SET status='ONLINE'
WHERE hostname='<mysql_hostname>' AND port=<mysql_port>;
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
说明:手动更改状态应作为临时措施,同时应解决根本原因。
9.3 重启 ProxySQL 服务
如果其他方法无效,可以考虑重启 ProxySQL 服务:
# 使用 systemd 重启
systemctl restart proxysql
# 或在 ProxySQL 管理接口中重启
PROXYSQL RESTART;
说明:重启是最后的手段,可能导致短暂的服务中断。确保配置已保存到磁盘,否则重启后更改将丢失。
10. 验证与监控
10.1 验证解决方案效果
应用解决方案后,重复相关检查步骤验证问题是否解决:
-- 再次检查服务器状态
SELECT hostgroup_id, hostname, port, status FROM mysql_servers;
-- 检查连接池状态
SELECT * FROM stats.stats_mysql_connection_pool
WHERE srv_host = '<mysql_hostname>';
-- 检查监控日志
SELECT * FROM monitor.mysql_server_ping_log
WHERE hostname = '<mysql_hostname>'
ORDER BY time_start_us DESC LIMIT 5;
10.2 设置持续监控
建立持续监控机制,及早发现潜在问题:
-- 创建监控查询示例(可以通过外部脚本定期执行)
SELECT COUNT(*) AS online_servers
FROM mysql_servers WHERE status = 'ONLINE';
SELECT COUNT(*) AS problem_servers
FROM stats.stats_mysql_connection_pool
WHERE status <> 'ONLINE';
说明:将这些查询集成到监控系统中,设置适当的告警阈值。
常见问题与解决方案
问题 1: 服务器状态不一致
症状:mysql_servers 表显示服务器为 ONLINE,但 stats.stats_mysql_connection_pool 显示为 SHUNNED。
解决方案:
- 这通常是正常现象,
stats.stats_mysql_connection_pool更直接反映实时状态 - 等待几个监控周期,状态通常会同步
- 如需立即同步,可执行
LOAD MYSQL SERVERS FROM RUNTIME; LOAD MYSQL SERVERS TO RUNTIME;
问题 2: 监控日志中没有特定服务器的记录
症状:monitor.mysql_server_connect_log 或 monitor.mysql_server_ping_log 中没有特定服务器的记录。
解决方案:
- 确认服务器正确添加到
mysql_servers表 - 验证
mysql-monitor_enabled = true - 执行配置加载命令
- 临时禁用再启用监控模块重新初始化
问题 3: 连接池耗尽
症状:ConnUsed 接近 max_connections,新连接被拒绝。
解决方案:
- 增加
max_connections参数 - 检查后端 MySQL 服务器的
max_connections设置 - 优化应用程序连接管理,减少长连接或空闲连接
问题 4: 查询路由规则不生效
症状:查询未按预期路由到指定主机组。
解决方案:
- 检查规则优先级和顺序
- 确认规则已激活 (
active=1) - 验证匹配模式是否正确
- 确保执行了
LOAD MYSQL QUERY RULES TO RUNTIME;
结论
本指南提供了一套系统化的 ProxySQL 故障排查方法。通过遵循这些步骤,您可以快速定位和解决 ProxySQL 相关问题,确保数据库代理层的稳定运行。记住,在 ProxySQL 中,配置更改后必须显式加载到运行时并保存到磁盘才能生效,这是许多问题的常见根源。
定期检查监控日志和连接池状态,可以帮助您及早发现潜在问题,避免它们演变成严重故障。
ProxySQL 主机组调整与端口流量路由配置指南
本指南将帮助您完成以下任务:
- 将服务器 192.168.117.142 从主机组 1 移动到新的主机组 2
- 配置 ProxySQL 使通过 32161 端口连接的流量路由到主机组 2
- 确保通过该端口连接的用户具有完整的增删改查权限
步骤 1: 创建新的主机组并调整服务器分配
首先,我们需要将 192.168.117.142 服务器添加到主机组 2。在 ProxySQL 管理界面执行以下命令:
-- 删除服务器在主机组 1 中的记录
DELETE FROM mysql_servers WHERE hostname='192.168.117.142' AND hostgroup_id=1;
-- 将服务器添加到主机组 2
INSERT INTO mysql_servers(hostgroup_id, hostname, port, status, weight, max_connections)
VALUES (2, '192.168.117.142', 3306, 'ONLINE', 1, 1000);
-- 加载配置到运行时并保存到磁盘
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
步骤 2: 配置端口到主机组的路由规则
ProxySQL 2.7.x 版本中,我们需要使用查询规则来根据连接端口路由流量。首先,我们需要确保 32161 端口已经在 mysql_ifaces 中配置:
-- 检查当前的 mysql_ifaces 配置
SELECT variable_value FROM global_variables WHERE variable_name='mysql-mysql_ifaces';
-- 如果需要,更新 mysql_ifaces 配置(确保包含 32161 端口)
SET mysql-mysql_ifaces="0.0.0.0:6033;0.0.0.0:32161;0.0.0.0:33161";
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
接下来,我们需要创建一个查询规则,将来自 32161 端口的连接路由到主机组 2:
-- 创建查询规则,将 32161 端口的流量路由到主机组 2
INSERT INTO mysql_query_rules (rule_id, active, proxy_port, destination_hostgroup, apply)
VALUES (1, 1, 32161, 2, 1);
-- 加载查询规则到运行时并保存到磁盘
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
步骤 3: 确保用户权限配置
确保连接到 ProxySQL 的用户具有访问主机组 2 的权限:
-- 查看当前用户配置
SELECT * FROM mysql_users;
-- 更新用户配置,确保可以访问主机组 2
-- 假设用户名为 'root',根据您的实际用户名调整
UPDATE mysql_users
SET default_hostgroup=1,
frontend=1,
backend=1,
hostgroup_id='1,2' -- 允许访问主机组 1 和 2
WHERE username='root';
-- 如果需要为特定端口设置默认主机组
INSERT INTO mysql_users (username, password, default_hostgroup, frontend, backend, max_connections)
SELECT username, password, 2, frontend, backend, max_connections
FROM mysql_users
WHERE username='root'
LIMIT 1;
-- 加载用户配置到运行时并保存到磁盘
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
步骤 4: 验证配置
完成上述配置后,您可以通过以下方式验证配置是否生效:
- 检查服务器分配:
SELECT * FROM mysql_servers ORDER BY hostgroup_id;
- 检查查询规则:
SELECT * FROM mysql_query_rules;
- 检查用户配置:
SELECT * FROM mysql_users;
- 通过 32161 端口连接并测试:
mysql -u root -p -h 127.0.0.1 -P 32161
连接后,执行一些 SQL 语句测试增删改查权限:
-- 创建测试数据库和表
CREATE DATABASE IF NOT EXISTS test_routing;
USE test_routing;
CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
-- 测试插入
INSERT INTO test_table (name) VALUES ('test1'), ('test2');
-- 测试查询
SELECT * FROM test_table;
-- 测试更新
UPDATE test_table SET name='updated' WHERE id=1;
-- 测试删除
DELETE FROM test_table WHERE id=2;
-- 清理(可选)
DROP TABLE test_table;
DROP DATABASE test_routing;
步骤 5: 监控与故障排除
如果配置未按预期工作,可以检查以下内容:
- 检查 ProxySQL 监控日志:
SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
- 检查连接池状态:
SELECT * FROM stats.stats_mysql_connection_pool WHERE hostgroup IN (1,2);
查看特定主机ping的状态
SELECT hostname, port, time_start_us, ping_success_time_us, ping_error FROM monitor.mysql_server_ping_log WHERE hostname = '192.168.117.142' ORDER BY time_start_us DESC LIMIT 10;
- 检查查询路由统计:
SELECT * FROM stats.stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 10;
注意事项
- 端口路由限制:在 ProxySQL 2.x 版本中,端口路由功能可能不如 3.x 版本完善。如果遇到问题,考虑升级到 ProxySQL 3.x。
- 配置持久化:确保每次修改配置后都执行
LOAD ... TO RUNTIME和SAVE ... TO DISK命令,以确保配置生效并在重启后保留。 - 监控服务器状态:定期检查主机组 2 中服务器的状态,确保其保持
ONLINE。 - 备份配置:在进行重要配置更改前,建议备份 ProxySQL 配置:
proxysql-admin --backup-config
通过以上步骤,您应该能够成功将 192.168.117.142 服务器移动到主机组 2,并配置 32161 端口的流量路由到该主机组,同时保留完整的增删改查权限。