ClickHouse v25.9.3.48-stable 发布解析:缓存优化、Keeper 事件与十三项稳定性修复全景

发布时间:2026/9/19 1:43:39
ClickHouse v25.9.3.48-stable 发布解析:缓存优化、Keeper 事件与十三项稳定性修复全景
ClickHouse v25.9.3.48-stable 发布解析缓存优化、Keeper 事件与十三项稳定性修复全景【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本指南基于 docs/changelogs/v25.9.3.48-stable.md 变更日志逐条解析 ClickHouse 25.9 系列第三个稳定补丁版本的核心改进、用户可见缺陷修复与内部维护变更并结合仓库源码如 HTTPHeaderFilter.cpp、Parquet/Reader.cpp、KeeperConstants.cpp 等深入说明其底层实现与影响面。读完本文你将掌握该补丁版本修复的具体问题、涉及的组件模块、对应的源码位置以及如何针对性地验证升级效果。一、版本概览补丁定位与变更总量v25.9.3.48-stablecommit 9a8e40bbf36是 ClickHouse 25.9 稳定分支上基于v25.9.2.1-stablec2a9511f7bc之后的累积补丁版本。该版本的全部改动均以“backport向后移植”方式从主分支合入稳定分支确保修复以小步、可追溯的方式进入生产序列。本版本的变更清单共包含2 项改进Improvement涉及本地文件系统缓存并发预留、Keeper 性能事件暴露13 项缺陷修复Bug Fix覆盖 GeoParquet 协议、HTTP 头校验、MergeTree 轻量更新、文本索引、Buffer 表权限、日志内存跟踪、物化视图设置覆盖、HashJoin 输出、跳过索引、带投影的合并、内存告警误报、Set 列 TTL 数据损坏等1 项构建/测试/打包改进集成测试环境升级到 PostgreSQL 18.06 项内部维护项NOT FOR CHANGELOG / INSIGNIFICANT不面向最终用户公告但包含若干重要的稳定性修复如 Replicated DDL 关停崩溃、Parquet bool 解码、向量相似度索引持久化、S3 客户端日志。下文按类别逐一展开并给出可验证的源码依据与测试路径。二、改进项Improvement详解2.1 文件系统缓存并发预留场景下的迭代器复用Backported in #87981Filesystem cache improvement: reuse cache priority iterator among threads concurrently reserving space in cache.PR #87914当多个线程同时为写入预留reserve缓存空间时每个线程此前都可能各自维护一份“缓存优先级迭代器”导致在高并发预留场景下重复遍历缓存分片、产生不必要的竞争与开销。本改进让并发预留空间的线程复用同一个缓存优先级迭代器从而降低多线程同时操作缓存时的锁竞争与遍历成本。从仓库结构看ClickHouse 的本地文件系统缓存实现分布在src/Interpreters/Cache与src/Common/FilesystemCache*相关文件中其核心是“分片shards LRU/Keeper 优先级队列”的数据结构写入路径中的reserve操作直接决定写缓存时的空间分配策略。该改进主要影响写入密集型、大量并发导入数据的场景属于运行时性能层面的优化不改变 SQL 语义升级后可平滑生效。2.2 Keeper 性能事件暴露软内存限制拒绝计数Backported in #88057To expose theKeeperRequestRejectedDueToSoftMemoryLimitCountkeeper profile event, we must add it toKeeperConstants.cpp.PR #88030ClickHouse Keeper内置的 ZooKeeper 替代协调服务在收到请求时会做内存水位检查当超过软内存限制soft memory limit时会拒绝请求。此前拒绝次数虽然被统计但由于没有注册到 Keeper 的常量表中无法通过 profile events 暴露给外部监控。本改进将该计数加入常量注册表使其成为可查询的 Keeper profile event。源码中对应位置在 KeeperConstants.cpp 的宏展开列表里M(KeeperRequestRejectedDueToSoftMemoryLimitCount)一行将事件名注册进 Keeper 事件常量体系该事件的产生与处理逻辑位于 KeeperRequestDispatcher.cpp以及旧版 KeeperRequestDispatcherOld.cpp公共事件定义在 ProfileEvents.cpp。运维上升级后可在system.metrics/ profile events 中监控该计数以判断 Keeper 是否因内存压力而拒绝写入请求从而提前扩容或调整 Keeper 内存配额。三、缺陷修复Bug Fix逐项解析3.1 格式与协议层GeoParquet 导致客户端协议错误PR #84020修复了读取 GeoParquet 文件时引发客户端协议错误的缺陷。GeoParquet 是带地理空间元数据的 Parquet 扩展其元数据块以键geo存储于文件级 key-value 元数据中。当前仓库的 Parquet/Reader.cpp 在读取阶段解析一次 GeoParquet 元数据同时供两个使用方消费covering.bbox列注入空间裁剪与SchemaConverter的几何类型解析源码中还注释说明“解析失败时禁用空间裁剪与几何类型解析并输出告警”避免因元数据异常导致协议输出崩溃。相关类型定义位于 ArrowGeoTypes.cpp 与 ArrowGeoTypes.h。依赖 GeoParquet 数据湖查询的用户应优先升级本版本。HTTP 头校验checkHeaders拒绝被禁用的请求头PR #87172HTTP 接口含 URL 表函数、数据湖 Catalog 等在接收请求头时会调用checkHeaders进行校验此前该校验对头名的检查不够严谨。本修复使函数正确校验头列表并拒绝被配置为禁用的头。其底层实现即 HTTPHeaderFilter.cpp 中的HTTPHeaderFilter::checkAndNormalizeHeaders头名或头值中出现\n/\r将直接抛BAD_ARGUMENTS异常防止请求/响应拆分request/response splitting攻击头名会被剥离空白与控制字符并统一转为小写HTTP 头名大小写不敏感RFC 7230 §3.2命中http_forbid_headers配置中精确名集合forbidden_headers或正则集合forbidden_headers_regexp基于 RE2 编译、默认大小写不敏感时抛异常。对应配置解析在setValuesFromConfig中实现完整的配置形如http_forbid_headers headerX-Forbidden/header header_regexp^X-.*/header_regexp /http_forbid_headers其中header声明精确禁用的头名header_regexp声明正则模式无效正则会记录告警日志并跳过而不是中断配置加载。该逻辑同样服务于数据湖 HTTP Catalog 组件见 RestCatalog.cpp 与 HTTPBasedCatalogUtils.cpp。单元测试见 gtest_http_header_filter.cpp。Parquet v3 读取器 bool 解码内部修复PR #87442在“NOT FOR CHANGELOG”分类中一并修复了 Parquet v3 读取器ParquetV3BlockInputFormat.cpp的 bool 字段解码错误避免窄布尔列读取结果错误。3.2 MergeTree 存储引擎层轻量更新lightweight updates读取其他 MergeTree 表的子查询PR #87285修复了轻量更新中 WHERE 子查询从另一张MergeTree表读取数据时的缺陷。轻量更新依赖ALTER TABLE ... UPDATE的 mutation 执行框架MutationsInterpreter.h当谓词子查询跨表读取时可能产生错误结果本修复保证子查询结果在 mutation 执行中的正确隔离与读取。对象存储上文本索引text index的直接读取PR #87399修复了直接从对象存储S3 等读取文本索引full-text index 相关的text索引类型时的缺陷。对象存储场景下索引文件需按需拉取与缓存此前直接读取会出错。相关读取路径涉及 StorageObjectStorageSource.cpp 与 MergeTree 数据部分存储实现DataPartStorageOnDiskFull.cpp 等。多个跳过索引skip indices缺陷PR #87817修复了跳过索引Skip Index如minmax、set、bloom_filter、ngrambf_v1、tokenbf_v1等的若干缺陷。跳过索引的核心执行逻辑位于 IndexReadRangesRefiner.cpp 以及src/Storages/MergeTree/SkipIndices目录涉及索引粒度判定、区间裁剪与索引失效invalid index的处理。使用跳过索引加速大表范围查询的用户升级后建议对受影响表执行一次ALTER TABLE ... UPDATE ...或重建相关分区以重新物化索引验证裁剪行为。最后一个块为空时带投影projection的合并PR #87928修复了合并merge过程中当最后一个块为空时、与投影projection一起处理产生的错误。投影合并涉及 MergedBlockOutputStream 与投影数据部分管理本修复保证空块边界情况下投影数据的正确性。Set 列 TTL 可能导致的数据损坏PR #88095修复了MergeTree表使用set列且配置列级 TTL 时可能发生的数据损坏。Set 列以独特方式存储基于 Set 语义去重存储其 TTL 过期清理路径若不正确处理可能导致部分数据不可读。这是本版本中严重级别较高的修复使用列级 TTL SET数据类型的表应优先升级并做完整性校验。3.3 内存与资源管理异步日志与 text_log 的跟踪内存泄漏PR #87584修复了异步日志async logging与text_log的跟踪内存tracked memory泄漏。原文指出该漂移在 10 小时内可达约 100 GiB——即内存计数长期只增不减可能触发虚假的 OOM 或内存上限告警。该修复避免日志路径上“已分配未归还”的记账漂移对长时间运行、日志量大如query_log、text_log、system.asynchronous_metrics高频写入的服务器意义重大。“High ClickHouse memory usage”告警误报PR #88092修复了内存使用告警中未排除 page cache导致的误报此前将操作系统页缓存计入 ClickHouse 自身内存使用造成“High ClickHouse memory usage”警告频发。修复后告警判定会正确排除 page cache使告警反映真实进程内存占用。相关内存采集与告警逻辑位于src/Common/getMemoryAmount.cpp、src/Common/GetMemoryAmount.h等内存探测组件与 Server 端内存监控路径。3.4 权限、视图与会话级行为Buffer 表的 SELECT / INSERT 访问校验PR #87545修复了 Buffer 表在 SELECT 与 INSERT 上缺失访问校验的问题。Buffer 表是内存缓冲 周期性刷写底层表的特殊表引擎此前访问校验可能在缓冲路径上被绕过。本修复保证对 Buffer 表的读写遵循与底层表一致的权限检查涉及src/Storages/StorageBuffer.cpp与访问检查相关代码路径src/Access。异步删除的视图导致全局 Server 设置被覆盖PR #87603修复了一个较隐蔽的竞态如果 View / Materialized View 被异步删除drop且服务器在后台清理完成前重启其 SELECT 设置SELECT ... SETTINGS子句携带的设置可能覆盖全局服务器设置。该修复保证视图设置只在视图实际存活与执行时生效避免因清理中断导致全局配置被意外改写涉及src/Interpreters中设置执行上下文与视图元数据管理。HashJoin 输出块生成未使用右行列表时的修复PR #87699修复了 HashJoin 算法在**未使用右行列表right row list**分支时输出块output block生成错误的问题对应 issue #87401。该分支常见于哈希连接中右表侧无需物化整行列表如只需存在性判断的优化路径错误生成输出块会导致查询结果缺失或协议解析异常。实现位于 HashJoin 与src/Processors/Transforms/JoiningTransform.cpp等连接执行组件。其余关联修复PR #87761关闭 issue #86587该补丁还包含一项未在本 changelog 中给出标题的修复PR #87761关闭 #86587属于伴随性缺陷修复随版本一并生效。四、构建 / 测试 / 打包改进集成测试升级到 PostgreSQL 18.0PR #87647集成测试环境中 PostgreSQL 版本从旧版升级到postgres18.0使 PostgreSQL 表引擎PostgreSQL、MaterializedPostgreSQL与字典的集成测试覆盖更新的服务端行为。相关测试位于 tests/integration 目录下涉及 postgres 的用例。五、内部维护项NOT FOR CHANGELOG / INSIGNIFICANT这些变更不面向最终用户公告但包含值得运维关注的稳定性修复修复 RMVtryEnqueueReplicatedDDL关停崩溃PR #78873修复 Replicated 表在 shutdown 过程中tryEnqueueReplicatedDDL的崩溃消除服务器停机时偶发的 segfault涉及 ReplicatedMergeTree 相关路径。jemalloc profiler 小幅修复PR #87614修正内存分析器profiler使用细节服务于内存性能分析场景。向量相似度索引持久化失败时不再崩溃PR #87803当向量相似度索引vector similarity index无法保存到 / 从持久化加载时不再导致进程崩溃而是优雅降级。移除已回滚功能的测试PR #87837清理与已回滚特性关联的测试用例。集成测试替换缺失的 bitnami 镜像PR #87897修复 CI 中因第三方镜像缺失导致的集成测试环境问题。S3 客户端增加日志PR #88001为 S3 客户端补充日志输出见src/Client/S3相关实现提升对象存储问题排查的可观测性。六、升级与验证建议优先升级人群使用 GeoParquet / 数据湖查询、依赖 Keeper 监控指标、使用列级 TTL Set 列、长时间运行且日志量大的生产集群。验证手段Keeper 侧升级后查询system.metrics确认KeeperRequestRejectedDueToSoftMemoryLimitCount已可观测存储侧对使用跳过索引的表执行带范围谓词的查询并对比read_rows裁剪效果对带投影的表触发一次 merge 验证内存侧观察text_log场景下跟踪内存tracked memory是否稳定不再随时间单向漂移权限侧为 Buffer 表配置受限用户验证 SELECT/INSERT 均被正确校验。版本定位v25.9.3.48-stable属于 25.9 稳定分支的补丁版本包含的均为 backport 修复无破坏性变更如需完整新特性请关注更高主版本但作为生产稳定性补丁建议尽快合入发布流程。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考