尧图精选

ClickHouse v21.9.5.16-stable 补丁版解析:关键修复、行为变更与升级评估

🕒 发布时间:2026/9/13 17:43:57 📁 来源:尧图网络
ClickHouse v21.9.5.16-stable 补丁版解析关键修复、行为变更与升级评估【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读v21.9.5.16-stable 是 ClickHouse 21.9 系列的第三个补丁版本累计回移backport了大量修复覆盖分布式写入凭据安全、物化列分片键、mutations_sync2同步等待、MaterializedMySQL 事务一致性、内存/并发崩溃SIGSEGV等多个直接影响线上稳定性的问题。本文以 docs/changelogs/archive/v21.9.5.16-stable.md 为骨架结合当前仓库源码src/Core/Settings.cpp、src/Storages/StorageReplicatedMergeTree.cpp、src/Storages/StorageDistributed.cpp 等逐条拆解变更动机与影响面帮助升级者评估风险、制定验证清单。版本定位v21.9.5.16-stable 与 v21.9.4.35-stable该文档位于 docs/changelogs/archive/ 归档目录变更基准为 v21.9.4.35-stable。v21.9.5.16 属于 21.9 分支的稳定补丁线.5表示补丁轮次.16为构建序号只接收经Backported in标注、由维护者挑选并经过验证的修复不引入新特性因此这类版本非常适合作为生产环境的安全升级目标。从结构看文档按Improvement改进、Bug Fix缺陷修复、Bug Fix (user-visible misbehaviour in official stable release)官方稳定版中用户可见的错误行为修复、NO CL CATEGORY未分类、NOT FOR CHANGELOG / INSIGNIFICANT无需记入变更日志/不重要五个分类组织这本身也是 ClickHouse changelog 的标准分层最值得关注的是第三类它代表官方稳定发布中确凿存在、会被用户直接感知的错误。Improvement两处低风险改进副本身份索引查询的分区前缀 p第一处改进为为获取副本身份索引replica identity index的查询添加了分区表前缀p对应 PR #29828。该变更的出发点在 issue #29897目的是让相关查询与 ClickHouse 内部对system/ZooKeeper 路径的既有约定保持一致避免在按前缀匹配分区元数据时出现歧义。它属于内部一致性的修补不改变 SQL 语义对用户无感知。zoneinfo 时区库升级到 2021c第二处改进将内置的 zoneinfo 时区文件升级到 2021c对应 PR #29925。ClickHouse 将 IANA 时区数据库编译进二进制作为toDateTime/fromUnixTimestamp等时区相关函数以及timezone会话设置的底层数据源2021c 版本包含当时 IANA 发布的若干时区规则修正例如部分地区夏令时规则调整。升级后时区换算结果会与系统级tzdata保持一致。若你的业务依赖历史时区边界如特定城市夏令时切换点建议在升级后用SELECT toDateTime(2021-10-31 00:00:00, Europe/…)之类查询做一次换算核对。Bug Fix四类稳定性修复物化列用作分布式表分片键PR #28637对应 issue #29775修复当分布式表以物化列materialized column作为分片键时即使insert_allow_materialized_columns0也允许写入。此前该限制会阻止用户在写入时指定由物化列导出的分片值导致此类合法表结构无法使用。从源码看insert_allow_materialized_columns定义于 src/Core/Settings.cppDECLARE(Bool, insert_allow_materialized_columns, false, R( If setting is enabled, Allow materialized columns in INSERT. ), 0)默认false即 INSERT 默认不允许显式写入物化列。分片键判断逻辑位于 src/Storages/StorageDistributed.cpp 与 src/Storages/Distributed/DistributedSink.cpp配合 src/Interpreters/InterpreterCreateQuery.cpp 的表定义校验。修复后分片键引用物化列被视为内部合法用途不再需要用户放开该开关而普通 INSERT 仍维持默认限制。clickhouse-keeper-converterZooKeeper 日志反序列化错误PR #29071对应 issue #29126修复clickhouse-keeper-converter可能导致 ZooKeeper 日志反序列化不正确的问题。该工具用于把 ZooKeeper 快照/日志转换为 ClickHouse Keeper 格式源码位于 programs/keeper-converter/若反序列化错误迁移到 Keeper 后的数据可能出现缺失或错乱。计划从 ZooKeeper 迁移到 ClickHouse Keeper 的集群建议在升级后对转换结果做数据完整性抽查。AccessControlManager 关闭时序修复PR #29951对应 issue #29972修复AccessControlManager的关闭流程在其被销毁后不再允许配置重载。此前存在竞态可能导致关闭期间重载访问控制配置触发集成测试test_user_directories/test.py::test_relative_path中的偶发失败。该修复消除了关闭窗口内的竞态属于典型的生命周期lifetime类问题对访问控制RBAC、users.xml与 SQL 管理的用户/角色的平滑重载与关闭有正面意义。gRPC 调用结束时的 query ID / session ID 释放PR #29954对应 issue #30052修复 gRPC 处理结束时 query ID 与 session ID 未及时释放的问题相关实现位于 src/Server/GRPCServer.cpp。该问题会导致资源未随查询结束而释放是test_grpc_protocol/test.py::test_session偶发失败的根因。使用grpc端口默认 9100的客户端例如通过clickhouse-grpc-client、utils/grpc-client/ 接入的场景在升级后应重点回归会话复用类用例。Bug Fix (user-visible misbehaviour)官方稳定版用户可见缺陷修复清单该分类是补丁版升级的核心价值所在逐条梳理如下括号内为对应的原 PR 与 issue#修复内容原始 PR / Issue建议回归点1Nullable / LowCardinality 主键的常量类型转换错误#28636 / #29055PR #28636主键为 Nullable 或 LowCardinality 的表上的点查与等值过滤2mutations_sync2下等待 mutation 的问题#28889 / #29107PR #28889ALTER TABLE ... UPDATE/DELETE配合mutations_sync2的同步行为3Buffer/Kafka → Distributed 写入时复用先前凭据#29060 / #29815PR #29060配置了 interserver secret 的集群中经 Buffer/Kafka 写分布式表4TCP 客户端收到Attempt to read after eof而非UNKNOWN_DATABASE#29229 / #29399PR #29229查询不存在数据库时的错误码/错误文案5重建 ReplicatedMergeTree 副本时表结构不一致异常#29266 / #29356PR #29266含大小写不敏感函数默认表达式的复制表 DROP 后重建6ReadBufferFromHDFS 断言失败libhdfs3 升级#29276 / #29451PR #29276HDFS 表引擎读取7连接超时send_timeout/receive_timeout失效#29282 / #29301PR #29282高延迟/弱网环境下的连接与读取超时8移除窗口函数nth_value非内存安全#29348 / #29383PR #29348检查是否在查询中使用了nth_value9复制式访问存储replicated access storage配置错误时无法干净关闭#29388 / #29438PR #29388使用 ReplicatedAccessStorage 的集群10greatest/least 函数Cannot capture columns逻辑错误#29454 / #29489PR #29454greatest/least多参数查询11子查询下推 HAVING 谓词导致Block structure mismatch#29475 / #29536PR #29475带 HAVING 的复杂子查询12ODBC bridge 对Invalid cursor state增加重试#29518 / #29592PR #29518通过 ODBC 连接外部数据库13pathStartsWith中std::mismatch的未定义行为#29531 / #29572PR #29531依赖路径前缀判断的磁盘/文件操作14ALTER MODIFY中使用x.y.z...错误表标识导致罕见段错误#29573 / #29630PR #29573DEFAULT 表达式含多段标识符的列修改15JIT 表达式编译与别名/短路求值#29574 / #29658PR #29574开启compile_expressions时的表达式求值16谓词下推优化后 filter 条件丢失#29625 / #29751PR #29625复杂 WHERE 条件查询结果校验17GROUP BY 中 LowCardinality 并发访问导致 SIGSEGV#29782 / #29849PR #29782高并发 GROUP BY 聚合 LowCardinality 列18ATTACH TABLE ... FROM path非字符串字面量导致读未初始化内存#29790 / #29909PR #29790使用 ATTACH FROM 的导入场景19罕见的超时溢出elapsed 18446744073.709553 seconds#29811 / #29865PR #29811长时间运行的任务超时统计20MaterializedMySQL 断连后仅处理部分事务#29837 / #30024PR #29837MySQL 连接抖动场景下的数据一致性21system 表重建检查无法识别 enum 值变化#29857 / #29878PR #29857依赖 system 表结构的升级/DDL22MergeTree 并发查询限制的资源泄漏#29879 / #30057PR #29879高并发下 merge tree 查询限制释放23StorageLog 中LogSink::writeMarks()与LogSource数据竞争#29946 / #30204PR #29946Log 表引擎读写24FileChecker 与 StorageLog/StorageStripeLog 数据竞争#29959 / #30209PR #29959Log/StripeLog 表引擎25SAMPLE BY tuple()崩溃#30016 / #30070PR #30016SAMPLE BY tuple() 的查询26Memory 库删除后重启复现新增force_remove_data_recursively_on_drop#30054 / #30128PR #30054DROP Memory/Ordinary 数据库27Flat/Hashed 字典 nullable 属性bytes_allocated计算#30238 / #30262PR #30238含 nullable 属性的字典内存统计28multiIf 中短路求值与 LowCardinality 崩溃#30243 / #30306PR #30243multiIf 多分支 LowCardinality29ComplexKeyHashed/SparseHashed 字典preallocate解析#30246 / #30290PR #30246复杂键字典的 preallocate 配置重点条目深度解析①mutations_sync2的同步等待修复mutationALTER TABLE ... UPDATE/DELETE的同步程度由mutations_sync控制当前实现位于 src/Storages/StorageReplicatedMergeTree.cpp。该处代码显示在副本上执行同步 mutation 有明确限制if (query_context-getSettingsRef()[Setting::mutations_sync] 0 ... Synchronous mutation (mutations_sync {}) is not supported on a replica with the hang if the mutation fails. Use mutations_sync 0, or issue the mutation on a replica 即mutations_sync 0的同步 mutation 在副本上不受支持会给出明确报错并建议使用mutations_sync 0或改在主副本执行否则可能因等待而挂起。本版本修复的正是该参数取值为 2 时等待执行到副本 等待写入 ZooKeeper 的 mutation 日志等待逻辑的缺陷使同步等待行为与文档语义一致。相关说明也可见 src/Storages/MergeTree/MergeTreeSettings.cpp同步 mutation 在mutations_sync 1时等待至 mutation 应用失败时建议mutations_sync 0或另行处理。升级后建议针对复制表跑一轮ALTER ... UPDATESELECT mutations观察等待与完成状态。② 跨服务器密钥场景下的凭据复用漏洞修复PR #29060对应 issue #29815修复了一个安全相关问题当集群配置了 interserver secretsrc/Storages/StorageDistributed.cpp、src/Storages/StorageBuffer.cpp、src/Storages/Kafka/StorageKafka.cpp 参与的写入链路时通过 Buffer 或 Kafka 表向 Distributed 表写入可能复用先前连接的用户凭据。修复后不再允许复用每次按当前配置重新鉴权。升级此类集群时应重点验证 interserver 鉴权配置interserver_http_credentials在 Buffer/Kafka → Distributed 链路上的行为避免写入失败或意外绕过。③ 移除窗口函数nth_valuePR #29348对应 issue #29383移除了窗口函数nth_value理由是非内存安全。这是一个破坏性变更如果线上 SQL 使用了nth_value升级后必须改写为等价实现例如借助row_number() OVER (...)加条件过滤或自连接取第 N 个值否则查询会因函数不存在而报错。建议升级前先全局扫描 SQL 与报表中的nth_value用法。④force_remove_data_recursively_on_drop新设置修复 #26 附带引入了一个新设置force_remove_data_recursively_on_drop定义于 src/Core/Settings.cppDECLARE(Bool, force_remove_data_recursively_on_drop, false, R( Recursively remove data on DROP query. Avoids Directory not empty error, but may silently remove detached data ), 0)默认值false仅删除表目录中已知的数据文件作用DROP 时递归删除整个数据目录可规避删除 Ordinary 数据库时的Directory not empty错误云环境无法手动清理残留数据时的 workaround风险可能静默删除 detached 数据即用户为备份/恢复而 detach 的分区数据。该设置在 src/Databases/DatabaseOnDisk.cpp 与 src/Interpreters/loadMetadata.cpp 的删除流程中使用。启用前务必确认没有保留在磁盘上的 detached 分区需要抢救。⑤ MaterializedMySQL 断连后的部分事务处理PR #29837对应 issue #30024修复 MaterializedMySQL 在 MySQL 连接丢失时可能只处理事务的一部分。此前若写入中途断连后续恢复时可能以不完整的事务继续破坏目标表与源库的一致性。修复确保断连后不再处理残缺事务。使用 MaterializedMySQL 数据库引擎仓库内相关实现见 src/Databases/DatabaseMaterializedMySQL*的用户应结合故障注入kill MySQL 连接做一致性回归。⑥ 字典 nullable 属性内存统计与preallocate解析#27 与 #29 都围绕字典Dictionary布局前者修正 FlatDictionary、HashedDictionary 对 nullable 属性bytes_allocated的计算见 src/Dictionaries/ 下对应布局实现影响system.dictionaries的内存统计准确性后者修正 ComplexKeyHashedDictionary、ComplexKeySparseHashedDictionary 从 layout 配置解析preallocate选项src/Dictionaries/DictionaryStructure.*此前该选项可能被忽略影响建字典时的预分配行为。这两项均属配置正确性修复字典类用户升级后建议抽查system.dictionaries的加载状态与内存指标。NO CL CATEGORY 与 NOT FOR CHANGELOG补充修复JOIN 引擎表并发读写死锁PR #30185修复同时对 JOIN 引擎表执行读与写时的死锁风险属用户可见但未被归入标准分类的修复。ZooKeeper 客户端可能的 livelockPR #28195疑似修复属于预防性改动。S3 测试稳定性PR #29762与BoringSSL 升级PR #29998前者为测试侧修复后者为安全依赖升级均不改变 SQL 行为。升级评估与验证清单综合以上分析v21.9.5.16-stable 是一个「以稳定性和安全性修复为主」的补丁版建议按如下清单执行升级验证SQL 兼容性扫描全局检索是否使用nth_value本版移除如有则改写。安全回归配置 interserver secret 的集群验证 Buffer/Kafka → Distributed 写入的鉴权行为。复制与同步对 ReplicatedMergeTree 执行ALTER ... UPDATE确认mutations_sync各取值下的等待与报错行为符合预期参考 src/Storages/StorageReplicatedMergeTree.cpp 中的限制说明。数据一致性若使用 MaterializedMySQL做断连恢复一致性测试若计划从 ZooKeeper 迁移 Keeper重跑clickhouse-keeper-converter并校验转换结果。崩溃/内存类修复重点回归 LowCardinality GROUP BY / multiIf 短路求值、SAMPLE BY tuple()、Log 引擎并发读写等此前有 SIGSEGV/数据竞争风险的点。新设置评估仅当确实遇到Directory not empty且能接受 detached 数据被静默删除时才启用force_remove_data_recursively_on_drop。完整的变更条目与 PR/issue 对应关系见 docs/changelogs/archive/v21.9.5.16-stable.md同类历史版本可查阅 docs/changelogs/archive/ 目录。由于这是补丁版升级前仍建议在预发环境先行验证再按滚动方式灰度到生产集群。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →