
ClickHouse v25.1.6.34-stable 发行说明Join 预分配、S3 备份与权限检查等修复的源码级解读【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 官方变更记录 v25.1.6.34-stable 撰写完整梳理该 25.1 分支稳定版相对 v25.1.5.31-stable 的全部 13 项变更覆盖 Performance Improvement、Improvement、Bug Fix 与内部变更NOT FOR CHANGELOG四个类别并结合当前仓库源码对每项变更涉及的关键实现如ConcurrentHashJoin的预分配逻辑、Join 内存限制设置、异步读取缓冲区等给出可验证的落点帮助运维与开发者准确评估该补丁版本的价值与升级理由。版本概览发布版本v25.1.6.34-stable构建号004003dccf8对比基线v25.1.5.31-stable构建号48f17e8a805变更性质这是一次针对 25.1 维护分支的回归移植backport发布。变更日志中每条记录均标注 “Backported in #XXXXX”表示这些修改最初合入主干master随后被移植回 25.1 分支以修复已在正式发布中发现的问题。对于锁定在 25.1 大版本线上的生产集群这类 stable 补丁版是升级的主要依据。变更规模2 项性能改进 2 项功能改进 7 项 Bug 修复 4 项不面向用户的内部变更。一、Performance ImprovementJoin 路径的两项性能修复1. 修复优化器交换 Join 顺序后ConcurrentHashJoin的双重预分配变更条目Backported in #76700Pull #75149作者 Nikita Taranovnickitat。当优化器根据统计信息交换了 Join 两侧把原本作为 build 侧的表换到另一侧时ConcurrentHashJoin曾发生双重预分配即同一份哈希表空间被重复预留导致内存占用与分配开销翻倍。从源码结构看当前仓库中 src/Interpreters/ConcurrentHashJoin.cpp 完整保留了这一机制的现行实现预分配大小来源于 build 侧统计信息提示build_stats_collecting_params的 size hint注释明确说明“Hash map is shared between allHashJoininstances, so themedian_sizeis actually the total size we need to preallocate in all buckets of all hash maps”。每个HashJoin实例在 build 阶段“拥有”桶的一个子集因此只对各自负责的桶做预分配。此外源码中还有space_was_preallocated布尔标志src/Interpreters/ConcurrentHashJoin.cpp确保同一实例不会重复执行reserveSpaceInHashMaps——这正是本条修复防止“双重预分配”的结构性保障if (!hash_join-space_was_preallocated hash_join-data-twoLevelMapIsUsed()) { reserveSpaceInHashMaps(*hash_join-data, i, stats_collecting_params.build, slots, external_join_threshold); hash_join-space_was_preallocated true; }源码还展示了预分配与外溢spilling阈值的联动当外层包裹SpillingHashJoin时预分配量会被压缩到external_join_threshold / (8 * cell_size)的预算内以避免在触发溢出检查之前就占满内存上限。对于使用join_algorithm parallel_hashConcurrentHashJoin的触发条件且 Join 两侧规模差异明显、优化器经常交换 build 侧的大表 Join 场景升级到该版本可避免无谓的内存尖峰与分配延迟。2. 修复max_rows_in_join max_bytes_in_join 0时parallel_hash的不必要争用变更条目Backported in #76696Pull #75155作者 Nikita Taranovnickitat。当用户显式把 Join 内存限制都设为 0表示不限制时parallel_hash算法内部却仍会产生不必要的锁争用contention影响并发 build 吞吐。该修复消除了限制值为 0 场景下的多余同步路径。对应的配置项可在 src/Core/Settings.cpp 中确认max_rows_in_join默认值即为0含义是限制 Join 右侧数据结构通常为哈希表的行数应用于SELECT ... JOIN与 Join 表引擎。该设置的说明还指出只有hash、parallel_hash和ie_join三种join_algorithm值会尊重这些限制其他算法partial_merge、grace_hash、auto等通过落盘、重分区或切换策略的方式处理超限。因此该修复直接惠及使用默认配置限制为 0且依赖parallel_hash并发的查询负载。二、Improvement外部表函数与 S3 备份可用性改进1.postgresql/mysql表函数支持带路径的后端地址变更条目Backported in #76437Pull #75944作者 Nikita Mikhaylovnikitamikhaylov。此前在 v25.1 线上postgresql()/mysql()表函数无法解析形如localhost:1234/handle这样携带路径段的 endpoint 写法这是一个由上游 Pull #52503 引入的回归。修复后表函数地址解析会剥除或正确处理路径部分使得经过带路由路径的代理或中间件连接 PostgreSQL / MySQL 时不再报错。典型使用方式示例SELECT * FROM postgresql(127.0.0.1:5432/handle, mydb, table_name, user, password);2. S3 备份在 Access Denied 时改用正确的 multipart copy 回退路径变更条目Backported in #76609Pull #76515作者 Antonio Andelicantonio2368。跨桶尤其是两侧桶使用不同凭证做BACKUP/RESTORE时S3 的 multipart copy 可能返回 Access Denied。本修复让 ClickHouse 在该错误出现时改用正确的回退fallback拷贝方式而不是让整个备份任务失败。对于在多个 S3 账号/桶之间迁移备份数据的场景这是直接的可用性修复。三、Bug Fix用户可见行为修复7 项1. 修复forwarded_for字段中 IPv4 映射 IPv6 地址解析异常变更条目Backported in #76142Pull #75133作者 Yakov Olkhovskiyyakov-olkhovskiy。::ffff:1.1.1.1这类 IPv4-mapped IPv6 地址出现在X-Forwarded-For头中时会被错误解释最终导致客户端连接以异常方式断开。修复后 HTTP 接入层可正确解析该形态的地址修复了经由反向代理接入时的偶发断连问题。2.NumRowsCache统计total_number_of_rows时不再误用key_condition变更条目Backported in #76395Pull #75164作者 Daniil Ivanikdivanik。在查询system表中total_number_of_rows指标所依赖的行数缓存NumRowsCache逻辑里新增了对key_condition参数的校验统计全表行数时不应携带 key 条件否则会返回错误的行数。该修复保证行数缓存路径下统计口径的正确性。3.materialized_views_ignore_errors对 URL 引擎目标生效变更条目Backported in #76529Pull #75679作者 Christoph Wurmcwurm。当物化视图的写入目标是URL 引擎例如把结果推送到远端 HTTP 端点且远端出现连通性问题时此前materialized_views_ignore_errors 1不会生效异常会向上传播并可能阻塞数据流。本修复让该设置在这一路径上被正确尊重开启后网络类错误会被忽略物化视图主写入流程继续运行。4. 修复部分UNION ALL查询的Block structure mismatch in QueryPipeline stream错误变更条目Backported in #76540Pull #75715作者 Nikolai KochetovKochetovNicolai。部分含UNION ALL的查询会抛出Block structure mismatch in QueryPipeline stream异常根源在于查询管线QueryPipeline各流之间的 Block 结构不一致。修复后此类查询可正常执行属于典型的查询执行层结构对齐问题。5. 修复ALTER RENAME错误要求CREATE USER权限变更条目Backported in #76475关闭 #74372Pull #76241作者 pufit。权限检查逻辑存在缺陷执行ALTER RENAME时系统错误地要求操作者拥有CREATE USER授权。这是一个访问控制Access Control层的误判修复后权限语义回归正确只有真正需要管理用户体系的语句才要求相应授权。6. 修复WHERE含pointInPolygon时的索引分析逻辑错误变更条目Backported in #76403Pull #76360作者 Anton PopovCurtizJ。当WHERE条件中包含pointInPolygon函数时索引分析index analysis会产生逻辑错误。修复确保该空间谓词场景下索引条件推断的正确性避免误判或错误的索引过滤行为。7. 从信号处理程序中移除内存分配变更条目Backported in #76484Pull #76446作者 Nikita Taranovnickitat。信号处理函数signal handler中原本存在堆内存分配操作。在 POSIX 环境下信号处理上下文中调用malloc等非 async-signal-safe 函数是未定义行为的经典来源尤其在 OOM、栈溢出等异常场景下可能加重崩溃或导致死锁。本修复移除了该分配提升了异常路径下的健壮性。四、NOT FOR CHANGELOG不面向用户的内部变更4 项这一类别的变更不影响用户可见行为但反映了 25.1 分支上 I/O 层与测试基础设施的持续打磨同样以 backport 形式进入本版本Backported in #76508Pull #76322为ReadBufferFromEncryptedFile增加prefetch方法。该文件在当前仓库位于 src/IO/ReadBufferFromEncryptedFile.hprefetch接口使加密文件读取缓冲区支持预取与未加密读取路径的预取能力对齐。Backported in #76465Pull #76429修复AsynchronousBoundedReadBuffer的setReadUntilPosition实现。该缓冲区定义于 src/Disks/IO/AsynchronousBoundedReadBuffer.h是异步批量读取与有界缓冲的核心组件setReadUntilPosition用于限定“只读到某个位置”的读取边界。Backported in #76577Pull #76561在 Azure Blob 存储环境运行02435_rollback_cancelled_queries测试时跳过该测试属于 CI 环境适配。Backported in #76602Pull #76575查询system.distributed_ddl_queue时改用MultiRead方式读取优化该系统表的读取路径。五、升级评估建议综合来看v25.1.6.34-stable 的变更集中在三类风险面上Join 执行路径两条性能改进直接作用于parallel_hash/ConcurrentHashJoin对大表 Join 的内存行为与并发吞吐有正面影响参见 src/Interpreters/ConcurrentHashJoin.cpp接入层与执行层健壮性forwarded_forIPv4-mapped 地址解析、信号处理程序去分配化、UNION ALL管线结构对齐等均属于“偶发但影响面大”的修复外围可用性URL 引擎物化视图容错、S3 跨桶备份回退、外部表函数 endpoint 解析回归修复。对于生产环境仍运行在 v25.1.5.x 且满足以下任一条件的集群建议升级到本版本大量使用parallel_hashJoin、经由反向代理接入 HTTP 服务、物化视图写入 URL 引擎、或在多 S3 桶之间做备份迁移。变更全文见 docs/changelogs/archive/v25.1.6.34-stable.md。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考