ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

ClickHouse v24.10.2.80-stable 版本更新全解析:并行副本、查询优化与稳定性修复

ClickHouse v24.10.2.80-stable 版本更新全解析:并行副本、查询优化与稳定性修复 ClickHouse v24.10.2.80-stable 版本更新全解析并行副本、查询优化与稳定性修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文围绕 ClickHouse® 实时分析数据库在 2024 年 10 月发布的维护版本v24.10.2.80-stable相比 v24.10.1.2812-stable展开系统梳理本次补丁版本引入的行为变更、性能改进、功能增强与数十项用户可见的缺陷修复。文章不仅逐条还原 v24.10.2.80-stable 变更日志 的全部条目还结合 src/Core/Settings.cpp、src/Common/escapeForFileName.cpp、programs/su/su.cpp 等源码深入解释相关设置的默认值、取值与底层原理帮助你理解这个版本改了哪些东西、为什么会这样改、升级后需要注意什么。读完本文你将掌握本次版本的默认值变更及其对并行副本parallel replicas查询的影响、若干高危崩溃与数据读取错误的修复细节、clickhouse-client 与clickhouse su等工具层面的改动以及升级到 v24.10.2.80-stable 时应重点关注的行为差异。版本概况与发布背景v24.10.2.80-stable是 ClickHouse24.10 系列的一个补丁maintenance版本构建号96b80057159其变更内容全部为对上一个稳定版v24.10.1.2812-stable构建号9cd0a3738d5的反向移植backport。从 变更日志文件 的分类看本版本包含1 项Backward Incompatible Change不兼容变更1 项Performance Improvement性能改进6 项Improvement功能改进25 项Bug Fix用户可见缺陷修复1 项Build/Testing/Packaging Improvement构建与打包改进若干NOT FOR CHANGELOG / INSIGNIFICANT内部修复条目。这类补丁版本的设计目标是在不引入新功能的前提下尽快修复 24.10 主版本中发现的问题因此特别适合生产环境平滑升级。不兼容变更JSON 子列文件名转义修复本次唯一被标记为Backward Incompatible Change的修复PR #71182由 Pavel Kruglov 提交针对的是 JSON 子列JSON subcolumns在文件系统中的命名问题修复因 JSON 子列文件名中未转义的特殊字符导致的No such file or directory错误。JSON 类型的子列在落盘时其内部路径/名称需要被编码为合法的文件系统文件名。源码中完成这一编码/解码职责的是 src/Common/escapeForFileName.cppescapeForFileName将每个非isWordCharASCII非字母数字/下划线字符编码为%XX大写十六进制例如点号、冒号、斜杠等都会被转义unescapeForFileName反向解码%XX序列还原原始字符。对应测试见 src/Common/tests/gtest_unescapeForFileName.cpp其中验证了172.19.0.6、abcd.、..::等含特殊字符的字符串在转义-反转义后保持不变。为什么算不兼容修复后含特殊字符的 JSON 子列在文件系统中的存储名称会发生变化之前未转义、之后正确转义。升级后首次读取旧格式数据时若数据目录中存在按旧规则落盘的子列文件可能需要先完成一次元数据/文件名的迁移或重新写入因此官方将其标注为不兼容变更。从源码结构看这主要影响启用JSON类型及dynamic/variant相关子列的存储场景。性能改进query_metric_log 采集区间优化PR #71473Pablo Marcos优化了system.query_metric_log的采集逻辑通过缩小临界区critical region改进system.query_metric_log采集区间的性能与准确性。query_metric_log周期性地从各查询线程收集指标并写入系统表。原实现中指标收集与记录过程的临界区过大导致高并发场景下线程互相等待、采集间隔被拉长且数据不够准确。本次调整缩短了持锁/临界区范围从而降低了对查询线程的阻塞提升了采集间隔的稳定性。功能改进Improvement1. 默认开启parallel_replicas_local_planPR #70171Igor Nikonov将设置parallel_replicas_local_plan的默认值改为启用当前仓库 src/Core/Settings.cpp 中其默认值为true。该设置的作用是在查询发起方initiator为本地副本构建完整、成熟的本地执行计划local plan而不是把分布式查询拆解后以较简单的方式下发。这样做带来的收益如变更日志所述提升并行副本parallel replicas查询的整体性能降低发起方与副本之间的资源消耗为应用更多查询优化query optimizations创造机会。与它配套生效的关联设置同样定义在 src/Core/Settings.cpp设置默认值说明parallel_replicas_index_analysis_only_on_coordinatortrue仅在副本协调者coordinator上做索引分析其余副本跳过仅当parallel_replicas_local_plan开启时有效parallel_replicas_support_projectiontrue并行副本中可应用投影projection优化仅当parallel_replicas_local_plan开启且aggregation_in_order未启用时有效parallel_replicas_only_with_analyzertrue使用并行副本必须开启 analyzer否则回退为本地执行从 src/Core/SettingsChangesHistory.cpp 可以看到该默认值在 24.10 系列中的变更历史这正是本版本作为行为变化被记入变更日志的原因——升级后并行副本查询将自动走本地计划路径。2. 并行副本下的 RIGHT / FULL JOIN 支持PR #71162Igor Nikonov修复了并行副本查询中的 JOIN 问题RIGHT JOIN现在可以在并行副本模式下执行右侧表的读取被分布式化right table reading is distributedFULL JOIN无法在节点间并行化仍由单个节点本地执行。结合 src/Core/Settings.cpp 中parallel_replicas_prefer_local_join的说明可知并行副本 JOIN 的本地化策略是能并行读的表尽量并行读只有必须物化的侧如 FULL JOIN 的右侧留在本地执行。3.clickhouse su支持数字 UID:GIDPR #71626Mikhail f. Shiryaev修复了当用户/组以ID 形式给出时clickhouse su失败的问题现在同时支持用户名和数字UID:GID。对应实现位于 programs/su/su.cppsetUserAndGroup函数会先用tryParse尝试把参数解析为数字uid/gid解析失败或解析为 0 时再回退到getpwnam_r/getgrnam_r按名称查找只有输入确实能被解析为数字时才尝试getpwuid_r/getgrgid_r按 ID 查找避免把名称解析失败静默当成 root见 su.cpp 中关于不能静默回退到 uid 0的注释。4. HostResolver 历史期内解析 3 次PR #71863Sema Checherinda将主机名解析器HostResolver在一个history周期内的更新次数调整为 3 次用于在 DNS 变更时更快地感知新的解析结果平衡解析开销与及时性。5.allow_reorder_prewhere_conditions默认开启PR #71867Raúl Marín将allow_reorder_prewhere_conditions默认开启含旧兼容性设置场景。该设置在 src/Core/Settings.cpp 中的定义与说明为当把条件从 WHERE 移动到 PREWHERE 时允许对条件重新排序以优化过滤效果。默认值为true。它属于 PREWHERE 条件优化链中的一环同族的move_all_conditions_to_prewhere、enable_multiple_prewhere_read_steps、move_primary_key_columns_to_end_of_prewhere等设置共同决定了 WHERE 条件下推与过滤顺序的优化策略见 src/Core/Settings.cpp。该默认值变更同样记录在 src/Core/SettingsChangesHistory.cpp。用户可见缺陷修复Bug Fix本节汇总 25 项用户可见修复按其影响的子系统分类说明。查询执行与 Analyzer 相关quantileExactWeightedInterpolated聚合函数名不匹配PR #71168修复函数名拼写不一致导致的错误问题由 PR #69619 引入。Dynamic 类型比较中的bad_weak_ptr异常PR #71183修复使用Dynamic类型参与函数比较时抛出bad_weak_ptr异常的问题。LowCardinality 字典从 Dynamic 列反序列化失败PR #71299修复从Dynamic列反序列化LowCardinality字典时可能出现的Cannot read all data错误。Variant 列 Chunk 行数错误PR #71388修复含Variant列时Invalid number of rows in Chunk错误。arrayJoin 出现在 WHERE 中时的Argument for function must be constantPR #71476旧 analyzer 下 arrayJoin 看似出现在 WHERE 条件中时可能报错为 PR #65414 引入的回归。SortCursor 0 列崩溃PR #71494旧 analyzer 下 SortCursor 遇到 0 列时崩溃的防护。物化视图内 IN 与 CTE 的 Analyzer 问题PR #71538物化视图内查询使用IN配合 CTE 时 Analyzer 出错关闭 issue #65598。约束中使用 UDF 导致崩溃PR #71541避免在约束constraint中调用 UDF 时崩溃。ALTER 空元组触发 LOGICAL_ERRORPR #71679修复ALTER使用空元组时的LOGICAL_ERROR。NOT IN 下分区列常量集不转换PR #71695NOT IN运算符下不再对分区列上的常量集合做转换。DateTime64 主键上toDayOfWeek异常PR #71849修复 WHERE 条件使用 DateTime64 主键调用toDayOfWeek时的异常。稀疏列默认值填充PR #71854修复解析到稀疏列sparse columns后默认值填充缺失的问题。位运算与索引分析bitShift 越界不再抛错PR #71580bitShift系列函数在移位越界时返回 0 或默认字符而不是抛出错误。存储、缓存与文件系统文件系统缓存内存增长PR #71261修复enable_filesystem_cache1但存储配置中磁盘没有缓存配置时内存占用持续增长的问题。数据 part 析构加入 try/catchPR #71364为数据 part 析构函数增加异常捕获避免terminate。客户端与交互界面客户端并行输出格式清理不完整PR #71304修复 clickhouse-client 并行输出格式清理不完整的问题。客户端进度表数据竞争PR #71901修复FROM INFILE场景下进度指示器与进度表之间的数据竞争并在 INSERT 查询期间拦截按键以切换进度表显示。语法高亮崩溃PR #71949修复 clickhouse-client 语法高亮导致的崩溃关闭 issue #71864。权限与配置命名集合缺失反转义导致服务无法启动PR #71308。错误通配符授权导致 AST 格式化不一致PR #71332修复授予错误的通配符wildcard授权时 AST 格式化不一致的问题。类型与平台兼容性JSON 类型提示中的可疑/实验类型检查PR #71369在 JSON 类型提示中检查可疑与实验性类型。非 Linux 平台启动内存工作线程PR #71384在非 Linux 操作系统上也启动内存工作线程memory worker thread修复 issue #71051。mongodb 表函数参数错误导致崩溃PR #71426修复mongodb表函数传入错误参数如NULL时的崩溃。查询优化器optimize_rewrite_array_exists_to_has崩溃PR #71432修复开启该优化时可能出现的崩溃。构建 / 测试 / 打包改进PR #71573弃用CLICKHOUSE_UID/CLICKHOUSE_GID环境变量移除CLICKHOUSE_DOCKER_RESTART_ON_EXIT处理以满足合规要求统一clickhouse/clickhouse-server/clickhouse-keeper的启动入口避免同一组件在部分位置为裸命令、在另一位置为/usr/bin/clickhouse*的不一致。升级镜像的用户应检查是否依赖被弃用的环境变量并改为使用官方推荐的运行方式。内部修复NOT FOR CHANGELOG / INSIGNIFICANT本版本还包含一批不入正式变更日志的内部修复主要价值在于保证测试与发布流程稳定移除有问题的测试test_system_replicated_fetchesPR #71071修复并行副本下子查询中的WITH TOTALSPR #71224某些场景下忽略No such key异常PR #71236修复与旧版 clickhouse-server 创建的刷新物化视图refreshable materialized view的兼容性PR #71556修复孤儿 backport 分支与已关闭发布 PR 在 check DB 上的误报问题PR #71782关闭 issue #71780PR #71818将 docker-library 官方镜像的Dockerfile.ubuntu修复反向移植到各分支PR #71825。升级注意事项与验证综合本版本内容升级到 v24.10.2.80-stable 建议关注以下几点默认值变更parallel_replicas_local_plan与allow_reorder_prewhere_conditions默认开启并行副本查询与 PREWHERE 过滤行为会发生变化若需要保持旧行为可显式设置parallel_replicas_local_plan0、allow_reorder_prewhere_conditions0设置默认值可查 src/Core/Settings.cpp 与 src/Core/Settings.cpp。不兼容变更JSON 子列文件名的转义规则被修复升级后首次访问旧 JSON 数据时请验证子列是否可正常读取。命名集合修复此前因特殊字符未反转义导致服务无法启动的场景已被修复含特殊字符的集合名可正常解析。工具修复clickhouse su现在支持UID:GID数字形式clickhouse-client 的FROM INFILE进度表与语法高亮崩溃问题已修复。如需验证当前分支的对应实现可继续阅读 src/Core/Settings.cpp、src/Common/escapeForFileName.cpp、programs/su/su.cpp 以及 docker/server/Dockerfile.ubuntu并在 docs/changelogs/archive/v24.10.2.80-stable.md 中查看完整条目列表。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

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