ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ProxySQL v1.2.2 版本深度解读:每线程连接缓存、查询处理器迭代与调度器重构

ProxySQL v1.2.2 版本深度解读:每线程连接缓存、查询处理器迭代与调度器重构 后端数据库负载均衡【免费下载链接】proxysqlHigh-performance proxy for MySQL and PostgreSQL项目地址https://gitcode.com/gh_mirrors/pr/proxysql点击查看免费下载本文以官方发布说明 ProxySQL_v1.2.2.md 为主体结合本仓库源码include、lib、tools、src等目录对该版本在连接池性能、查询处理器迭代、查询缓存、监控表结构与调度器scheduler等方面的变更进行逐项解读。读者可通过本文完整掌握 v1.2.2 引入的新变量、新表列、配置默认值变化及对应底层实现位置并可将其作为理解后续版本演进如mysql_replication_hostgroups、mysql_query_rules中comment列、scheduler 配置化等能力的起点。版本概览与发布信息ProxySQL v1.2.2 发布于2016-09-02是该系列在连接池与查询处理路径上的一次重要迭代。发布说明将变更划分为三大板块Performance improvement围绕连接池争用与 Logger 开销的性能优化Usability improvementMonitor 日志、管理接口输出、默认配置与打包方式的体验改进New features查询处理器迭代、查询缓存容量变量、scheduler 配置化等新能力Bug fixes涉及复制拓扑、Galera 检测、多路复用、统计与编译兼容等十余项修复。下文按主题对上述内容逐类展开并在每节附上当前仓库中的源码佐证路径。性能改进每线程连接缓存与 Logger 开销连接池引入 per-thread connection cacheissue #644v1.2.2 的核心性能改动是为连接池引入每线程连接缓存per-thread connection cache以降低连接池争用。该特性主要面向数千连接 很高mysql-threads值的高并发场景——当工作线程数很大时所有线程共享的连接池会成为明显的锁竞争热点将空闲连接按线程本地缓存后可显著减少线程间的互斥开销。在 include/proxysql_structs.h 中可以看到该机制在现代代码库中留下的线程本地状态痕迹例如__thread int mysql_thread___query_processor_iterations;等一批__thread变量而连接池侧的free_connections_pct等参数定义在 lib/MySQL_Thread.cpp默认值 10、取值范围 0100用于控制连接池中空闲连接的比例与回收行为与按线程缓存连接的设计相互配合。Logger禁用时降低开销issue #644同一 issue 下还包含一项 Logger 的次要性能优化当 Logger 被禁用时减少不必要的处理开销。在流量极大而无需查询日志的部署中关闭 Logger 本应是零成本的本版本收敛了禁用路径上残留的开销。Logger 的启用开关为mysql-enable_query_log_to_file等全局变量在 lib/MySQL_Logger.cpp 中实现。查询处理器迭代mysql-query_processor_iterations这是 v1.2.2 引入的最值得关注的新变量之一用于限制查询规则匹配的最大迭代次数。变量定义与默认值新变量mysql-query_processor_iterations默认值0向后兼容即默认行为与旧版本完全一致不进行迭代处理。在 lib/MySQL_Thread.cpp 中可以看到其默认值与取值边界的绑定默认值variables.query_processor_iterations 0;变量绑定区间0到1000*1000即 01,000,000。对应线程本地变量mysql_thread___query_processor_iterations声明于 include/proxysql_structs.h线程结构体字段定义于 include/MySQL_Thread.h。flagOUT / flagIN 迭代机制发布说明明确了该变量的核心语义如果mysql_query_rules.flagOUT被设置且mysql-query_processor_iterations大于 0则一条匹配成功的规则会设置flagIN并从规则表开头重新开始处理最多执行mysql-query_processor_iterations次迭代。这实际上提供了一种规则链 / 规则流水线能力查询先命中规则 A设置flagOUT随后处理器带着新的flagIN回到规则表头部继续匹配flagIN相等的规则从而支持复杂的多阶段改写、路由与镜像逻辑同时用迭代上限防止出现无限循环。mysql_query_rules表中flagIN、flagOUT、comment等列的 schema 定义可在 include/ProxySQL_Admin_Tables_Definitions.h 的ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_2等版本常量中查看该表同时体现了 v1.2.2 新增comment列的痕迹。规则处理器的实际执行位于 lib/MySQL_Query_Processor.cpp。查询缓存增强容量变量与全局统计新变量 mysql-query_cache_size_MBissue #171v1.2.2 新增mysql-query_cache_size_MB用于以 MB 为单位限定查询缓存Query Cache的最大内存占用取代以往仅靠默认值硬编码的做法使运维人员可以按实例内存预算精确配置。在 lib/MySQL_Thread.cpp 中默认值variables.query_cache_size_MB 256;即默认 256 MB变量绑定最小值为 0。该变量在线程本地变量表中声明于 include/proxysql_structs.hmysql_thread___query_cache_size_MB线程结构体字段定义于 include/MySQL_Thread.h。缓存实现侧lib/MySQL_Query_Cache.cpp 将该变量换算为字节级内存上限max_memory_size static_castuint64_t(mysql_thread___query_cache_size_MB * 1024ULL * 1024ULL);也就是说查询缓存的实际内存上限 mysql-query_cache_size_MB × 1024 × 1024字节超过该阈值后缓存会按既有淘汰策略工作。查询缓存指标进入 stats_mysql_globalissue #140伴随容量变量的引入查询缓存的运行指标也首次进入stats_mysql_global包括命中、未命中、缓存条目等计数便于通过 Admin 接口直接观察缓存收益。相关统计表的定义可参考 include/ProxySQL_Admin_Tables_Definitions.h 中的 stats 系列表结构统计实现位于 lib/ProxySQL_Admin_Stats.cpp。Admin 管理接口comment 列与 scheduler 重构新增 comment 列issue #643v1.2.2 在四张核心管理表中统一新增comment列表用途mysql_servers后端服务器节点mysql_replication_hostgroups复制拓扑宿主组映射mysql_query_rules查询规则scheduler定时任务comment列使运维人员可以为节点、规则、宿主组和任务补充可读的说明文字大幅提升多实例/多规则场景下的可维护性。当前仓库中 include/ProxySQL_Admin_Tables_Definitions.h 的ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_2_2定义即为mysql_servers引入comment列后的表结构快照comment VARCHAR NOT NULL ...。scheduler 的三连演进issues #649 / #658v1.2.2 对scheduler表进行了系统性重构包含三项紧密相关的变更新增active列issue #649允许在保留任务定义的同时临时停用/启用某个定时任务而无需删除再重建id改为AUTOINCREMENT任务主键改为自增避免手工维护 id支持通过配置文件配置issue #658scheduler任务可在proxysql.cnf中静态声明启动时自动加载。include/ProxySQL_Admin_Tables_Definitions.h 中保留了这一演进过程的完整快照按顺序依次为ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_0仅有id、interval_ms、filename、arg1arg5ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2a增加comment列ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2b增加active列active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2cid升级为INTEGER PRIMARY KEY AUTOINCREMENT。当前运行时的runtime_scheduler与最新 schema 均可见于同一头文件。scheduler 的执行逻辑位于 lib/ProxySQL_Admin_Scheduler.cpp。SHOW CREATE TABLE 输出缩进Admin 接口对SHOW CREATE TABLE的输出做了缩进美化issue 列表未编号使 SQLite 建表语句在多行场景下更易阅读。相关实现位于 lib/Admin_Handler.cpp 与 lib/ProxySQL_Admin.cpp。配置能力与默认值改进mysql_replication_hostgroups 支持配置文件issue #648此前mysql_replication_hostgroups只能通过 Admin 接口SQL配置v1.2.2 起可写入配置文件随实例启动自动加载。当前仓库的 src/proxysql.cfg 中保留了对应配置节mysql_replication_hostgroups该表用于描述写入宿主组 → 只读宿主组的映射配合 Monitor 的只读检测实现读写分离拓扑的自动维护相关实现位于 lib/MySQL_HostGroups_Manager.cpp。mysql-connect_retries_on_failure 默认值翻倍issue #666mysql-connect_retries_on_failure后端连接建立失败时的重试次数默认值由原值翻倍以提升高可用场景下对后端瞬态故障的容忍度。在 lib/MySQL_Thread.cpp 中可见当前默认值variables.connect_retries_on_failure 10;其变量绑定区间为 01000。proxysql.cnf 默认值整体改进与 chkconfig 支持issue #675Admin改进proxysql.cnf中的默认值使开箱即用的配置更贴合常见部署General为 RHEL / CentOS 增加chkconfig支持便于通过chkconfig proxysql on等方式注册开机自启服务。相关 service 单元可参考 systemd/system/proxysql.service 与 systemd/system/proxysql-initial.service。Monitor 监控增强微秒时间戳与日志分级v1.2.2 对监控子系统做了多项可观测性改进read_only 检查超时写入错误日志issue #640此前只读检测超时可能被静默忽略现在会在 error log 中明确报告便于排查复制拓扑未按预期切换类问题monitor 表时间戳改为微秒 unixepochissue #659监控结果表如monitor.mysql_server_read_only_log、monitor.mysql_server_replication_lag_log等的时间列统一以微秒级 unix 时间戳记录精度提升至微秒新增_us后缀列issue #650监控表中表示时间/延迟的列名增加_us后缀以显式标注单位为微秒消除列名歧义复制滞后节点事件由 info 升级为 warning当监控发现某个节点复制滞后lagging时日志级别从 info 提升为 warning更符合事件严重程度节点被 shunned 时记录为 error连接池侧当某个后端节点因故障被列入黑名单shunned时以 error 级别记录事件便于告警联动。监控模块的实现在 lib/MySQL_Monitor.cppMonitor 决策与判定逻辑可见 lib/MonitorHealthDecision.cpp。Bug 修复方面本版本同时修复了slaves lagging 未被 shunned 的问题issue #652——此前复制滞后的从库可能继续被路由流量修复后监控会依据max_replication_lag正确摘除滞后节点。连接池与协议行为修复FLUSH TABLE WITH READ LOCK 时禁用多路复用issue #613v1.2.2 修复了一个与备份一致性相关的关键问题当某个会话执行FLUSH TABLE WITH READ LOCK时该连接上的多路复用multiplexing将被禁用。原因在于 FTWRL 依赖连接级全局读锁语义若该连接继续被其他会话复用将破坏锁的隔离性并可能阻塞备份。该修复使 ProxySQL 能在保证一致性的前提下继续服务其他流量。相关实现位于 lib/mysql_connection.cpp 与 lib/MySQL_Connection.cpp 对应的多路复用判定逻辑。连接属性与 REPLACE 统计连接属性issue #672由 ProxySQL 建立的后端连接现在附带连接属性connection attributes便于后端侧如 performance_schema、审计工具识别连接来源REPLACE 统计修复了REPLACE命令在stats_mysql_commands_counters等统计中缺失的问题补齐语句级计数。Admin 启动加载修复配置文件缺失时 config db 无法加载issue #617修复配置数据库/etc/proxysql/proxysql.db不存在时配置文件未被加载的问题保证首次启动即可从proxysql.cnf完成初始化scheduler 启动时未加载issue #665修复调度器在启动阶段不加载的问题确保配置中的任务随实例启动立即生效。Galera 支持增强proxysql_galera_checker.shv1.2.2 对 Galera 集群监控脚本proxysql_galera_checker.sh做了两项增强支持 reader 与 writer 宿主组脚本可分别维护读写宿主组中节点的 ONLINE/OFFLINE 状态配合mysql_replication_hostgroups或独立宿主组实现 Galera 集群的读写自动切换支持唯一可用节点处于 Desync 状态当集群中唯一可用节点处于 Donor/Desync 状态时脚本仍能将其启用避免全部节点不可用的极端情况。当前仓库中的 tools/proxysql_galera_checker.sh 保留了相应逻辑例如# 无可用 writer 时尝试启用处于 Donor/Desync 状态的最后一个可用节点 if [ ${WSREP_STATUS} 2 -a $stat ! ONLINE ]; then ... fi读者可结合 tools/proxysql_galera_writer.pl 一起阅读。此外本版本修复了Galera 检查脚本未被打包进发行包的问题。编译与打包改进v1.2.2 在构建系统上有一批兼容性改进make支持不带 jemalloc 编译issue #654允许在不支持 jemalloc 的系统上禁用 jemalloc 构建发布说明明确指出仅应在不支持 jemalloc 的系统上使用。jemalloc 依赖声明位于 deps/jemalloc/README顶层 Makefile 负责编译流程backtrace 仅在使用 glibc 时启用issue #654避免在非 glibc libc 环境下因 backtrace 符号缺失导致编译或运行失败相关逻辑位于 lib/proxysql_coredump.cpp不为 libdaemon 编译示例issue #654缩短构建时间libdaemon 依赖位于 deps/libdaemon/README修复 Fedora 24 编译失败issue #671解决较新发行版工具链下的编译兼容问题略微缩短编译时间。Bug fixes 汇总除上文按主题展开的修复外v1.2.2 还包含修复项说明OFFLINE_SOFT 节点不尝试拉回 ONLINEissue #641若服务器在 writer_hostgroup 中被配置为OFFLINE_SOFT软下线等待存量连接结束Monitor 不应反复尝试将其置为 ONLINE多个 replication hostgroups 时监控反复重配置issue #667修复存在多个复制宿主组时 Monitor 陷入不断重新配置循环的问题Misc少量其他小修小结与后续演进线索ProxySQL v1.2.2 是一个性能 可运维性并重的版本连接池的每线程缓存为高线程数场景释放了争用压力mysql-query_processor_iterations为查询规则引入受控的迭代匹配能力Query Cache 首次拥有可配置的容量上限scheduler的comment/active/AUTOINCREMENT/配置化四连改进则标志着管理平面从纯运行时 SQL 配置向声明式静态配置演进。以上能力在后续版本中持续演化——例如mysql_replication_hostgroups的复制拓扑感知、mysql_query_rules中mirror、client_addr、digest等新列见 include/ProxySQL_Admin_Tables_Definitions.h 中各版本 schema 常量以及 pgsql 侧对应的pgsql_query_rules、pgsql_query_processor系列。读者若想从本版本出发继续深入建议依次阅读 lib/MySQL_Thread.cpp变量默认值、lib/MySQL_Query_Processor.cpp规则迭代、lib/MySQL_Monitor.cpp监控与 shun以及 include/ProxySQL_Admin_Tables_Definitions.h表结构演进史。赞分享后端数据库负载均衡【免费下载链接】proxysqlHigh-performance proxy for MySQL and PostgreSQL项目地址https://gitcode.com/gh_mirrors/pr/proxysql点击查看免费下载相关推荐tchMaterial-parser4步完成电子课本PDF下载课本预览页直接存成文件tchMaterial parser4步完成电子课本PDF下载课本预览页直接存成文件 电子课本PDF下载这件事过去有点麻烦。平台只给在线预览页面上找不到后端数据库负载均衡OpenSearch 2.13.0 版本特性深度解析分层缓存、community_id 处理器与查询稳定性增强OpenSearch 2.13.0 版本特性深度解析分层缓存、community_id 处理器与查询稳定性增强 OpenSearch 2.13.0发布于 2搜索引擎全文检索可观测性数据分析ProxySQL v1.3.0 / v1.3.0f / v1.3.0g 版本详解空闲连接线程池、IPv6 与查询超时机制演进ProxySQL v1.3.0 / v1.3.0f / v1.3.0g 版本详解空闲连接线程池、IPv6 与查询超时机制演进 本指南基于 doc/releas后端数据库负载均衡上一篇llamafile 单文件大模型分发框架原理、运行与自建 llamafile 实战指南下一篇AERIS-10 PLFM 雷达 FPGA 约束体系解析多目标 XDC 引脚规划、USB_MODE 参数化接口与 Vivado 构建流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表