十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

ClickHouse v25.9.7.56-stable 变更解析:40+ 项 Bug 修复与 JSON/MergeTree 稳定性改进实战指南

ClickHouse v25.9.7.56-stable 变更解析:40+ 项 Bug 修复与 JSON/MergeTree 稳定性改进实战指南 ClickHouse v25.9.7.56-stable 变更解析40 项 Bug 修复与 JSON/MergeTree 稳定性改进实战指南【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本指南以官方发布的 v25.9.7.56-stable 版本日志 为主体系统梳理该稳定版相对于 v25.9.6.117-stable 的 2 项功能改进、40 项用户可见 Bug 修复、3 项构建/测试改进并结合仓库源码设置定义、GenerateRandom 引擎、caseWithExpression 实现 等逐一剖析其背后的原理与影响面。读完本文你将能判断该版本修复是否影响自己的生产环境、理解每个修复对应的配置开关与升级注意事项并学会用仓库内测试用例验证这些修复。一、版本概览与升级定位v25.9.7.56-stable 是 ClickHouse 25.9 系列的第三个稳定补丁版本构建提交为f805515dfb0对比基线为 v25.9.6.117-stableff2a1965ca6。从版本日志的结构看本次发布的核心特征Bug Fix用户可见行为修复约 40 项是本版绝对主体且高度集中于JSON/Dynamic/Variant 动态类型体系、MergeTree 家族、聚合与序列化兼容性三个领域Improvement 2 项分别涉及读取 JSON 列样本时的线程池饥饿问题以及聚合/排序溢写spill to disk时的内存检测稳健性Build/Testing/Packaging Improvement 3 项含一个安全相关的依赖升级libssh。按照 ClickHouse 版本策略稳定版stable补丁只做向后兼容的修复不引入破坏性变更。如果你的生产集群正在使用 25.9 系列且大量使用 JSON/Dynamic 列、Nested 结构、投影projection或分布式 DDL本版本值得优先规划升级。二、Improvement两项底层稳健性改进2.1 尊重merge_tree_use_prefixes_deserialization_thread_pool消除 JSON 列样本读取的线程池饥饿对应变更PR #91208回基于 #91250JSON 列在 Wide parts 中往往包含大量子列subcolumns。读取列样本column samples时旧实现无条件使用前缀反序列化线程池在子列数量很大且线程池被占满的场景下可能造成线程池饥饿thread pool starvation拖慢甚至阻塞其他任务。本次修复让样本读取尊重merge_tree_use_prefixes_deserialization_thread_pool设置。在源码中该设置定义于 src/Core/Settings.cpp#L1756-L1758DECLARE(Bool, merge_tree_use_prefixes_deserialization_thread_pool, true, R( Enables usage of the thread pool for parallel prefixes reading in Wide parts in MergeTree. Size of that thread pool is controlled by server setting max_prefixes_deserialization_thread_pool_size. ))关键信息默认值true即默认仍使用线程池并行读取前缀控制范围仅影响 MergeTree 表家族中Wide parts的并行前缀读取配套服务端设置线程池大小由服务器级设置max_prefixes_deserialization_thread_pool_size控制落地路径该设置在 MergeTreeIOSettings.cpp#L142 中被读取为use_prefixes_deserialization_thread_pool再传入后续 IO 逻辑。运维建议如果线上观察到 JSON 高子列数表的 SELECT 出现线程饥饿、任务排队异常可尝试将该设置置为false绕过线程池牺牲部分并行度换取稳定性或在确认列样本读取压力大的前提下调整max_prefixes_deserialization_thread_pool_size。2.2 聚合/排序溢写时更稳健的查询内存检测对应变更PR #92500回基于 #92567聚合aggregation和排序sorting在内存超限时会选择将中间结果溢写spill到磁盘。旧实现对当前查询到底用了多少内存的探测在某些路径下不够健壮可能误判内存水位导致溢写决策错误。本次改进强化了查询内存使用的检测逻辑改动由 Azat Khuzhin 提交。该改动影响所有依赖max_bytes_before_external_sort/max_bytes_before_external_group_by等溢写阈值设置的查询——内存检测越准确溢写时机越合理既能避免 OOM也能避免过早溢写带来的性能损耗。对于超大 GROUP BY 或 ORDER BY 任务的用户升级后可观察溢写行为是否更符合预期。三、Bug Fix 分类深度解析以下按技术领域归类梳理全部用户可见修复。修复编号为官方 PR 号可在 ClickHouse 仓库中检索对应改动与测试。3.1 JSON / Dynamic / Variant 动态类型体系本版修复最密集领域25.9 系列把 JSON 作为一等动态类型随之而来的边界问题在本版集中修复共约 11 项修复现象影响场景PR #88879通过ALTER ADD COLUMN添加的非物化Nested(Tuple(...))列处理错误issue #83133ALTER 动态加嵌套结构PR #90302Compact parts中读取 JSON 子列可能报CANNOT_READ_ALL_DATAissue #90264Compact 存储格式的表查询PR #90430从HTTP 参数解析 JSON/Dynamic/Variant 值出错issue #88925HTTP 接口参数化查询PR #90816JSON 的shared data 与 dynamic paths状态可能不一致导致逻辑错误与异常结果写入后立即读取PR #90907读取 JSON/Dynamic/Variant 列时内存占用过高大 JSON 列扫描PR #91014禁用write_marks_for_substreams_in_compact_parts时path 同时存在于 shared data 与 dynamic paths 的子对象读取 bug定制标记写入配置PR #91040mutations 中从物化列读取动态子列失败issue #90653ALTER UPDATE/DELETE涉及物化 JSON 列PR #91151JSON 列在Summing/Aggregating/Coalescing MergeTree合并时产生意外 dynamic paths三种特殊 MergeTree 引擎PR #91152Compact parts 写入时动态结构不一致极端情况导致段错误segfaultCompact 格式写入PR #91270向CoalescingMergeTree写入Tuple(JSON/Dynamic)LowCardinality组合列失败issue #91215CoalescingMergeTree 表PR #90907 相关JSON 子列样本读取线程池饥饿见 2.1高子列数 JSON 表这些修复大多由 Pavel KruglovAvogar主导说明 25.9 的 JSON 动态类型在 Compact parts、物化列、特殊 MergeTree 引擎等边界路径上经过了一轮系统性加固。凡是使用JSON/Dynamic/Variant类型、Nested结构或SummingMergeTree/AggregatingMergeTree/CoalescingMergeTree的用户应重点回归测试写入、合并、mutations 三类操作。3.2 MergeTree 家族与投影PR #88350修复存在UNION时错误移除未使用投影列issue #88180。投影projection优化与 UNION 组合时可能误删列导致错误结果PR #90288修复部分聚合投影优化查询PR #90666修复LowCardinality列用作分区键时的类型转换错误issue #89412PR #90927修复SummingMergeTree对NestedLowCardinality列的聚合PR #91142修复旧 parts 中通过ALTER ADD COLUMN添加列的延迟物化lazy materializationPR #91396在合并算法中从表头header移除 Sparse 列issue #91377避免稀疏列在合并时引发不一致PR #91573禁止对 Object Storage 表引擎执行 ALTER。此前ALTER ADD PROJECTION可能导致服务器无法重启——因为 Object Storage 引擎不支持投影。该修复属于防御性护栏升级前若曾对这类表执行过 ALTER应检查数据目录一致性。3.3 聚合、序列化与内存PR #90880重点修复String 聚合状态的内存序列化兼容性。旧实现下不同版本实例执行同一聚合查询可能因序列化差异产生重复结果。新序列化默认开启可通过设置serialize_string_in_memory_with_zero_byte控制。该设置定义于 src/Core/Settings.cpp#L8883-L8885DECLARE(Bool, serialize_string_in_memory_with_zero_byte, true, R( Serialize String values during aggregation with zero byte at the end. Enable to keep compatibility when querying cluster of incompatible versions. ))默认true跨版本混合集群滚动升级期间如遇聚合结果不一致可检查该开关。它被 AggregatingStep、CubeStep、RollupStep、MergingAggregatedStep、TTL 聚合等路径引用覆盖范围广PR #91664修复带additional filter 的 JOIN 内存占用升高issue #91011PR #92500Improvement见 2.2 节聚合/排序溢写内存检测更稳健。3.4 权限、安全与凭据展示PR #90765修复 named collections 的**隐藏密钥hidden secrets**未遵循display_secrets_in_show_and_select与format_display_secrets_in_show_and_select设置的问题避免密钥在SHOW/SELECT结果中被意外展示PR #90922修复 **wildcard grants 的部分撤销partial revoke**检查并补充更多测试PR #90928修复wildcard revoke 误伤全局级权限的问题——此前撤销一个通配授权可能意外撤掉CREATE USER等全局权限PR #90985将libssh 从 0.9.8 升级到 0.11.3修复安全公告 GHSA-98qw-prqm-9f4p 涉及的漏洞属于 Build/Packaging 类改进但对使用 SSH 相关集成如ssh表函数的用户有安全意义。运维提示使用 named collections 且配置了secret字段的用户升级后应验证SHOW/SELECT输出中密钥是否按预期隐藏。3.5 函数与类型修复PR #88157修复GenerateRandom 引擎在非字面量参数下崩溃——由返回LOGICAL_ERROR改为返回BAD_ARGUMENTS并附清晰报错信息。从源码看StorageGenerateRandom.cpp#L961-L994 中引擎参数通过evaluateConstantExpressionAsLiteral求值最多接受三个参数random_seed, max_string_length, max_array_length默认值分别为随机、10、10。当传入非字面量表达式时此前的类型断言会触发内部逻辑错误崩溃现改为对用户友好的参数错误PR #90013修复文本格式下从字符串推断非法 DateTime64 值的边界情况issue #89368PR #90490修复toDateTimeOrNull对负参数返回 NULL的 bugPR #90909修复base58Decode函数的缓冲区分配问题PR #91420修复dictGetDescendants因 NULL 崩溃——字典类型声明了 Hierarchy 支持但没有任何列为HIERARCHICAL时issues #92026/#92121PR #91524修复remote函数使用星号参数asterisks引发的逻辑错误issue #90568PR #92351修复caseWithExpression函数参数中出现Nothing类型时的逻辑错误issue #85354。该函数在 src/Functions/caseWithExpression.cpp#L58 要求参数数量为偶数(expr, when1, then1, ..., else)否则抛BAD_ARGUMENTS本次修复针对Nothing空集类型混入分支值的极端类型场景PR #91827修复RecursiveCTEChunkGenerator的LOGICAL_ERRORPR #92210修复 format 场景下的UDF 替换。3.6 复制、DDL、分布式与缓冲区引擎PR #90556 / PR #92223DDLWorker::markReplicasActive 本地主机检查优化。旧逻辑在本地地址解析失败、而集群中存在 host IDs 时直接抛异常导致副本活性标记失败现改为先打印警告日志若确认无本地主机则抛异常触发重试#90556后续版本进一步将无活跃主机但 remote_servers 含 host_ids场景降级为仅警告不抛异常#92223。对 DNS 偶发抖动环境下的分布式 DDL 稳定性有实际意义PR #91304修复SYSTEM DROP FILESYSTEM CACHE ON CLUSTER在集群上的执行问题PR #91386修复 async insert 队列刷到远端服务器时异步语义丢失的问题——即使对用户设置了async_insert1队列 flush 到远端时仍被强制同步执行本次修复让该设置生效PR #90947修复Azure blob 列表可能死循环的问题PR #90892修复 Buffer 表在频繁 INSERT 下后台 flush的行为异常PR #91000修复 Buffer 表过度 flush问题——旧实现会空耗 CPU 并产生海量日志PR #90412修复单条 ALTER 中同时重命名和修改同一 Nested 列时的逻辑错误issue #90406PR #90505修复LowCardinality(Bool/Date32)以Arrow 格式输出时的逻辑错误issue #83883PR #91396Sparse 列从合并表头移除见 3.2。四、Build / Testing / Packaging 改进PR #90985libssh 0.9.8 → 0.11.3安全修复见 3.4PR #92009修复00906_low_cardinality_cache的flaky 测试PR #92404Rust 构建包装器支持在chcache与sccache之间任选CI 类NOT FOR CHANGELOG#89098/#90950 修复 fork 场景下版本 tweak 计算#91094 适配 runc 1.3.3 的 tmpfs 权限变更#92544 使用修复版本重新构建。五、升级与回归验证建议综合以上变更规划升级到 v25.9.7.56-stable 时建议重点回归以下场景JSON/Dynamic/Variant 数据面执行覆盖写入 → SELECT → 合并 → mutation → 再次读取的完整链路尤其使用 Compact parts 与物化 JSON 列的表特殊 MergeTree 引擎SummingMergeTree / AggregatingMergeTree / CoalescingMergeTree 上的 JSON 列合并投影与 UNION带投影优化的查询与 UNION 组合场景跨版本滚动升级期间关注聚合结果一致性serialize_string_in_memory_with_zero_byte建议同版本内完成升级窗口分布式 DDL 与复制在 DNS 有波动的环境验证ON CLUSTERDDL 与副本活性标记日志权限回归named collections 密钥展示、wildcard 授权/撤销行为安全依赖确认构建产物中 libssh 已更新至 0.11.x。相关测试与配置可在仓库内进一步检索JSON 动态类型相关测试位于 tests/queries 与 tests/integration各项设置在 src/Core/Settings.cpp 中均有默认值与说明GenerateRandom 引擎实现见 src/Storages/StorageGenerateRandom.cppcaseWithExpression 实现见 src/Functions/caseWithExpression.cpp。六、总结v25.9.7.56-stable 是一个典型的深水区修补稳定版表面无新功能实质完成了 JSON 动态类型体系在 Compact parts、物化列与特殊 MergeTree 引擎上的系统性加固并修复了投影 × UNION、跨版本聚合序列化、通配权限撤销等一批高影响边界问题。对于 25.9 系列用户该版本是值得跟进的重要补丁升级前请对照本文第三节的领域清单完成针对性回归。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表