恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

ClickHouse v21.3.18.4-lts 发布说明:修复点深度解读与源码级解析

  • 首页
  • 资讯中心
  • /
  • ClickHouse v21.3.18.4-lts 发布说明:修复点深度解读与源码级解析

相关资讯

Angular Components 的 Aria Tree 组件测试 Harness 全解析:@angular/aria/tree/testing API 指南 2026/9/12 21:35:31
GCP 云日志导出到 Pub/Sub 的 Terraform 配置指南——为 Loki 生态(Promtail)准备云上日志源 2026/9/12 21:30:31
STM32驱动LTC6804-1级联电压采集:SPI时序与PEC校验实战 2026/9/12 21:30:31

最新资讯

RAG技术解析:大模型应用开发与优化实战
贝叶斯优化驱动的车辆模型预测控制参数调优实战
XGBoost实战指南:从数学原理、数据预处理到代码调参
DApp开发进化论:从数字工具到链上自治理组织
充电宝ESD失效原理与整机防护实战指南
猫抓 cat-catch:如何 3 分钟把网页视频和 M3U8 流媒体变成可下载文件

今日推荐

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

ClickHouse v21.3.18.4-lts 发布说明:修复点深度解读与源码级解析

发布时间:2026/9/12 21:35:31
ClickHouse v21.3.18.4-lts 发布说明:修复点深度解读与源码级解析 ClickHouse v21.3.18.4-lts 发布说明修复点深度解读与源码级解析【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文基于 docs/changelogs/archive/v21.3.18.4-lts.md 官方 Changelog完整梳理 ClickHouse v21.3.18.4-lts 相对 v21.3.17.2-lts 的所有改进与 Bug Fix并结合当前仓库源码深入剖析每一项修复背后的实现原理帮助读者理解 LTS 分支维护节奏、掌握 bridge 进程 OOM 防护、AccessControlManager 生命周期、LowCardinality 并发安全等核心机制为版本选型、升级评估和排障定位提供可直接参考的依据。版本背景LTS 维护分支的定位v21.3.18.4-lts 是 ClickHouse 21.3 LTS 分支上的一个补丁版本。LTSLong-Term Support分支面向生产环境只接受高价值修复的安全性与正确性改动不引入新功能以保证线上行为稳定。从本 Changelog 的条目构成可以清晰看到这一特征共包含 2 项 Improvement、9 项用户可见的 Bug Fix、1 项普通 Bug Fix以及若干内部维护性改动NOT FOR CHANGELOG / INSIGNIFICANT。每条修复都标注了上游的 backport 来源如Backported in #30355这体现了 ClickHouse 社区主分支先行修复、LTS 分支后向移植backport的发布流水线修复先合入 master经测试稳定后再由发布经理挑选适合 LTS 的条目统一移植。Improvement 一bridge 进程的 OOM 防护与资源隔离Backported in [#30355]Use separateclickhouse-bridgegroup and user for bridge processes. Set oom_score_adj so the bridges will be first subjects for OOM killer. Set maximum RSS to 1 GiB. Closes [#23861].背景什么是 bridge 进程ClickHouse 的 bridge 是连接外部数据源的辅助进程典型的例子有 ODBC bridge 与 JDBC bridge用于在 src/BridgeHelper 模块对应的场景中代理对 ODBC/JDBC 数据源的访问。bridge 以独立进程形式运行与clickhouse-server主进程分离避免外部数据源驱动例如不可信的 ODBC 驱动异常时拖垮主服务。本次改进的三个要点独立的用户与组为 bridge 进程创建单独的clickhouse-bridge用户和组。进程权限最小化bridge 不再以 server 用户身份运行降低桥接层被攻破后的提权风险面。调整 oom_score_adj为 bridge 进程设置 oom_score_adj使其在系统内存不足触发 OOM Killer 时优先成为被杀对象first subjects for OOM killer。这是保主进程、弃辅助进程的经典容错策略——bridge 挂掉可以由 server 端重连机制恢复而 server 进程被 OOM 杀死则意味着整机查询服务中断。RSS 上限 1 GiB为 bridge 进程设置最大常驻内存Resident Set Size限制为 1 GiB从根上遏制 bridge 内存失控。源码级佐证server 的 OOM 分数机制在 programs/server/Server.cpp 中可以找到 server 进程自身的 OOM 分数设置实现setOOMScore()它通过向 Linux 的/proc/self/oom_score_adj写入数值来调整进程在 OOM Killer 中的优先级void setOOMScore(int value, LoggerRawPtr log) { std::string value_string std::to_string(value); DB::WriteBufferFromFile buf(/proc/self/oom_score_adj); buf.write(value_string.c_str(), value_string.size()); buf.next(); buf.close(); LOG_INFO(log, Set OOM score adjustment to {}, value); }该函数受服务器配置项oom_score控制见 programs/server/Server.cpp。bridge 进程在本版本中获得与之配套的独立 OOM 分数设置——值越大越容易被 OOM Killer 选中从而实现优先牺牲 bridge的预期。相关配置可以参考 programs/server/config.xml 与 programs/server/config.yaml.example 中关于 OOM 与进程资源管理的段落。部署建议升级到 v21.3.18.4-lts 后使用 ODBC/JDBC bridge 的环境应确认clickhouse-bridge用户已被正确创建且系统审计日志中 bridge 进程归属于独立 group避免权限冲突。Improvement 二时区数据更新至 2021cBackported in [#29945]Update zoneinfo files to 2021c.ClickHouse 内置了 IANA 时区数据库zoneinfo用于toTimeZone、convertTimeZone以及DateTime相关函数在夏令时DST切换、历史时区修正等场景下的正确换算。本版本将内置时区数据从旧版本升级至2021c修复了期间各司法管辖区如部分国家取消/恢复夏令时、时区边界调整引入的换算偏差。升级影响时区数据变更可能改变某些历史时间点或夏令时过渡点的时间显示结果。对于依赖历史时间换算的分析业务升级后建议对关键查询结果做一次抽查回归。Bug Fix 解析一AccessControlManager 关停竞态Backported in [#30041]Fix shutdown ofAccessControlManager. Now there cant be reloading of the configuration after AccessControlManager has been destroyed.问题本质AccessControlManager是 ClickHouse 访问控制用户、角色、行级权限、SQL 用户目录等的中央管理器。此前在服务器关停流程中配置重载任务可能与AccessControlManager的析构destroyed发生竞态配置重载回调访问到已被销毁的管理器导致偶发性崩溃——本条目正是修复了 test_user_directories/test.py::test_relative_path 中暴露出的 flaky 测试。修复后的行为现在关停阶段严格保证AccessControlManager销毁之后任何配置重载都不再可能发生从时序上根除了读已销毁对象的悬垂访问。这一修复保证了优雅关停graceful shutdown的确定性对使用SYSTEM RELOAD系列命令频繁调整访问控制配置、且需要平滑重启的线上集群尤为重要。相关源码位置访问控制相关实现位于 src/Access 目录用户目录、权限、角色与行级安全的核心逻辑其中 AccessControlManager 负责协调各 AccessStorage 的后台加载与重载。运维排障时若日志中出现与 access control reload 相关的崩溃栈可优先检查是否命中此版本之前的已知竞态。Bug Fix 解析二主键类型常量转换错误Backported in [#29260]Fix invalid constant type conversion when nullable or lowcardinality primary key is used.问题本质当表主键为Nullable或LowCardinality类型时优化器在处理常量constant主键条件下可能发生错误的类型转换导致查询优化后使用错误的常量类型进行索引裁剪进而返回错误结果或索引失效。影响场景主键列定义为Nullable(...)的表主键列定义为LowCardinality(...)的表使用等值/范围条件命中这类主键的查询。修复思路修复统一了常量在 nullable/lowcardinality 主键下的类型归一化路径确保传递给索引与数据过滤阶段的常量与列的真实数据类型一致。建议使用上述两类主键的读者在升级后对典型点查、范围查做结果比对验证。Bug Fix 解析三GLOBAL IN 子查询线程数回退Backported in [#29026]Fix the number of threads used inGLOBAL INsubquery (it was executed in single threads since #19414 bugfix).问题本质GLOBAL IN用于在分布式场景下将子查询结果广播到所有节点执行。此前由于 [#19414] 的误修GLOBAL IN子查询被退化为单线程执行严重拖慢了大结果集 IN 子查询的性能。修复效果本版本恢复子查询的多线程并行执行能力充分利用多核 CPU 加速GLOBAL IN的物化与分发。对于形如WHERE id GLOBAL IN (SELECT id FROM big_table WHERE ...)的查询升级后应观察到显著的延迟下降。验证方法使用EXPLAIN PIPELINE查看该查询的执行流水线确认 IN 子查询部分出现多线程多个并行线程节点即可验证修复生效。Bug Fix 解析四Avro 输入格式写入 LowCardinality(Nullable) 崩溃Backported in [#29194]Fix segfault while inserting into column with type LowCardinality(Nullable) in Avro input format.问题本质通过Avro 输入格式向LowCardinality(Nullable)类型列写入数据时此前存在未处理的空值null路径触发段错误segfault直接导致插入会话崩溃。修复效果修复补齐了 Avro 解析中 nullable 值向LowCardinality(Nullable)字典编码转换的空指针保护现在可以安全地向该类型列插入含 NULL 的数据。相关实现replaceRegexpAll一类字符串函数之外本修复涉及的列类型实现位于 src/ColumnsLowCardinalityColumn的字典编码与索引与 src/DataTypesDataTypeLowCardinality。从源码结构看Avro 格式的输入路径src/Formats会先将原始值转换为中间列再套用目标列的字典编码逻辑本修复即在两者衔接处消除空指针风险。Bug Fix 解析五ReplicatedMergeTree 副本结构一致性校验放宽Backported in [#29360]Fix possibleTable columns structure in ZooKeeper is different from local table structureexception while recreating or creating new replicas ofReplicatedMergeTree, when one of table columns have default expressions with case-insensitive functions.问题本质ReplicatedMergeTree在建副本/重建副本时会对比本地表结构与 ZooKeeper 中记录的元数据。当列默认值表达式包含大小写不敏感的函数例如函数名大小写书写不同但语义相同时结构比对可能出现假阳性不一致抛出Table columns structure in ZooKeeper is different from local table structure异常导致副本创建失败。修复效果修复在结构比对中对函数名进行规范化大小写无关比较使默认表达式书写风格不同的合法副本也能通过一致性校验。运维提示遇到该异常时先确认是否因版本间默认值序列化格式差异导致升级本版本后同一 DDL 在多个副本上的默认值表达式若仅函数名大小写不同将不再触发误报。Bug Fix 解析六连接超时修复Backported in [#29300]Fix connection timeouts (send_timeout/receive_timeout).问题本质客户端与服务器之间的send_timeout/receive_timeout发送/接收超时在此前的实现中存在失效或未按配置生效的问题表现为慢网络下的连接悬挂或过早超时。修复效果修复后超时参数在连接生命周期中正确生效。相关超时配置在 programs/server/config.xml 中可通过send_timeout、receive_timeout调整默认以秒为单位。对跨机房、高延迟网络环境部署的用户建议结合实际 RTT 校验这两个参数的取值。Bug Fix 解析七谓词下推丢失过滤条件Backported in [#30042]Condition in filter predicate could be lost after push-down optimisation.问题本质优化器执行谓词下推predicate push-down时存在丢失过滤条件的路径部分条件下WHERE中的过滤谓词在 push-down 之后被错误地丢弃导致查询返回本应被过滤掉的多余行结果集不准确。修复效果修复确保下推过程中谓词的逻辑等价性过滤条件不会被优化器吞掉。涉及查询优化器的相关实现位于 src/Interpreters 与 src/Processors表达式与过滤节点的下推改写逻辑。验证方法对升级前的错误查询回归SELECT ... WHERE filter确认结果行数与未下推时一致。Bug Fix 解析八GROUP BY 中 LowCardinality 并发访问崩溃Backported in [#29848]Fix concurrent access toLowCardinalityduringGROUP BY(leads to SIGSEGV).问题本质当GROUP BY聚合的键包含LowCardinality列且并行聚合多线程场景下多个线程同时访问同一LowCardinality列的字典数据时存在无锁共享读写触发SIGSEGV崩溃。修复效果修复为聚合路径中LowCardinality字典的访问增加了正确的同步/拷贝语义多线程GROUP BY不再崩溃。由于该问题会导致进程级崩溃升级价值极高——凡在聚合查询中大量使用LowCardinality键的读者应优先考虑升级到本版本。Bug Fix 解析九sample by tuple() 崩溃修复Backported in [#30066]Fix crash of sample bytuple(), closes [#30004].问题本质对使用SAMPLE BY tuple()空元组采样或相关 tuple 采样场景的查询存在崩溃路径。修复后该边界用法不再导致服务器崩溃保证采样查询的健壮性。Bug Fix 解析十多 JOIN 中数字开头标识符支持Backported in [#30332]Allow identifiers starting with numbers in multiple joins.问题本质多表JOIN场景中以数字开头的列名/别名例如1st_col需反引号包裹此前无法被正确解析。修复后多 JOIN 查询中数字开头的标识符可正常参与连接。使用建议列名以数字开头时仍应使用反引号包裹1st_col以规避解析歧义。Bug Fix 解析十一replaceRegexpAll 函数修复Backported in [#30379]fix replaceRegexpAll bug.函数定位replaceRegexpAll是字符串正则替换函数语义为替换模式的所有匹配项与replaceRegexpOne仅替换首个匹配相对。其实现位于 src/Functions/replaceRegexpAll.cpp内部通过FunctionStringReplace模板与ReplaceRegexpImpl完成struct NameReplaceRegexpAll { static constexpr auto name replaceRegexpAll; }; using FunctionReplaceRegexpAll FunctionStringReplaceReplaceRegexpImplNameReplaceRegexpAll, ReplaceRegexpTraits::All, NameReplaceRegexpAll;函数的官方文档注释同一文件内特别强调了一条边界语义LikereplaceRegexpOnebut replaces all occurrences of the pattern. As an exception, if a regular expression worked on an empty substring, the replacement is not made more than once.即当正则匹配到空子串时同一位置最多只替换一次——这是避免空匹配导致无限替换/死循环的关键约定本次修复即围绕这类边界匹配行为展开。修复源码位于 src/Functions/ReplaceRegexpImpl.h 的实现路径中。内部维护性改动NOT FOR CHANGELOG / INSIGNIFICANT这些条目不面向最终用户产生行为变更属于工程维护范畴Do not add const group by key for query with only having[#28975]仅含HAVING子句的查询不再添加常量GROUP BY键消除冗余聚合分组。Merging #27963[#29063]合并先前提交保持代码基线一致。May be fix s3 tests[#29762]S3 相关测试稳定性调整。Fix ca-bundle.crt in kerberized_hadoop/Dockerfile[#30358]CI 集成测试镜像中 CA 证书包修复不影响运行时行为。升级评估清单关注点对应修复建议动作ODBC/JDBC bridge 稳定性bridge OOM 防护与 1 GiB RSS 上限确认clickhouse-bridge用户/组创建正确访问控制重载 平滑重启AccessControlManager 关停竞态重启前做访问控制配置回归Nullable/LowCardinality 主键查询常量类型转换修复点查/范围查结果比对大结果集GLOBAL IN多线程恢复EXPLAIN PIPELINE验证并行Avro 导入LowCardinality(Nullable)段错误修复Avro 批量导入回归ReplicatedMergeTree 建副本结构校验放宽多副本 DDL 一致性验证跨机房慢网络连接超时修复校验send_timeout/receive_timeout聚合查询崩溃GROUP BY LowCardinality 并发修复多线程聚合回归压测正则替换replaceRegexpAll 边界修复空匹配场景用例回归本版本以正确性与稳定性为核心主题九个用户可见修复覆盖了索引、聚合、分布式查询、导入格式、副本元数据、连接与字符串函数等多个关键路径。对于生产环境的 21.3 LTS 用户特别是重度使用LowCardinality、GLOBAL IN或 bridge 外部数据源接入的场景建议尽快纳入升级计划。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号