14.2.5 内置配置库与运行时内存模型
ProxySQL采用内置SQLite作为配置存储与持久化介质,所有配置与运行状态以表形式组织。其运行模式强调“内存优先”,大多数配置在内存中加载与计算,确保高吞吐与低延迟。理解配置库与内存模型是掌握ProxySQL运维与变更流程的关键。
内置配置库分为三类:运行时库(runtime_)、磁盘库(持久表)与统计/监控库(stats_、monitor_*)。三类库之间通过显式的加载与保存命令完成同步,避免隐式变更导致不一致。
安装与连接示例#
以下以常见包管理安装为例,安装后通过管理端口进入内置配置库:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y proxysql
# 启动并确认管理端口 6032
sudo systemctl enable --now proxysql
sudo ss -lntp | grep 6032
# 连接管理端口(默认用户/密码)
mysql -u admin -padmin -h 127.0.0.1 -P6032
进入后可直接查询配置表(磁盘库)与运行时库:
-- 磁盘库(持久化表)
SHOW TABLES FROM main;
-- 运行时库
SHOW TABLES FROM main WHERE Tables_in_main LIKE 'runtime_%';
-- 示例:查看后端节点(磁盘库)
SELECT hostgroup_id, hostname, port, weight, status FROM mysql_servers;
-- 示例:查看运行时生效的后端节点
SELECT hostgroup_id, hostname, port, weight, status FROM runtime_mysql_servers;
典型变更流程(示例可执行)#
目标:新增后端节点并让其生效,最后持久化到磁盘库。
-- 1) 写入磁盘库表(非运行时)
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight, status)
VALUES(10, '192.168.10.21', 3306, 100, 'ONLINE');
-- 2) 加载到运行时内存库
LOAD MYSQL SERVERS TO RUNTIME;
-- 3) 保存运行时到磁盘库(持久化)
SAVE MYSQL SERVERS TO DISK;
-- 4) 验证运行时生效
SELECT hostgroup_id, hostname, port, weight, status FROM runtime_mysql_servers;
预期效果:runtime_mysql_servers 中出现新增节点,且 ProxySQL 立即可进行连接转发。
常用核心表与字段解释#
mysql_servers:后端节点列表,hostgroup_id决定路由组,weight决定权重。mysql_users:前端用户认证,default_hostgroup指定默认路由组。mysql_query_rules:SQL路由规则,rule_id、active、match_pattern为核心。mysql_query_rules_fast_routing:快路径规则,需谨慎使用。stats_mysql_connection_pool:连接池实时统计。
示例:添加前端用户并加载生效。
INSERT INTO mysql_users(username, password, default_hostgroup, transaction_persistent)
VALUES('app_user', 'app_pass', 10, 1);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
SELECT username, default_hostgroup FROM runtime_mysql_users;
运行时内存模型要点#
运行时内存模型由多线程模块协作,核心数据结构包括:前端连接池、后端连接池、路由规则缓存、SQL解析与统计缓存。后台线程执行健康检查与资源回收,避免连接泄漏或规则失效。
排错清单与命令#
1) 规则不生效
检查是否加载到运行时:
SELECT rule_id, active, match_pattern FROM runtime_mysql_query_rules;
若为空,执行:
LOAD MYSQL QUERY RULES TO RUNTIME;
2) 新增节点不接流量
检查运行时状态:
SELECT hostname, status FROM runtime_mysql_servers;
若为 OFFLINE_SOFT/SHUNNED,查看原因:
SELECT hostgroup, srv_host, status, comment FROM monitor.mysql_server_connect_log
ORDER BY time_start_us DESC LIMIT 5;
3) 配置丢失或重启后消失
确认是否保存到磁盘:
SAVE ALL TO DISK;
配置备份与恢复示例#
建议定期导出内置SQLite配置库。
# 默认配置路径(按发行版可能不同)
sudo ls -l /var/lib/proxysql/proxysql.db
# 备份
sudo cp /var/lib/proxysql/proxysql.db /var/backups/proxysql.db.$(date +%F)
# 恢复(需停止服务)
sudo systemctl stop proxysql
sudo cp /var/backups/proxysql.db.2024-01-01 /var/lib/proxysql/proxysql.db
sudo systemctl start proxysql
练习#
1) 新增一个后端节点并验证其出现在 runtime_mysql_servers。
2) 创建一个 mysql_query_rules 规则,使 SELECT 走只读组,执行 LOAD 和 SAVE。
3) 故意不执行 SAVE 重启 ProxySQL,观察配置是否丢失并说明原因。
4) 在 stats_mysql_connection_pool 中观察连接池统计字段含义。