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_idactivematch_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 走只读组,执行 LOADSAVE
3) 故意不执行 SAVE 重启 ProxySQL,观察配置是否丢失并说明原因。
4) 在 stats_mysql_connection_pool 中观察连接池统计字段含义。