尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ClickHouse v20.5.3.27-stable 修复版本全解析:从函数边界到存储引擎的稳定性加固

ClickHouse v20.5.3.27-stable 修复版本全解析:从函数边界到存储引擎的稳定性加固 ClickHouse v20.5.3.27-stable 修复版本全解析从函数边界到存储引擎的稳定性加固【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文基于当前仓库中 docs/changelogs/archive/v20.5.3.27-stable.md 这一发布说明系统梳理 ClickHouse® v20.5.3.27-stable 相对 v20.5.2.7-stable 的全部变更。该版本是一个典型的稳定加固型修复版本涵盖 1 项改进、40 余项 Bug 修复以及 1 项构建/测试改进横跨函数执行、类型系统、存储引擎、服务器生命周期、外部数据源集成等多个核心模块。读完本文你将理解每个修复背后的根因、涉及的功能模块及其在当前仓库源码中的对应实现可作为排查同类问题、评估升级风险与深入理解 ClickHouse 内部机制的参考。版本类型说明FIXME字样是 ClickHouse 变更日志自动化流程的占位标记正式发布时会被替换为实际基准版本信息本文以仓库存档文档为准进行解读。一、版本概览一次聚焦稳定性的补丁发布v20.5.3.27-stable 是 20.5 系列的一个补丁版本Patch Release其变更基线为 v20.5.2.7-stable。与功能型大版本不同此类版本的核心目标是在不大幅引入新特性的前提下集中修复用户在生产环境中暴露的缺陷Improvement改进1 项涉及 S3 日志级别调整Bug Fix缺陷修复40 余项覆盖查询执行正确性、类型系统尤其是 LowCardinality、存储引擎、系统日志、服务器启动/关闭流程、外部数据源等Build/Testing/Packaging Improvement构建/测试/打包改进1 项涉及 Docker 构建NO CL ENTRY无变更日志条目的合入1 项 cherry-pick 记录。值得注意的是大量修复带有 Backported in #XXXX 标记说明这些修复先在其他分支合入后再通过 cherry-pick 移植到 20.5 分支这体现了 ClickHouse 对历史 LTS 分支的持续维护机制。二、ImprovementS3 日志降噪变更内容将无用的 S3 日志从普通级别移动到 TRACE 级别PR #12067。背景解读S3 存储后端S3表引擎与s3表函数在每次对象读写时会产生大量请求级日志。在高频访问场景下这些日志会显著增加日志量、干扰关键告警的检索。将其降为 TRACE 级别后默认日志级别下不再输出只有在需要深度诊断 S3 请求路径时才通过开启 TRACE 日志查看。这一改动体现了 ClickHouse 对默认日志噪音的治理思路将调试期有用、运行期冗余的信息与日常可观测信息分层。仓库佐证S3 相关后端实现在 src/Storages/S3 目录下包含S3表引擎、s3表函数及磁盘后端等实现与之配套的 S3 请求配置如重定向限制、超时可在 src/Disks 下与 S3 相关的磁盘实现中找到对应逻辑。三、Bug Fix 详解上查询执行与函数正确性这一组修复直指查询执行引擎在边界条件下的正确性问题多数由用户 issue 驱动属于能用但极端输入下行为错误的典型场景。3.1 通配符展开的合法性校验修复SELECT *, xyz.*这类查询此前会成功执行而预期应当报错PR #11753。该修复确保当xyz.*与顶层*同时出现且语义冲突时查询解析/分析阶段能够正确抛出异常避免产生误导性的结果集。3.2 HTTP 接口的内存记账wait_end_of_query1修复通过 HTTP 接口执行查询时存在内存记账缺失在启用wait_end_of_query1等待查询完全结束再返回响应的场景下可能导致内存统计偏差显著PR #11840。原理说明HTTP 接口下wait_end_of_query控制服务端在将响应流式返回前是否等待查询彻底完成。该模式下请求生命周期与查询生命周期的绑定关系更为复杂若内存追踪未正确覆盖等待结束阶段system.metrics、system.query_log中的内存数据便不准确进而影响基于内存上限的调度与max_memory_usage等限制的判定。该参数相关的服务端处理逻辑位于 src/Server/HTTPHandler.cpp。3.3 neighbor 函数极端偏移量修复当neighbor作为查询唯一返回表达式、且偏移量为-9223372036854775808即Int64最小值时查询可能返回空结果PR #12019对应 issue #11367。源码级解释在 src/Functions/neighbor.cpp 中当偏移量为常量时函数首先计算offset (1 30) || offset -(1 30)以防护可能的溢出并抛出ARGUMENT_OUT_OF_BOUND而在逐行执行的路径中src/Functions/neighbor.cpp#L199-L203同样对每行偏移做相同的边界检查。-9223372036854775808恰好等于Int64的最小值对它的取负运算本身就会溢出修复前在src_idx row offset等算术路径上容易产生未定义行为进而导致结果集异常。该函数本质上按数据块的物理顺序取相邻行的值因其易误用已被标记为 deprecated需要通过allow_deprecated_error_prone_window_functions设置才能启用官方建议改用正规窗口函数。3.4 ORDER BY 多列 COLLATE 常量列崩溃修复当ORDER BY涉及多列、且其中一列是带COLLATE的常量列时可能崩溃PR #12020该缺陷由 PR #11006 在 20.5 中引入。修复后对常量列 排序规则的处理不再触发解引用崩溃。3.5 if 函数对 FixedString 的处理修复if函数接收两个不同大小的FixedString参数时此前可能产生错误结果甚至崩溃PR #12021。修复后正确按公共超类型supertype对齐两侧参数的宽度后再执行分支选择。3.6 常量表达式约束检查修复当表约束CONSTRAINT本身是常量表达式时约束检查逻辑此前存在缺陷PR #12042修复后常量形式的约束能被正确校验。3.7 topK 对 Enum 类型的返回类型修复topK聚合函数此前对 Enum 类型输入返回整型而非 Enum修复后返回正确的 Enum 类型PR #12043对应 issue #3740。这一修复保持了topK与any、groupArray等函数在类型保真上的行为一致性。3.8 defaultValueOfArgumentType 与 LowCardinality修复defaultValueOfArgumentType接收LowCardinality类型参数时报错Expected single dictionary argument for functionPR #12056对应 issue #11808。该修复还通过 cherry-pick#12205同步到 20.5 分支属于典型的跨分支移植。源码佐证在 src/Functions/defaultValueOfArgumentType.cpp 中该函数通过type.createColumnConst(input_rows_count, type.getDefault())为输入类型生成全局默认值数字为 0、字符串为空串、Nullable 为 NULL。由于它显式声明useDefaultImplementationForLowCardinalityColumns()返回falseL34修复前对 LowCardinality 的字典参数处理不当会触发上述报错。3.9 greatCircleDistance / geoDistance 潜在死循环修复修复greatCircleDistance、geoDistance的潜在死循环问题PR #12137对应 issue #12117。实现背景这两个地理距离函数实现在 src/Functions/greatCircleDistance.cpp采用基于泰勒级数、三角恒等式与查找表ASIN_SQRT_LUT_SIZE 512、COS_LUT_SIZE 1024等见 L55-L57的数值优化方案用于在大数据量下高效计算球面/椭球面距离。修复针对的是特定输入下数值迭代路径无法收敛的场景。3.10 整数除法溢出与 UInt8 逻辑函数整数除法溢出修复潜在的分母为-9223372036854775808类极端值导致的整数除法溢出PR #12140。UInt8 逻辑函数修复 UInt8 值不等于 0 或 1 时如 2、255逻辑函数and、or、not的错误行为PR #12196确保逻辑运算对非布尔取值也能给出确定语义。3.11 arrayFill 空数组崩溃修复arrayFill函数对空数组处理不正确可能导致崩溃PR #12279。修复后空数组输入能够安全返回空结果。3.12 WITH FILL 的列顺序修复WITH FILL修饰符此前不遵守ORDER BY语句的列顺序PR #12306修复后填充列与排序键列的对应关系保持正确。四、Bug Fix 详解中类型系统与 LowCardinalityLowCardinality低基数优化类型是 ClickHouse 的重要优化手段但因其字典 编码列的实现方式与其他类型系统机制的交互容易出现边界缺陷。本版本集中修复了多类相关问题。4.1 JOIN 与 partial_merge 算法崩溃修复join_algorithmpartial_merge且参与 JOIN 的列为LowCardinality类型时可能崩溃PR #12035。partial_merge算法通过分批合并有序子集的方式实现 JOIN对键列的编码/解码一致性要求较高修复后 LowCardinality 键列在该算法下不再触发崩溃。4.2 高阶函数与 Tuple(LowCardinality)修复高阶函数higher-order functions如arrayMap、arrayFilter等接收Tuple(LowCardinality)参数时报错Cannot capture columnPR #12055对应 issue #9766。原理说明高阶函数通过 Lambda 捕获列数据而 LowCardinality 列的底层是字典列捕获时若未正确处理字典结构便会报错。修复后 lambda 捕获路径能正确解包 LowCardinality 的字典列。4.3 Parquet 格式对 LowCardinality 的支持修复Parquet输入/输出格式正确支持LowCardinality与LowCardinality(Nullable)类型PR #12108对应 issue #12086 与 #8406。此前的读写会产生类型转换错误或数据损坏。4.4 LowCardinality 公共类型转换UNION ALL修复实现 LowCardinality 类型到公共类型的转换使UNION ALL可以合并LowCardinality 列与普通列PR #12275对应 issue #8212 与 #4342。此前这类查询会因类型不一致而报错。4.5 虚拟列过滤的 Nullable bad cast修复当表达式按虚拟列如Merge表的_table或系统表索引列如system.tables的数据库名列过滤、且表达式返回Nullable类型时此前可能抛出bad cast异常PR #12305对应 issue #12166。修复后 Nullable 结果能安全参与过滤判断。五、Bug Fix 详解下存储引擎、系统日志与服务器稳定性5.1 存储策略切换后数据不移动修复从默认存储策略default切换到其他存储策略后数据迁移move不执行的问题PR #11893。该修复涉及ALTER TABLE ... MOVE、TTL TO VOLUME以及基于storage_policy的自动迁移逻辑修复后切换策略时基于策略规则的搬迁能正确触发。5.2 ReplicatedVersionedCollapsingMergeTree 的 ZooKeeper 元数据修复ReplicatedVersionedCollapsingMergeTree表在 ZooKeeper 中产生错误表元数据的问题PR #12121对应 issue #12093。该问题会影响副本间元数据一致性属于复制表的正确性关键缺陷。5.3 TTL 依赖列重命名修复重命名 TTL 表达式依赖的列后TTL 失效的问题PR #12304。修复后列重命名会同步更新 TTL 表达式中的列引用。5.4 PREWHERE 错误类型崩溃修复PREWHERE使用错误类型时可能崩溃PR #12060对应 issue #12053 与 #12060。修复后 PREWHERE 表达式类型与列类型不匹配时能安全报错而非崩溃。5.5 StorageKafka DROP TABLE 的 SIGSEGV修复StorageKafkaKafka 表引擎在DROP TABLE时可能触发 SIGSEGV 段错误PR #12075、src/Storages/Kafka/StorageKafka2.h 等文件中其后台消费线程与表销毁流程的竞态是此类崩溃的常见根因修复后 DROP TABLE 可安全回收 Kafka 消费资源。5.6 ALTER DELETE 的 NULL 语义修复ALTER TABLE ... DELETE WHERE ...在条件计算结果为 NULL 时错误删除记录的问题PR #12153对应 issue #9088。修复后 DELETE 条件严格遵循 SQL 三值逻辑NULL 视为不匹配不再误删数据。5.7 系统日志表相关query_log 指标为空修复 SELECT 查询在system.query_log中result_rows、result_bytes为空的问题PR #12089对应 issue #11595。修复后基于 query_log 的审计与用量统计恢复正常。物化视图附加到系统日志避免物化视图含 JOIN/子查询且附加在系统日志表system.query_log、metric_log等或 Buffer 引擎底层表时出现There is no query异常PR #12120。5.8 服务器启动与生命周期pid 文件规范化修复服务器被异常终止未正常 shutdown后若存在与旧 pid 相同的进程服务器可能拒绝启动的问题同时修复启动失败时 pid 文件被错误删除即使另一服务器正在运行的问题PR #12133对应 issue #3501。并行解析表元数据加载数据库时并行解析表元数据修复表数量巨大时服务器启动缓慢的问题PR #12045。DNS 缓存更新挂起修复 DNS 缓存更新期间部分线程随机挂起数秒的问题PR #12296。内存上限约束将max_memory_usage*系列限制上限约束到进程常驻内存resident memory范围内PR #12182避免配置值超过物理可用内存导致 OOM。ReplicatedMergeTreeQueue 竞态修复ReplicatedMergeTreeQueue中非常罕见的竞态条件PR #12315提升复制队列在并发下的稳定性。5.9 外部数据源与字典外部 DBMS 查询别名转换修复存在别名时转发到外部 DBMS如 MySQL、ODBC的查询转换错误PR #12151对应 issue #12032。ODBC 无 schema 场景当 ODBC 连接不支持 schema 时不再将字典源表名拆分为 schema 与表名两部分PR #12165。字典依赖修复ENGINEDictionary表对字典的依赖处理PR #12116对应 issue #10994 与 #10397确保 DROP/修改字典时依赖表的生命周期处理正确。dictGet 与 GROUP BY 单射消除修复GROUP BY单射函数消除优化中对dictGet参数检查的缺陷PR #12179避免误消除导致错误分组。5.10 杂项正确性修复Partial revokes复杂场景下如角色/权限部分撤销叠加的部分撤销逻辑修复PR #12002。浮点异常防护修复潜在浮点异常PR #12005对应 issue #11378。generateRandom 数组大小溢出修复generateRandom中数组大小潜在溢出导致的崩溃PR #12013对应 issue #11371。-StateResample 组合子修复-StateResample聚合组合子的段错误PR #12092。S3 重定向限制修复请求 S3 存储到达重定向限制时的行为PR #12256。启动日志设置名错误修复服务器启动日志中错误的设置名PR #11997及设置名拼写错误PR #12292。ORDER BY 冗余优化修复冗余 ORDER BY 优化中的错误代码PR #12148该缺陷由 PR #10067 引入。六、Build/Testing/PackagingDocker 构建可靠性变更内容在 Dockerfile 中、第一次apt-get update之前安装ca-certificatesPR #12095。背景解读部分基础镜像默认不带 CA 证书若在安装证书前执行apt-get updateHTTPS 源如deb.debian.org走 HTTPS 时会因证书校验失败而中断构建。该修复调整了构建步骤顺序提升了 CI 与本地 Docker 构建的稳定性。相关构建脚本可参考 docker/server 与 ci/docker 目录下的 Dockerfile 与构建脚本。七、总结与升级建议v20.5.3.27-stable 是一次典型的深水区修复版本其价值体现在三个层面正确性修复ALTER DELETE的 NULL 语义、整数除法溢出、SELECT *, xyz.*校验等修复直接关系到数据安全与结果可信度属于必须升级级别的缺陷稳定性修复StorageKafka DROP TABLE 段错误、neighbor极端偏移、greatCircleDistance死循环、DNS 缓存挂起等修复覆盖了崩溃类与性能类问题类型系统收敛围绕 LowCardinality 的 JOIN、高阶函数、Parquet、UNION ALL 公共类型转换等一批修复表明 20.5 时期正在系统性补齐 LowCardinality 与其他模块的交互能力这一工作最终沉淀为后续版本类型系统的统一基础。升级建议若你在 20.5 分支上同时满足以下任一场景应优先评估升级到本版本或更新补丁使用 Kafka 表引擎涉及 DROP TABLE 崩溃、使用 LowCardinality 参与 JOIN/UNION ALL/Parquet 导入导出、依赖system.query_log做用量统计、使用ALTER DELETE且条件可能含 NULL、配置了 S3 后端或自定义存储策略。注以上分析均基于当前仓库存档的变更日志 docs/changelogs/archive/v20.5.3.27-stable.md 及仓库源码实现涉及的行号与文件路径可在对应源码中直接复核。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表