ARTICLE DETAIL

资讯详情

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

ClickHouse v21.7.10.4-stable 补丁版本解析:核心 Bug 修复与底层机制全解读

ClickHouse v21.7.10.4-stable 补丁版本解析:核心 Bug 修复与底层机制全解读 ClickHouse v21.7.10.4-stable 补丁版本解析核心 Bug 修复与底层机制全解读【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读v21.7.10.4-stable 是 ClickHouse 21.7 系列的一个补丁维护版本patch release相对 v21.7.9.7-stable 仅包含 1 项改进、7 项用户可见 Bug 修复及若干内部变更。本文以官方发布说明为主体结合当前仓库源码逐一剖析每项修复涉及的底层机制——包括查询优化器、副本元数据一致性、ZooKeeper watch 管理、子列读取与高阶数组函数等帮助读者理解这些修复的价值、触发场景以及升级时的注意事项。版本定位21.7 系列的滚动维护docs/changelogs/archive/v21.7.10.4-stable.md是 21.7 系列的归档 changelog 之一。21.7 是 ClickHouse 引入滚动升级兼容层的关键版本见下文legacy_column_name_of_tuple_literal设置而 v21.7.10.4 作为该系列的后期补丁版本主要目标不是新增功能而是修复影响用户可见行为的缺陷标记为Bug Fix (user-visible misbehaviour in official stable release)的部分均已在官方稳定版中暴露过将修复以 backport 方式合入维护分支兼顾内部稳定性改进。发布说明中每一项修复都标注了对应的 backport issue 与原始 PR 编号例如垂直合并改进对应 #28898这正是 ClickHouse 发布流程中修复先合入主分支、再 backport 到维护分支的体现。改进项垂直合并使用真实临时文件发布说明中的唯一一项 ImprovementUse real tmp file instead of predefined rows_sources for vertical merges. This avoids generating garbage directories in tmp disks.垂直合并vertical merge是 ClickHouse 按列进行后台数据合并的机制合并过程中需要记录每一行数据来自哪个原始 part的元信息此前这一信息被写入名为rows_sources的预定义文件中。如果该预定义路径与临时磁盘tmp disk的实际布局不一致就会在临时磁盘上遗留无用的垃圾目录。该改进将固定文件名替换为真实创建的临时文件从而消除这类残留目录。从发布说明的措辞看它属于内部资源管理层面的健壮性改进不改变合并的对外语义但对长期运行、频繁发生合并的服务器而言能减少临时磁盘上的碎片堆积。查询优化与语法解析层的修复PostgreSQL 风格 cast::运算符与负数Fix PostgreSQL-style cast (::operator) with negative numbers.ClickHouse 兼容 PostgreSQL 的::类型转换语法例如SELECT -1::Int32。该修复针对的是解析阶段负数与::运算符组合时产生的歧义或错误行为。此修复位于语法解析层直接影响所有使用 PostgreSQL 风格类型转换的用户属于兼容性体验修复。OR 链转 IN 优化在分布式查询中的缺陷Fix transformation of disjunctions chain toIN... in distributed queries with settingslegacy_column_name_of_tuple_literal 0.这是本版本中最值得展开的一项修复它同时牵涉两个查询级设置且都有明确的源码依据。1.optimize_min_equality_disjunction_chain_lengthOR 等值链转 IN 的阈值ClickHouse 的查询优化器会把形如expr x1 OR expr x2 OR ... OR expr xN的析取等值链合并成expr IN (x1, ..., xN)以提升索引与执行效率。该优化由optimize_min_equality_disjunction_chain_length控制其定义与默认值位于 src/Core/Settings.cppThe minimum length of the expression expr x1 OR ... expr xN for optimization默认值为3即等值链长度达到 3 才触发合并设为 0 则完全禁用该优化。实现该逻辑的类LogicalExpressionsOptimizer位于 src/Interpreters/LogicalExpressionsOptimizer.cpp其工作流程为collectDisjunctiveEqualityChains()遍历 AST收集满足expr literal形式、且or表达式无别名alias的等值链mayOptimizeDisjunctiveEqualityChain()校验链长度是否达到阈值、右侧字面量类型是否一致对LowCardinality列有特殊处理字典通常较小、索引相对较大合并为 IN 通常更优见 LogicalExpressionsOptimizer.cppaddInExpression()构造expr IN (x1, ..., xN)并对字面量元组排序以保证确定性见 LogicalExpressionsOptimizer.cppcleanupOrExpressions()与fixBrokenOrExpressions()删除已被替换的等值项并在 OR 只剩单个操作数时将其提升替换原 OR 节点同时处理 WHERE / PREWHERE / HAVING 根节点见 LogicalExpressionsOptimizer.cpp。该优化器在 src/Interpreters/TreeRewriter.cpp 中被调用属于查询重写tree rewriter阶段。2.legacy_column_name_of_tuple_literal21.7 滚动升级兼容开关第二个相关设置是legacy_column_name_of_tuple_literal定义见 src/Core/Settings.cppList all names of element of large tuple literals in their column names instead of hash. This settings exists only for compatibility reasons. It makes sense to set to true, while doing rolling update of cluster from version lower than 21.7 to higher.该设置默认值为false。21.7 版本改变了大型元组字面量列名的生成方式由列出所有元素名改为使用哈希这会影响分布式查询中子查询结果的命名。在做集群滚动升级从低于 21.7 的版本升到更高版本时应临时将其设为true以保证新旧节点之间查询结果列名一致。本次修复正是针对legacy_column_name_of_tuple_literal 0即新行为与分布式查询场景组合时OR 链转 IN 优化转换错误的问题。对 21.7 系列用户而言这项修复保证在新列名行为开启后分布式查询依然能正确执行该优化。副本元数据与一致性相关修复ZooKeeper watches 泄漏Fixed possible ZooKeeper watches leak on background processing of distributed DDL queue.分布式 DDL如ON CLUSTER语句通过 ZooKeeper 队列在集群内传播后台处理队列时若 watch 注册/注销管理不当会累积泄漏 watch长期运行可能耗尽 ZooKeeper 会话资源或影响处理效率。该修复解决了分布式 DDL 队列后台处理路径上的 watch 泄漏问题。ReplicatedVersionedCollapsingMergeTree排序键元数据错误Fix bug which can lead to errorExisting table metadata in ZooKeeper differs in sorting key expression.after alter ofReplicatedVersionedCollapsingMergeTree.ReplicatedVersionedCollapsingMergeTree是带版本号的多版本折叠合并树引擎。此前对该类表执行ALTER如修改排序键相关定义后ZooKeeper 中保存的表元数据与实际排序键表达式可能不一致从而在后续操作时报出元数据不一致错误。该修复保证了 alter 后副本间元数据的一致性避免复制队列被卡住。ReplicatedMergeTreeQueue良性竞态条件Fix benign race condition in ReplicatedMergeTreeQueue. Shouldnt be visible for user, but can lead to subtle bugs.复制表后台依赖ReplicatedMergeTreeQueue调度合并与拉取任务。该修复消除了一处良性竞态——虽然通常不会直接暴露给用户但可能引发难以追踪的细微问题如偶发的队列状态不一致。这是典型的防御性修复对长期运行的复制表集群具有稳定性价值。子列读取相关修复There is no subcolumn错误FixThere is no subcolumnerror, while select from tables, which haveNestedcolumns and scalar columns with dot in name and the same prefix asNested(e.g.n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64)).当表中同时存在Nested列与名称含点、且与 Nested 前缀相同的标量列时如示例中的n.id是普通列而n.arr1、n.arr2构成 Nested 列子列subcolumn解析会将二者混淆导致查询时报There is no subcolumn。该修复正确区分了同前缀点分名标量列与真正的 Nested 子列属于列名解析层的边界情况修复。发布说明中还有一条相关内部修复见下文 NOT FOR CHANGELOG 部分Fix usage of nested columns with non-array columns with the same prefix [2]说明该方向共经历了两轮修复。从 compact parts 读取子列Fix reading of subcolumns from compact parts.compact partsmin_bytes_for_compact_part/min_rows_for_compact_part触发的小型合并产物将多个列打包存储。该修复解决了从 compact parts 中读取子列如数组的size0、null掩码、Nested展开列时的错误确保子列在紧凑存储布局下同样可正确读取。分布式表创建与高阶数组函数分布式表参数错误导致 coredumpFix the coredump in the creation of distributed tables, when the parameters passed in are wrong.CREATE TABLE ... ENGINE Distributed(...)在传入非法参数如错误格式的集群名或分片键时可能触发进程崩溃coredump。该修复将此类错误收敛为正常的异常报错路径避免进程级崩溃。对需要动态建表的运维场景这一修复显著降低了误操作导致服务中断的风险。高阶数组函数与常量的崩溃Fix higher-order array functions (SIGSEGVforarrayCompact/ILLEGAL_COLUMNforarrayDifference/arrayCumSumNonNegative) with consts.高阶数组函数arrayCompact、arrayDifference、arrayCumSumNonNegative在处理常量参数consts时分别存在SIGSEGV段错误与ILLEGAL_COLUMN非法列类型两类异常。这些函数内部通常依赖ColumnArray::getOffsets()与参数列的按行展开常量列与数据列的内存布局不同若实现未正确处理 const 包装如ColumnConst就会触发上述错误。该修复统一补齐了这些函数对常量输入的处理。NOT FOR CHANGELOG内部稳定性变更发布说明末尾的NOT FOR CHANGELOG / INSIGNIFICANT部分记录了 5 项不进入对外 changelog 的内部变更它们在理解版本行为时同样有价值原生协议中增加更多 LCLowCardinality检查加强 native protocol 对 LowCardinality 类型传输的校验CHJIT 自定义内存管理器为查询编译缓存JIT引入独立的内存管理见compiled_expression_cache_size相关配置dictGet对 null 的默认实现完善字典函数对空值/缺省值的处理路径嵌套列与非数组列同前缀用法修复 [2]与前述There is no subcolumn修复同源的第二轮加固compiled_expression_cache_size降至 128MB降低编译表达式缓存的上限以控制 JIT 编译产物占用的内存适合内存受限环境。升级与验证建议综合本版本修复内容可以给出如下升级建议21.6 及以下版本向 21.7 滚动升级时请按官方建议将legacy_column_name_of_tuple_literal临时设为true待集群全部节点升级完成后再改回默认值false以避免分布式查询列名不一致问题设置定义见 src/Core/Settings.cpp。使用arrayCompact/arrayDifference/arrayCumSumNonNegative且参数可能为常量的业务建议优先升级本版本以消除潜在段错误风险。大规模使用复制表与分布式 DDL 的集群建议升级以获取 ZooKeeper watch 泄漏、复制队列竞态与元数据一致性修复降低长期运行隐患。自动化建表脚本中若存在Distributed引擎误用本版本的 coredump 修复可避免此类误操作拖垮进程。所有修复均已合入 v21.7.10.4-stable 维护分支可在 docs/changelogs/archive/v21.7.10.4-stable.md 查看完整条目及对应的 backport issue 链接。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表