ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ClickHouse v21.9.2.17-stable 版本更新全解析:funnel 严格模式修复、S3 大对象复制与 22 项稳定版 Bug 修复

ClickHouse v21.9.2.17-stable 版本更新全解析:funnel 严格模式修复、S3 大对象复制与 22 项稳定版 Bug 修复 ClickHouse v21.9.2.17-stable 版本更新全解析funnel 严格模式修复、S3 大对象复制与 22 项稳定版 Bug 修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇技术指南基于 ClickHouse 官方变更日志 v21.9.2.17-stable 展开逐条解读该稳定版本相对于 v21.9.1.8000-prestable 的全部变更包括 3 项功能改进、8 项常规 Bug 修复、1 项构建/测试改进以及面向稳定版用户的 22 项用户可见问题修复。读者读完可完整掌握该版本的修复脉络并深入理解 windowFunnel 严格模式、PREWHERE 自动优化、S3 分片上传、clickhouse-keeper 会话管理等核心模块的底层实现原理。版本背景v21.9.2.17-stable 与 v21.9.1.8000-prestablev21.9.2.17-stable 是 ClickHouse 21.9 系列在 2022 年发布的一个重要稳定版本其变更基线base是 prestable 版本 v21.9.1.8000。所谓 stable 版本意味着本次发布只包含从 prestable 分支精选出的改进与修复不引入新功能重点在于把经过验证的修复回移backport到稳定分支确保生产环境的可靠性。本版本共包含以下分类的变更分类条目数说明Improvement功能改进3库字典符号链接、S3 大对象分片上传、Keeper 会话过期逻辑Bug Fix常规修复8覆盖漏斗函数、会话存储、类型转换、分布式表等Build/Testing/Packaging Improvement1CI 构建基础设施调整Bug Fix (user-visible misbehaviour in official stable release)22官方稳定版中的用户可见问题修复NOT FOR CHANGELOG / INSIGNIFICANT9内部小修复不进入对外变更日志功能改进Improvement允许库字典library dictionary路径使用符号链接本次改进允许在库字典的路径配置中使用符号链接symlink。字典是 ClickHouse 中常用的数据映射机制其路径此前要求必须是真实文件路径这在某些通过符号链接管理数据目录的部署环境下会造成不便。此次改动后字典路径解析对符号链接更加宽容。S3 大对象上传改用 Multipart Copy对于大体积的 S3 对象本次更新改用Multipart copy upload分片复制上传方式。此前 S3 上的大对象复制操作容易受到单次请求大小限制单次 CopyObject 最大支持 5GB或超时影响改用分片上传后大对象会被拆分成多个 part 并行复制显著提升大对象跨桶复制、备份等场景的稳定性与吞吐。从仓库结构看S3 相关存储与备份实现位于 src/Storages 与 src/Backups 目录中其中 StorageS3 类负责与 S3 存储的底层交互。修复 Keeper 中奇怪的会话过期逻辑clickhouse-keeper内置的 ZooKeeper 兼容协调服务源码位于 src/Coordination此前存在一处会话过期逻辑异常可能导致会话被过早或错误地判定过期。该问题在 CI 的 stress test 中曾被观察到。此次修复对应 PR #28519调整了会话过期的判定时机使 Keeper 的会话管理行为符合预期。常规 Bug 修复Bug FixwindowFunnel 严格模式修复本版本修复了windowFunnel聚合函数在strict模式下的一个 Bug修复 issue #27469。windowFunnel用于在滑动时间窗口内统计漏斗转化路径其核心实现在 src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp。从源码可以看出该函数支持多种严格模式开关见该文件中的定义strict_deduplication同一事件去重仅对不重复的值应用条件strict_order不允许其他事件的插入干扰路径例如在A-B-D-C序列中遇到D即停止寻找A-B-C此时最大事件层级为 2strict_increase仅对时间戳严格递增的事件应用条件allow_reentry允许重入/跳过未来的步骤。源码注释还明确指出windowFunnel最多支持 32 个事件The max size of events is 32且算法整体复杂度为 O(n·log n)排序主导这为漏斗分析提供了明确的上限约束。本次修复确保了strict模式下漏斗层级的计算结果正确。修复 NamedSessionStorage 关闭顺序NamedSessionStorage负责保存客户端命名会话上下文此前在关闭时存在顺序问题全局上下文global context先被销毁而会话上下文尚未销毁可能导致析构时的访问冲突。本次修复PR #27875确保NamedSessionStorage中的会话上下文在全局上下文销毁之前完成销毁消除了关闭阶段的未定义行为。修复 PostgreSQL 风格::类型转换对负数的处理::是 PostgreSQL 风格的类型转换运算符。此前该运算符在处理负数时存在解析错误例如某些带负号的表达式会被错误解析。本次修复PR #27876保证了::运算符对负数场景的正确处理使 ClickHouse 的 PostgreSQL 兼容层行为更准确。修复 LowCardinality(UUID) 列上使用 extremes 的选择查询extremes是SELECT查询中的一个修饰符用于额外返回一列极值最小值/最大值。此前当目标列为LowCardinality(UUID)类型时极端值计算会出错。本次修复PR #27918解决了该类型组合下的计算异常。创建 Distributed 表时校验集群名此前可以通过CREATE TABLE ... ENGINE Distributed指定一个不存在的集群名导致后续查询失败或行为异常。本次修复PR #27927修复 issue #27832在创建 Distributed 表时即校验集群名称是否真实存在不允许使用错误的集群名建表将错误前置到建表阶段。相关实现可参考 src/Storages/StorageDistributed.cpp。修复 GRANT WITH REPLACE ... ON CLUSTER 的权限检查当执行带ON CLUSTER子句的GRANT WITH REPLACE语句时此前存在权限检查缺失的问题。本次修复PR #27983是对此前 PR #27701 修复的进一步完善确保集群级权限替换操作经过正确的访问权限校验。修复读缓冲区 attempt to read after end of file 错误某些场景下如压缩数据读取、文件末端边界读取缓冲区会抛出 attempt to read after end of file 异常issue #26149。本次修复PR #28150处理了这类边界情况避免在文件末尾发生错误的越界读取。修复析取链转 IN 优化在分布式查询中的兼容问题optimize_min_equality_disjunction_chain_length设置默认值为 3定义于 src/Core/Settings.cpp控制将等值析取链a 1 OR a 2 ...优化为IN子句的最短长度。此前当分布式查询同时设置了legacy_column_name_of_tuple_literal 0时该转换会产生错误结果。本次修复PR #28658保证了该优化在分布式场景与新的 tuple 字面量命名策略下的正确性。构建 / 测试 / 打包改进本版本包含一项构建基础设施调整PR #28016由于默认的 Ubuntu apt 仓库archive.ubuntu.com在 CI 环境中响应不稳定临时将 CI 使用的 Ubuntu apt 源切换为镜像 ru.archive.ubuntu.com。这是一项纯 CI 侧改动不影响用户安装 ClickHouse 的仓库配置。稳定版用户可见问题修复Bug Fix in Official Stable Release这是本版本最重要的部分共 22 项针对在官方稳定版中被用户观察到的真实问题。JSONExtract 处理 Nullable(String) 空值此前JSONExtract函数在处理类型为Nullable(String)的 null 值时处理有误修复 issue #27929、#27930该问题由 PR #25452 引入。本次修复PR #27939确保JSONExtract对 JSON 中的 null 能正确返回 SQL NULL而非异常或错误值。修复关闭时的极端罕见段错误由于 context / config reloader配置热加载器的关闭顺序不正确极少数情况下进程退出会发生段错误。本次修复PR #28088调整了两者的关闭顺序消除了 shutdown 阶段的崩溃隐患。修复 WHERE 到 PREWHERE 的过度条件移动optimize_move_to_prewhere设置默认开启定义于 src/Core/Settings.cpp控制是否将WHERE条件自动下推到PREWHERE阶段以加速扫描。此前该优化可能将过多条件移动到PREWHERE导致行为异常。本次修复PR #28139限制了移动条件的数量使优化更保守、更正确。根据 src/Core/Settings.cpp 的说明该优化仅对 *MergeTree 家族表生效并伴随相关设置optimize_move_to_prewhere_if_final默认 false控制带FINAL修饰符的查询是否执行 PREWHERE 优化move_all_conditions_to_prewhere默认 true是否将所有可行的条件从 WHERE 移到 PREWHERE。Projection投影的多项小修复投影projection是 ClickHouse 的物化索引机制。本版本对投影进行了多项小修复PR #28178涉及投影在部分查询场景下的正确性问题详细描述见对应 PR。clickhouse-keepergetChildren 监听触发顺序修复当getChildren子节点列表监听与子节点的set请求同时发生时clickhouse-keeper 存在行为异常。本次修复PR #28190保证了监听事件在正确的请求之后触发。clickhouse-keeper监听响应先于请求-响应返回的竞态clickhouse-keeper 中存在一个罕见竞态客户端可能在收到请求-响应之前就收到 watch监听响应。本次修复PR #28197消除了这一响应乱序问题。修复 Nullable(LowCardinality) 类型 extremes 读取未初始化内存当查询包含Nullable(LowCardinality)类型列且使用extremes时可能读取到未初始化内存issue #28165。本次修复PR #28205通过正确的初始化避免了该内存读取风险。修复自定义 TLD 文件末尾无换行的读取问题自定义顶级域名TLD列表文件在末尾没有换行符时此前无法被正确读取。本次修复PR #28213使该边界情况下的文件解析恢复正常。修复 ORDER BY 与 Merge 表的 optimize_read_in_order 结果不一致optimize_read_in_order设置默认开启见 src/Core/Settings.cpp允许按排序键顺序读取数据。此前在Merge表将多个表合并为一个虚拟表上启用该优化并带ORDER BY时查询结果可能不一致。本次修复PR #28266保证排序结果正确。修复空 part 替换导致 part 相交的问题MergeTree 的合并过程中新 part 被空 part 替换后可能出现 part 相交intersecting parts破坏 part 集合的不变性。本次修复PR #28310避免了该数据布局错误。修复 NOT IN 索引优化未使用全部键列当索引键存在多列而NOT IN查询未使用全部键列时索引优化会产生错误结果issue #28120。本次修复PR #28315确保索引下推逻辑正确处理部分键列场景。修复连接时 nullable 列的非连接行在 JOIN 操作中来自 nullable 列的非连接行未匹配行此前可能输出错误值issue #27691。本次修复PR #28349保证 JOIN 未匹配行的 nullable 填充正确。修复 clickhouse-keeper 设置变更导致日志丢失与挂起极少数情况下修改 clickhouse-keeper 的某些运行时设置可能导致日志丢失甚至服务挂起。本次修复PR #28360消除了该风险保证设置热更新安全。修复 MaterializedPostgreSQL 表名缺少引号MaterializedPostgreSQL 引擎在生成内部 SQL 时表名此前未正确加引号导致包含大写字母或特殊字符的表名无法正常工作issue #28316。本次修复PR #28433补全了表名的引用。修复分布式 DDL 队列后台处理中的 ZooKeeper watch 泄漏分布式 DDL 队列在后台处理过程中可能泄漏 ZooKeeper watchissue #26036。本次修复PR #28446确保 watch 被正确释放避免长期运行后的资源耗尽。修复 ReplicatedVersionedCollapsingMergeTree ALTER 后元数据不一致对ReplicatedVersionedCollapsingMergeTree执行ALTER后可能出现 Existing table metadata in ZooKeeper differs in sorting key expression 错误issue #28515。本次修复PR #28528使 ZooKeeper 中的元数据在 ALTER 后保持同步。修复 Nested 列与同前缀点号列冲突当表中同时存在Nested列和名字带点号、且前缀与 Nested 列同名的标量列时例如n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64)查询会报 There is no subcolumn 错误。本次修复PR #28531解决了该命名冲突导致的子列解析失败。修复 MaterializeMySQL 内部 DDL 的 DROP TABLE 产生 UUID 重叠MaterializeMySQLMySQL 数据实时同步引擎的内部 DDL 在DROP TABLE时可能产生 UUID 重叠破坏表标识的唯一性。本次修复PR #28533消除了该问题。修复截断的 bzip2 归档导致死循环当读取被截断truncated的 bzip2 压缩归档时此前可能陷入无限循环。本次修复PR #28543正确检测 EOF避免解压死循环。修复 s2RectAdd / s2RectContains 参数个数校验s2RectAdd和s2RectContains两个地理函数基于 S2 几何库此前对参数个数的校验有误传入错误数量的参数时行为异常。本次修复PR #28663补全了参数数量校验。为 system.processes 增加 Settings.Names / Settings.Values 别名system.processes系统表新增了Settings.Names与Settings.Values列别名PR #28685方便用户在查询进程列表时以更直观的命名方式读取每个查询的设置项。修复 Distributed 表创建参数错误时的崩溃创建分布式表时若传入错误参数此前可能导致 coredump核心转储崩溃。本次修复PR #28686将参数校验前置改为抛出正常的异常信息而非进程崩溃。内部修复NOT FOR CHANGELOG / INSIGNIFICANT以下变更不进入对外变更日志但对稳定性同样有意义修复 MySQL 数据源中无异常抛出throw without exception的问题PR #28027修复REPLACE PARTITION与MOVE PARTITION之间的竞态PR #28035CI 基础设施的后续修正PR #28036固定 tzlocal 版本为 2.1保证 CI 环境可复现PR #28063CHJIT 自定义内存管理器PR #28236为 JIT 编译compile_expressions等场景提供专用内存分配修复 ODBC 连接持有者的悬空引用dangling referencePR #28298再次尝试修复 BackgroundPoolTask 计数递减问题PR #28353更精确地校验 ZooKeeper 根节点是否存在PR #28412dictGet函数针对 null 的默认实现PR #28530。其中dictGet默认实现与字典功能相关函数实现位于 src/Functions 目录下JIT 内存管理相关逻辑与 src/Common 中的 CHJIT 组件关联。这些修复虽小但体现了发布前对代码质量与资源生命周期的细致打磨。如何验证与使用本版本若需验证上述修复是否生效可从仓库源码入手windowFunnel严格模式的实现细节见 src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp可通过构造包含插队事件如A-B-D-C的数据集在strict_order模式下观察漏斗层级是否稳定返回 2各类查询优化开关的默认值与说明见 src/Core/Settings.cpp例如optimize_move_to_prewhereL1000、optimize_min_equality_disjunction_chain_lengthL1833、optimize_read_in_orderL4432、legacy_column_name_of_tuple_literalL6670分布式表集群名校验可参考 src/Storages/StorageDistributed.cpp 的建表路径clickhouse-keeper 的会话与 watch 管理逻辑位于 src/Coordination 目录。本版本仓库为只读以上源码路径用于辅助读者理解与验证安装与升级仍通过官方发布渠道进行。整体而言v21.9.2.17-stable 是一次以稳定性收敛为核心目标的版本既修复了窗口函数、类型转换、JOIN、投影等查询侧问题也覆盖了 Keeper、S3、MaterializeMySQL/PostgreSQL 等集成组件的健壮性适合 21.9 系列生产用户平滑升级。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进