资讯动态

ProxySQL SQLite3 Server 实战:用 Sysbench 对内置 SQLite 后端做压测与配置详解

发布时间:2026/10/9 2:42:26 来源:尧图企业网站定制
后端数据库负载均衡【免费下载链接】proxysqlHigh-performance proxy for MySQL and PostgreSQL项目地址https://gitcode.com/gh_mirrors/pr/proxysql点击查看免费下载导读本文基于 ProxySQL 仓库中的压测笔记 notes/run_sysbench_on_sqlite3.md完整讲解如何把 ProxySQL 的 MySQL 流量路由到内置 SQLite3 Server默认 6030 端口并用 Sysbench 对它执行 OLTP 压测。你会掌握三件事如何通过 Admin 接口配置mysql_servers/mysql_users/mysql_query_rules搭建MySQL 客户端 → ProxySQL → SQLite3链路如何用三条查询规则把 MySQL 风格的建表语句改写为 SQLite 兼容语法以及如何正确编写prepare与run两个阶段的 Sysbench 命令并读懂其参数含义。一、为什么要用 Sysbench 压测 SQLite3 ServerProxySQL 提供了一个可选的内置 SQLite3 Server以--sqlite3-server参数启动后ProxySQL 会在 6030 端口默认值监听 MySQL 协议把 MySQL 客户端发来的 SQL 翻译成 SQLite 命令执行再把结果按 MySQL 协议返回功能说明详见 doc/SQLite3-Server.md。Sysbench 是最常用的 MySQL OLTP 压测工具恰好可以充当该链路的客户端压力源。用 Sysbench 对 SQLite3 Server 压测的价值在于端到端验证协议翻译Sysbench 走的是标准 MySQL 协议压测过程能检验 ProxySQL 的 MySQL→SQLite 翻译层是否稳定轻量基准测试无需搭建真实 MySQL 实例即可获得一条MySQL 客户端 → ProxySQL → SQLite完整数据通路的性能基线回归保护仓库自带的 test/legacy_python_tests/sysbench_test.py 正是用 Sysbench 验证ProxySQL 在温和 Sysbench 负载下不崩溃说明该场景是官方维护的测试路径之一。二、前置准备以 SQLite3 Server 模式启动 ProxySQLproxysql --sqlite3-server启动后端口分配如下与 doc/SQLite3-Server.md 中的说明一致端口角色是否默认启用说明6032Admin 接口总是启用用于配置、查看 stats / monitor 库6030SQLite3 Server需--sqlite3-server对外提供 MySQL 协议内部落地到 SQLite6033MySQL 前端proxy随主服务启用Sysbench 等 MySQL 客户端连接的入口源码佐证在 src/main.cpp 中只有当GloVars.global.sqlite3_server true时才调用ProxySQL_Main_init_SQLite3Server()而 src/SQLite3_Server.cpp 中默认绑定地址即127.0.0.1:6030并可通过mysql_ifaces变量调整监听地址。三、Admin 接口配置把流量路由到 SQLite3 Server压测的关键一步是在 ProxySQL 的 Admin 接口mysql -h 127.0.0.1 -P 6032 -u admin -p admin中声明一个后端让 6033 端口收到的 MySQL 流量被路由到 6030 的 SQLite3 Server。以下 SQL 来自 notes/run_sysbench_on_sqlite3.md逐段说明insert into mysql_servers (hostgroup_id, hostname, port) values (100,127.0.0.1,6030); insert into mysql_users (username,password,default_hostgroup) values (sqlite,sqlite,100); save mysql users to disk; load mysql users to runtime; save mysql servers to disk; load mysql servers to runtime;要点mysql_servers把一个虚拟后端注册进 hostgroup 100主机名是127.0.0.1端口是 SQLite3 Server 的6030。ProxySQL 会把它当作普通 MySQL 后端来建立连接、转发查询mysql_users注册压测账号用户名/密码均为sqlitedefault_hostgroup100保证该用户的所有流量默认进入 hostgroup 100save ... to disk持久化配置load ... to runtime将配置加载到运行态两条命令必须成对执行才能让改动即时生效。三条查询规则把 MySQL 建表语句翻译成 SQLiteSysbench 的prepare阶段会用 MySQL 语法创建sbtest表但 SQLite 的 DDL 与 MySQL 存在三处差异因此需要借助 ProxySQL 的查询重写query rules在转发前改写 SQLINSERT INTO mysql_query_rules (active,username,match_digest,match_pattern,replace_pattern,apply) values (1,sqlite,^CREATE TABLE sbtest,id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,0); INSERT INTO mysql_query_rules (active,username,match_digest,match_pattern,replace_pattern,apply) values (1,sqlite,^CREATE TABLE sbtest,pad CHAR\(60\) DEFAULT NOT NULL,,pad CHAR(60) DEFAULT NOT NULL,0); INSERT INTO mysql_query_rules (active,username,match_digest,match_pattern,replace_pattern,apply) values (1,sqlite,^CREATE TABLE sbtest,PRIMARY KEY \(id\),,0); save mysql query rules to disk; load mysql query rules to runtime;三条规则的作用与实现要点主键类型改写match_patternid INTEGER UNSIGNED NOT NULL AUTO_INCREMENT→replace_patternid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT。SQLite 不支持AUTO_INCREMENT与INTEGER UNSIGNED等价语法是INTEGER PRIMARY KEY AUTOINCREMENT字段定义清理match_patternpad CHAR\(60\) DEFAULT NOT NULL,→replace_patternpad CHAR(60) DEFAULT NOT NULL。注意模式中\(\)是对圆括号的正则转义替换时去除转义恢复字面括号删除重复主键约束match_patternPRIMARY KEY \(id\)→replace_pattern空串。因为第 1 条规则已在列定义中声明PRIMARY KEYSysbench 建表语句末尾若再出现PRIMARY KEY (id)会与 SQLite 的语法冲突直接整体删除。共同点active1启用规则usernamesqlite仅对该压测账号生效match_digest^CREATE TABLE sbtest限定只匹配建表语句避免误伤后续的 DMLapply0表示这是一条独立的改写规则不继续匹配其他规则链。最后同样通过saveload让规则进入运行态。四、Sysbench prepare生成测试数据sysbench --db-drivermysql --test/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-tables-count10 --oltp-table-size10000 --mysql-host127.0.0.1 --mysql-dbtest --mysql-engine-trxyes --mysql-port6033 --mysql-usersqlite --mysql-passwordsqlite --num-threads10 prepare参数逐一说明参数值含义--db-drivermysqlmysql以 MySQL 协议驱动连接--test.../oltp.luaoltp_legacy使用经典 OLTP 脚本生成表结构与数据--oltp-tables-count1010生成 10 张sbtest表--oltp-table-size1000010000每张表插入 1 万行--mysql-host/--mysql-port127.0.0.1 / 6033连接 ProxySQL 前端而非直连 6030--mysql-user/--mysql-passwordsqlite / sqlite对应上一步mysql_users中注册的账号--mysql-dbtesttest指定默认数据库SQLite3 Server 中即mainschema 下的数据库概念--num-threads1010prepare 阶段并发线程数prepare—执行建表与数据装载阶段注意Sysbench 的prepare阶段发出的建表语句会在经过 6033 前端时被第三条查询规则改写最终以 SQLite 语法落在 SQLite3 Server 的存储中——这就是MySQL 压测工具写 SQLite 数据的关键链路。五、Sysbench run执行 OLTP 压测sysbench --report-interval3 --db-drivermysql /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --time15 --oltp-tables-count10 --oltp-table-size10000 --mysql-host127.0.0.1 --mysql-dbtest --mysql-engine-trxyes --oltp-skip-trxoff --mysql-port6033 --mysql-usersqlite --mysql-passwordsqlite --threads10 run与 prepare 阶段相比run阶段的关键差异参数--report-interval3每 3 秒输出一次实时吞吐统计tps、qps、延迟分布便于观察压力曲线--time15压测持续 15 秒后自动结束--oltp-skip-trxoff开启事务语义让每个 OLTP 请求按BEGIN 读写 COMMIT的真实事务流程执行这正是验证 ProxySQL 事务转发链路包括对 SQLite 的 BEGIN/COMMIT 翻译的关键开关--threads1010 个并发压测线程其余参数与 prepare 保持一致确保读的是同一批sbtest表。仓库测试用例对照仓库 test/legacy_python_tests/proxysql_base_test.py 中的run_sysbench_proxysql()展示了官方测试采用的同类命令形态prepare→run→cleanup三阶段并特别说明 Sysbench 与 ProxySQL 部署在同一容器内以降低网络延迟对基准的影响。对应测试 test/legacy_python_tests/sysbench_test.py 的断言目标是ProxySQL 在温和 Sysbench 负载下不崩溃——这提示我们在本场景中更应关注prepare是否成功建表改写是否正确、run是否报错协议翻译是否稳定而非单纯追求极限 TPS。六、运行中的注意点与限制结合 doc/SQLite3-Server.md 的 Limitations 与源码压测时需留意SQLite 单写者模型SQLite 对写事务采用串行化busy/locked 处理高并发写时吞吐会明显低于真实 MySQL。源码 src/SQLite3_Server.cpp 中SAFE_SQLITE3_STEP2宏对SQLITE_LOCKED/SQLITE_BUSY采用usleep(100)重试策略说明并发写冲突是设计上就预期存在的现象压测结果应结合这一前提解读数据易失性SQLite3 Server 的表与数据默认是临时的除非使用外部创建的 SQLite 数据库每次重启后需要重新prepare仅有一个数据库SQLite3 Server 对外只暴露mainschema--mysql-dbtest本质上是映射到该 schema不要期待多数据库隔离规则匹配范围三条 query rules 的match_digest只匹配^CREATE TABLE sbtest若 Sysbench 版本/脚本生成的建表语句前缀不同需要相应调整match_pattern地址绑定SQLite3 Server 默认只监听127.0.0.1:6030跨主机压测时需通过mysql_ifaces变量显式放开监听地址。七、小结以 Sysbench 压测 ProxySQL 内置 SQLite3 Server是一条零依赖、可复现的端到端链路验证方案Admin 配置mysql_serversmysql_users 三条 DDL 改写规则打通路由prepare验证建表翻译run验证事务与读写转发。完整的配置脚本与命令均可直接在 notes/run_sysbench_on_sqlite3.md 中找到结合 doc/SQLite3-Server.md 与 src/SQLite3_Server.cpp 源码即可快速复现并对结果做出合理解读。赞分享后端数据库负载均衡【免费下载链接】proxysqlHigh-performance proxy for MySQL and PostgreSQL项目地址https://gitcode.com/gh_mirrors/pr/proxysql点击查看免费下载相关推荐ProxySQL 内置 SQLite3 Server 实战指南用 MySQL 客户端直连 SQLite 的协议翻译层ProxySQL 内置 SQLite3 Server 实战指南用 MySQL 客户端直连 SQLite 的协议翻译层 本指南系统讲解 ProxySQL 内置后端数据库负载均衡终极指南Remotely远程控制解决方案的数据库配置详解SQLite、SQL Server与PostgreSQL对比终极指南Remotely远程控制解决方案的数据库配置详解SQLite、SQL Server与PostgreSQL对比 Remotely是一款基于.NET后端桌面应用运维LND 的 SQLite 数据库后端配置项、默认 PRAGMA 与自动压缩实战指南LND 的 SQLite 数据库后端配置项、默认 PRAGMA 与自动压缩实战指南 本篇技术指南以 LND 官方文档 docs/sqlite.md https区块链上一篇EasyXMen目录结构全解BSWCode、RTOS、Drivers、Examples各目录分工详解下一篇使用 AWS SDK for .NET 构建 Amazon SES v2 优惠券新闻邮件工作流从联系人列表到模板化群发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑