
ClickHouse v25.1.5.31-stable 版本解析Keeper 提交摘要优化、workload 强制调度与 7 项关键缺陷修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 docs/changelogs/archive/v25.1.5.31-stable.md 官方变更日志逐条解析 ClickHouse v25.1.5.31-stable 相对 v25.1.4.53-stable 的全部变更两项功能改进Keeper 提交路径禁用 digest 计算、新增throw_on_unknown_workload服务器设置与七项用户可见缺陷修复并结合当前仓库中的源码实现KeeperContext.h、ServerSettings.cpp、IBridgeHelper.cpp与回归测试说明每项变更的实际影响、默认值与配置方式。读完本文你可以判断该补丁版本对 Keeper 高负载部署、workload 资源调度治理与 ODBC/JDBC 桥接安全性的具体意义。版本定位一个纯补丁性的稳定分支发布该版本基于 commit48f17e8a805对照基线为 v25.1.4.53-stablecommitc3f28b8bf5d。全部条目均为 backport回合即这些修复先在主线完成再回合进 25.1 稳定分支后随补丁版本发布因此该版本不包含新特性只包含性能改进与缺陷修复。对于运行 25.1 生产环境的团队这类版本是典型的低风险、高收益升级对象。改进一Keeper 提交时跳过 digest 计算变更内容Keeper 在把事务提交到内存存储in-memory storage时不再计算 digest摘要可显著提升提交路径性能digest 在请求预处理阶段仍然照常计算。该行为可通过keeper_server.digest_enabled_on_commit配置项重新开启。源码印证在 src/Coordination/KeeperContext.h 中可以看到两个相关状态字段的定义bool digest_enabled{true}; // 预处理阶段 digest默认开启 bool digest_enabled_on_commit{false}; // 提交阶段 digest默认关闭本版本变更点在 src/Coordination/KeeperContext.cpp 中该配置从服务器 XML 配置解析默认值为falsedigest_enabled_on_commit config.getBool(keeper_server.digest_enabled_on_commit, false);配置示例若要恢复旧行为keeper_server digest_enabled_on_committrue/digest_enabled_on_commit /keeper_server原理说明Keeper 采用类 Raft 的日志复制协议NuRaft。digest 用于在日志条目处理时快速比对数据是否一致。在提交到内存存储这一热点路径上跳过摘要计算省去的是每次 commit 的重复哈希开销而保留预处理阶段的 digest 计算保证了请求进入队列前的一致性校验能力不降级。对于以 Keeper 作为协调后端ZooKeeper 协议兼容的 ClickHouse 集群高 QPS 的事务型负载如分布式 DDL、fence 写入将从中受益。改进二新增服务器设置throw_on_unknown_workload变更内容新增服务器设置throw_on_unknown_workload控制查询中workload设置指向未知 workload 时的行为——默认false允许无限制访问设为true则抛出RESOURCE_ACCESS_DENIED异常。该设置的价值在于当 workload 层级hierarchy建立完成后可以强制所有查询都必须走 workload 调度杜绝绕过资源配额的漏网查询。源码印证该设置在 src/Core/ServerSettings.cpp 中声明默认值false且属于ChangeableWithoutRestart::Yes类即可通过SYSTEM RELOAD CONFIG热更新无需重启见 src/Core/ServerSettings.cpp 的注册处。设置自带的官方说明写道Iftrue, RESOURCE_ACCESS_DENIED exception is thrown from a query that is trying to access unknown workload. Useful to enforce resource scheduling for all queries after WORKLOAD hierarchy is established and contains WORKLOAD default. Iffalse(default), unlimited access w/o resource scheduling is provided to a query with workload setting pointing to unknown WORKLOAD.推荐的落地流程先创建 WORKLOAD 层级并添加defaultworkload期间保持throw_on_unknown_workload为默认的false让客户端逐步迁移全部客户端接入后开启强制模式此后未定义 workload 的查询将被拒绝throw_on_unknown_workloadtrue/throw_on_unknown_workload该机制与cpu_slot_preemption见 src/Core/ServerSettings.cpp 相邻声明等 workload 调度设置共同构成 ClickHouse 的资源治理体系前者管CPU 槽位如何分配与抢占后者管未接入调度的查询如何处置。Bug Fix七项用户可见缺陷修复逐项解析1. 部分存储引擎对不支持类型的检查为若干存储引擎storage补充不支持的数据类型校验创建表时即可提前报错避免数据写入后再暴露兼容性问题。属于防御性检查增强对已有表无影响。2. JOIN ON 子句中 null-safe 比较与类型别名的问题修复了在JOIN ... ON子句中使用 null-safe 比较且表达式带类型别名type alias时的类型推导问题。此前此类写法会产生错误的类型行为本版本后a.key b.key配合别名/类型别名可正常求值。3. PSQL 复制中的崩溃修复修复 PostgreSQL 逻辑复制PSQL replication中未捕获异常导致的进程崩溃。此前若复制链路出现特定错误异常会越过异常边界直接打崩 server本版本将其收敛为可恢复错误。4. SASL/Kerberosticket 过期时重试 RPC 调用SASL 认证层此前存在缺陷Kerberos ticketkrb5 ticker过期时任意一次 RPC 调用都可能直接失败且不会重试。本版本修复了该问题使调用在 ticket 过期场景下能够自动重复发起对使用 Kerberos 认证的长连接部署典型如 HDFS 访问路径更健壮。5. 修改 projection PK 列后自动重建 projection这是本版本中最具生产价值的一项修复。此前对某列执行ALTER TABLE ... MODIFY COLUMN若该列被某 projection 的主键PK引用projection 不会随之重建后续SELECT可能触发CANNOT_READ_ALL_DATA错误。本版本开始当 alter modify 作用于 projection 的 PK 列时系统会自动重建该 projection消除这一类改列之后查询报错的隐蔽故障。6. 在设置变更历史中记录 v24.12 默认启用并行 hash join这是一条元数据补记v24.12 起默认启用并行 hash join 算法这一事实被正式记录进 settings change history设置变更历史。其实际含义是如果你通过compatibility等机制把服务器兼容级别配置到低于 v24.12的旧版本ClickHouse 会继续使用非并行 hashjoin 算法。这保证了旧兼容级别下行为与当年版本一致也解释了为什么老兼容级别下 join 变慢/变快的现象是预期行为而非 bug。对应的无状态回归测试为 tests/queries/0_stateless/03274_join_algorithm_default.sql本版本同时修复了该测试本身的问题见下节。7. 安全修复限制clickhouse-library-bridge可加载的库路径这是本版本唯一的安全漏洞修复。clickhouse-library-bridge是 ClickHouse 为支持 UDF 动态加载等能力引入的辅助进程此前它允许从文件系统任意位置打开动态库因此设计上要求只能运行在隔离环境中。若它与clickhouse-server部署在同一主机上恶意库路径即构成漏洞。本版本将其可加载库的路径限定在配置文件中提供的目录之内。源码印证从当前仓库的 src/BridgeHelper/IBridgeHelper.cpp 可以看到 bridge 可执行文件的定位逻辑——bridge 路径基于配置项application.dir默认/usr/bin拼接服务文件名得到正是路径受配置约束这一安全模型在桥接启动侧的体现const auto config getConfig(); /// Path to executable folder fs::path path(config.getString(application.dir, /usr/bin)); VectorWithMemoryTrackingstd::string cmd_args; path / serviceFileName();该漏洞由 ClickHouse Bug Bounty Program 的 Arseniy Dugin 发现。对于自行编译或部署 bridge 的用户升级后应确认库文件均位于配置允许的路径内。其余不对外公告的修复NOT FOR CHANGELOG变更日志还列出了 6 项未进入正式公告的内部修复对排查特定问题仍有参考价值ObjectStorageQueue 元数据关闭崩溃修复ObjectStorageQueueMetadata在 shutdown 时的崩溃Hopefully fix 表述说明该问题复现概率低、修复带有一定不确定性ASTTTLElement函数名规范化TTL 表达式中的函数名解析更规范DisksApp 初始化顺序修复消除Placement info has not been loaded与The IOThreadPool is not initialized两类启动期报错~Workload()析构不再抛异常析构函数中抛异常属于未定义行为隐患此项属于工程健壮性修复与上文throw_on_unknown_workload同属 workload 子系统的配套完善解压测试日志增强为 decompressing 相关测试补充更多日志测试修复03274_join_algorithm_default测试用例本身的修复对应上文第 6 条的兼容级别行为。升级建议运行 25.1.x 生产环境的团队本版本为纯 backport 补丁风险低。其中 projection PK 列修改后的自动重建、Kerberos ticket 过期重试、PSQL 复制崩溃三项可直接改善可用性library-bridge路径限制则是应当尽快获得的安全修复建议升级Keeper 集群升级后 commit 路径默认不再计算 digest属开箱即得的性能改进若你的部署依赖 commit 阶段摘要校验请显式配置keeper_server.digest_enabled_on_commit true使用 workload 调度的团队可借助throw_on_unknown_workload支持热更新完成全量查询纳入调度的最后一步治理使用 Kerberos/ODBC-JDBC 桥接的部署升级并复核 bridge 相关配置路径确保库文件位于允许的目录内。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考