
ClickHouse v24.3.12.75-lts 补丁版本全解析cgroups v2 内存统计改进与 18 项关键 Bug 修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHousev24.3.12.75-lts 是 ClickHouse 24.3 LTS 分支上继 v24.3.11.7-lts 之后的又一个稳定性补丁版本聚焦于运行时稳定性、复制机制、安全与权限、查询正确性四个方向既包含 cgroups v2 下更精确的内存占用统计改进也修复了包括tumbleStart/hopStart系列函数可被恶意查询触发服务器崩溃的空指针解引用、RoleCache过期失效、system.query_log中 bcrypt 密码明文泄露等多类高风险问题。阅读本文后你将系统掌握该补丁版本的全部变更内容、各修复对应的底层实现机制附源码路径并能据此评估升级必要性、规避相关风险场景。版本概览LTS 分支的第 12 个补丁版本项目内容版本号v24.3.12.75-lts提交号7cb5dff8019上一版本v24.3.11.7-lts28795d0a47e变更分类1 项 Improvement、18 项 Bug Fix均为官方稳定版用户可见问题、1 项 NO CL CATEGORY、7 项 NOT FOR CHANGELOG / INSIGNIFICANT分支定位24.3 LTS长期支持补丁线所有修复均以 Backport 方式合入该版本是典型的纯修复型补丁版本没有任何新功能全部变更来自对上游master分支已修复问题的 backport。每项变更都以 Backported in #xxxxx 标注了对应的 backport issue并保留了原始 PR 编号与作者信息例如 cgroups 改进来自 [PR #65470]Nikita Taranov即nickitatRoleCache过期修复来自 [PR #67748]Vitaly Baranov。对于生产环境部署 24.3 LTS 的用户本版本的 18 项修复中包含了崩溃类Crash、安全类Security与数据一致性问题建议结合下文逐项评估升级。Improvementcgroups v2 内存统计排除 page cache 占用本版本唯一一项功能改进来自 PR #65470改进 cgroups v2 的内存统计排除 page cache 所占用的内存量。为什么需要排除 page cachecgroups v2 的memory.current文件记录的是该 cgroup 内所有进程的当前内存用量其中包含可回收的 page cache。当 ClickHouse 以 cgroup v2 隔离容器或受限环境运行时如果直接用memory.current作为内存占用基准page cache 会被计入已使用内存导致内存可用量被低估触发过早的内存限制、OOM 保护误判动态内存上限调整dynamic hard-limit基于错误的高占用值做出保守决策。源码层面的实现机制ClickHouse 在 base/base/cgroupsv2.cpp 中提供了 cgroups v2 的底层探测工具并在 src/Common/MemoryWorker.cpp 中消费这些接口做逐层级per-level内存读取cgroupsV2Enabled()base/base/cgroupsv2.cpp通过检查/sys/fs/cgroup/cgroup.controllers是否存在判定系统是否启用了 cgroups v2cgroupV2PathOfProcess()base/base/cgroupsv2.cpp解析/proc/self/cgroup寻找前缀为0::/的 v2 行该格式由 Linux 内核文档定义拼接出进程所属 cgroup 的路径getCgroupsV2PathContainingFile()base/base/cgroupsv2.cpp从最内层 cgroup 向上逐级查找包含指定文件的目录利用 cgroup 设置沿层级继承的特性。在 src/Common/MemoryWorker.cpp 中v2 分支会沿 cgroup 层级逐级向上配对读取memory.max与memory.current同一层级配对从而把兄弟 cgroup 的消耗也计入祖先预算并额外读取memory.statfs::path max_path current / memory.max; fs::path current_path current / memory.current; fs::path stat_path current / memory.stat; if (fs::exists(max_path) fs::exists(current_path)) { ... }memory.stat的作用正是本改进的核心通过它折算掉可回收的 page cache / slab 占用使memory.current反映真实的不可回收内存使用。若memory.stat缺失代码注释明确说明会回退到将原始memory.current视为用量stricter, never over-budget即更严格、永不超预算保证在无法精确计算时也不会低估内存压力。此外src/Common/AsynchronousMetrics.cpp 同样借助getCgroupsV2PathContainingFile()探测 cgroup 相关指标文件用于异步指标采集。适用前提该改进仅在 Linux 且启用 cgroups v2/sys/fs/cgroup/cgroup.controllers存在时生效cgroups v1 环境继续使用memory.limit_in_bytes见 src/Common/MemoryWorker.cpp。Bug Fix 全景按模块归类解读 18 项修复查询执行与函数正确性本组修复直接关系到查询结果正确性与服务器稳定性共 7 项hopStart/hopEnd/tumbleStart/tumbleEnd空指针解引用崩溃PR #68098这是本版本风险等级最高的修复之一。这四个时间窗口函数定义在 src/Functions/FunctionsTimeWindow.cpp。此前一个经过特殊构造specially crafted的查询可以触发空指针解引用直接使服务器崩溃服务不可用。修复后构造的恶意/畸形查询不再导致进程崩溃。WITH FILL误用导致的崩溃PR #70338WITH FILL是ORDER BY子句中用于填充缺失值的语法如ORDER BY x WITH FILL FROM 1 TO 10 STEP 1此前存在错误的WITH FILL用法如无FROM/TO/STEP等参数组合不当可触发服务器崩溃现已修复。sqidDecode触发LOGICAL_ERRORPR #69451sqidDecode与sqidEncode是 24.1 版本引入的 ID 编码函数见 src/Functions/sqid.cppsqidDecode接收一个字符串参数并返回Array(UInt64)。此前特定输入会抛出LOGICAL_ERROR异常修复后行为正确。相关函数签名见 src/Functions/sqid.cppsqidDecode(sqid) - Array(UInt64)。GROUPING SETS 聚合数据合并错误PR #68744多分组集GROUP BY GROUPING SETS场景下聚合数据的合并逻辑此前存在缺陷可能产生错误的聚合结果。ALTER TABLE MODIFY COLUMN允许Nullable(Nothing)类型PR #70123此前可以通过ALTER TABLE ... MODIFY COLUMN将列改为Nullable(Nothing)类型从而污染表结构现在在ALTER TABLE MODIFY COLUMN/ 查询路径中增加了Nullable(Nothing)类型检查从源头阻止此类非法数据类型的产生。move to prewhere时条件顺序被打乱PR #69560优化器将过滤条件下推到PREWHERE时此前可能改变条件的原始顺序当条件顺序影响查询结果例如存在依赖求值顺序的表达式时会导致查询失败。修复后保持条件的原始顺序。ranges 字面量替换触发的错误LOGICAL_ERRORPR #70122在范围range相关查询中替换字面量时此前会在某些输入下抛出错误的LOGICAL_ERROR现已修复。复制、存储与合并树ReplicatedMergeTree意外重启后因 covered-by-broken part 处理异常导致复制无法启动PR #68584ReplicatedMergeTree在异常重启后若存在被 broken part 覆盖covered-by-broken的 part旧的异常处理逻辑会导致副本复制无法正常启动。修复后恢复流程可正确跳过/处理此类 part。zero-copy 复制下restore replica后死循环PR #69293zero-copy 复制zero_copy_replication场景中执行restore replica通过SYSTEM RESTORE REPLICA后可能出现无限循环inf loop现已修复。无 ZooKeeper 环境下清理过期的 moving partsPR #69075修复了在没有 ZooKeepersystem.replicated_merge_tree相关非 ZK 模式时过期 moving parts 无法被清理的问题。ColumnsDescription::toString元数据不一致PR #68733ColumnsDescription::toString现在使用同一个IAST::FormatState对象来格式化每一列从而保证写入磁盘与 ZooKeeper 的列元数据格式统一。此前格式化状态不一致会导致不同副本上持久化的元数据文本存在细微差异影响副本间的一致性判断。安全、权限与认证RoleCache过期失效PR #67748RoleCache用于缓存角色与其授予关系的展开结果。其实现位于 src/Access/RoleCache.h核心是一个Poco::AccessExpireCacheUUID, RolePtrTTL 默认为 10 分钟见 src/Access/RoleCache.cpp由expiration_time_seconds * 1000ll换算毫秒。从 src/Access/RoleCache.cpp 可以看到其设计约束roleChanged()仅在缓存条目尚未过期时才更新其中缓存的角色过期条目会留给后续重算清理。本修复解决了该缓存过期语义上的缺陷避免角色权限变更后访问控制沿用陈旧数据。bcrypt 认证用户的密码泄露到system.query_logPR #70148使用 bcrypt 密码认证方式的用户其密码此前可能被明文显示在system.query_log中。这是必须尽快升级的安全类修复——即使查询日志不对外公开也应避免任何凭据以明文落入日志。SQL 安全SQL SECURITY与参数化视图协同工作PR #69984另含 PR #69985此前 SQL 安全DEFINER/INVOKER安全模型见 src/Interpreters 相关实现与参数化视图CREATE VIEW ... AS SELECT ... WHERE x {param:Type}同时使用时行为不正确现已修复。连接、协议与外部数据源所有连接尝试失败时的未定义行为PR #69390写入insertion场景中若所有连接尝试均失败获取连接的过程此前存在未定义行为undefined behavior通常指对失败结果的非法解引用现已修复。Keeper 在ZNOAUTH错误后的 multi 请求预处理PR #69627KeeperClickHouse 内置的 ZooKeeper 替代品在处理 multi 请求时若发生ZNOAUTH无认证权限错误此前的预处理逻辑存在缺陷可能导致后续请求处理异常。从变更日志的姊妹条目PR #68127可见同批修复还改进了 ZK multi 请求失败时向日志输出具体失败操作的错误信息便于排查。Parquet 文件类型不可转换时的异常PR #69745getHyperrectangleForRowGroup此前在 Parquet 文件中的数据类型无法转换为目标列类型时会直接抛出异常。典型场景Parquet 文件列为Decimal64而 ClickHouse 目标列为DateTime。修复后该函数不再抛异常按用户意图妥善处理类型不匹配。MaterializedPostgreSQL数据库名含 - 时建表失败修复内容PR #62730当 PostgreSQL 数据库名包含连字符-时MaterializedPostgreSQL表引擎此前无法正确 attach 表。底层原因从 src/Storages/PostgreSQL/PostgreSQLReplicationHandler.cpp 的normalizeReplicationSlot()可以看出端倪复制槽名称必须符合 PostgreSQL 的标识符规范checkReplicationSlot()要求仅含小写字母、数字、下划线见同文件 第 192-208 行因此生成复制槽名时会把-规范化为_String normalizeReplicationSlot(String name) { name Poco::toLower(name); for (auto c : name) if (c -) c _; return name; }当 PostgreSQL 库名或由库名派生的 publication / replication slot 标识含有-时若规范化与建表/attach 路径上的名称处理不一致就会导致 attach 失败。修复后含-的库名可正常完成复制。其余变更NO CL CATEGORY 与内部修复NO CL CATEGORYPR #67029Alexander Tokmakov一条未分类的 backport 变更与发布流程/基础设施相关无用户可见行为变化。NOT FOR CHANGELOG / INSIGNIFICANT类共 7 项包括Azure 存储错误处理的改进PR #62306修复test_role与test_keeper_s3_snapshot集成测试PR #69013parallel replicas 下 Not-readySetPR #69264——并行副本读取时子查询集合未就绪的问题CI 基础设施相关新增kill_ci_runner函数PR #69557、debug action 上下文扩展PR #69599、禁用不稳定测试PR #70269、修复 24.3 分支 distributed inter-server secret 测试PR #70325。升级建议与验证要点安全优先级最高若集群中有 bcrypt 认证用户且system.query_log会被采集分析强烈建议尽快升级到 v24.3.12.75-lts 或包含该修复PR #70148的后续版本。崩溃类修复hopStart/hopEnd/tumbleStart/tumbleEndPR #68098与WITH FILLPR #70338均为可被触发崩溃的修复对外开放查询服务的实例尤其应当升级。升级路径24.3 LTS 分支的补丁版本之间可直接滚动升级升级后建议执行SELECT version()确认为24.3.12.75并观察system.query_log、复制队列system.replication_queue与 Keeper 日志中的异常告警。回归验证建议针对本版本修复点做定向回归——执行tumbleStart/hopStart窗口函数查询、WITH FILL查询、sqidDecode边界输入、GROUP BY GROUPING SETS聚合、带-库名的 MaterializedPostgreSQL 复制、bcrypt 认证登录后检查查询日志确认各项行为符合预期。版本适用前提本文所述行为以当前仓库 24.3 分支实际内容为准不同小版本间个别函数签名如sqidDecode的参数类型校验可能微调生产升级前请以目标版本的官方文档与变更日志为准。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考