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

资讯详情

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

ClickHouse v23.7.3.14-stable 补丁版本深度解析:Named Collections、SHOW CREATE 密码泄漏与 Zstd 写缓冲截断修复

ClickHouse v23.7.3.14-stable 补丁版本深度解析:Named Collections、SHOW CREATE 密码泄漏与 Zstd 写缓冲截断修复 ClickHouse v23.7.3.14-stable 补丁版本深度解析Named Collections、SHOW CREATE 密码泄漏与 Zstd 写缓冲截断修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇文章以 ClickHouse 官方发布说明 docs/changelogs/archive/v23.7.3.14-stable.md 为主线深入剖析该补丁版本相对 v23.7.2.25-stable 的每一项变更并结合当前仓库源码与测试用例讲清每个 Bug 的成因、修复思路与验证方法。读完本文你将理解 ClickHouse 补丁版本patch release的发布结构、Named Collections 在集群上的工作机制、SHOW CREATE 语句的密钥脱敏原理以及 zstd 流式压缩缓冲区的内部实现。版本概览补丁版本的发布形态v23.7.3.14-stable 是 ClickHouse 2023 年 7 月稳定分支23.7上的一个补丁发布基线为 v23.7.2.25-stablecommit8dd1107b032本次构建提交为bd9a510550c。发布说明中的FIXME是 changelog 生成工具的占位标记表示该条目在发布流程中需要被人工确认或替换属于 ClickHouse 发布脚本的常规痕迹并非技术内容。整个发布包含三类条目Build/Testing/Packaging Improvement构建/测试/打包改进1 条涉及 Docker 镜像构建Bug Fix用户可见行为修复3 条涉及 Named Collections、SHOW CREATE 密码泄漏、zstd 压缩写缓冲NOT FOR CHANGELOG / INSIGNIFICANT不对外发布 / 次要修复2 条涉及 DISTINCT 崩溃与 Parquet 统计信息。其中Bug Fix条目是官方明确标记的用户可见的错误行为修复是本次补丁的核心价值所在。下面逐条展开。修复一集群上的 Named Collections 问题#52687背景什么是 Named CollectionsNamed Collections命名集合是 ClickHouse 用于集中管理外部系统连接凭据与参数的机制。它把连接 Kafka、S3、MySQL、远程表函数等场景所需的地址、端口、用户名、密码等参数以命名集合的方式存储用户在使用表函数或数据源时只需引用集合名避免在每条 SQL 中重复书写敏感信息。从源码结构看Named Collections 的实现集中在 src/Common/NamedCollections/ 目录下NamedCollections.cpp/NamedCollections.h集合核心对象提供get、getOrDefault、set、has、isOverridable等操作NamedCollectionsFactory.cpp集合的工厂与注册表NamedCollectionsMetadataStorage.cpp集合元数据的持久化存储Interpreters/InterpreterCreateNamedCollectionQuery.cpp等DDL 的执行解释器Parsers/ASTCreateNamedCollectionQuery.cpp等DDL 的语法树节点。集合内部通过Poco::Util::AbstractConfiguration承载键值对例如 src/Common/NamedCollections/NamedCollections.cpp 中Impl::create会把配置中的collection_path . key逐项复制进独立的集合配置对象。集合支持has(key)、getT(key)、getOrDefaultT(key, default)等类型化访问且每个键可标注是否允许被查询侧覆盖isOverridable。问题所在集群ON CLUSTER语义的修复本次修复的正是named collections on cluster——即通过ON CLUSTER在分布式集群上创建、修改、删除命名集合的行为。语法树的格式化实现可以印证这一能力src/Parsers/ASTCreateNamedCollectionQuery.cpp 中formatImpl依次输出CREATE NAMED COLLECTION [IF NOT EXISTS] name、formatOnCluster(...)以及AS key value列表。该修复PR #52687解决了 23.7 中ON CLUSTER场景下命名集合创建/变更未能正确同步到集群各节点的问题。命名集合在分布式部署中必须保证各节点元数据一致否则同一集合在不同节点上可能解析出不同的连接参数导致查询行为不一致。验证方式仓库中的无状态测试可复现集合的分布式行为tests/queries/0_stateless/02046_remote_table_function_named_collections.sql验证remote表函数与命名集合的配合tests/queries/0_stateless/02883_named_collections_override.sh验证集合参数被查询覆盖的语义tests/queries/0_stateless/03201_local_named_collections.sh验证本地非集群命名集合的隔离行为。修复二SHOW CREATE MYSQL TABLE 的密码泄漏#52962问题SQL 重写导致密钥外泄SHOW CREATE TABLE用于还原一张表的完整 DDL。当表使用 MySQL 数据库引擎ENGINE MySQL(...)时DDL 中会包含连接参数其中可能带有password。修复前的行为是SHOW CREATE直接输出了明文密码任何能执行该语句的用户都能借此获取数据库凭据属于安全漏洞。源码佐证密钥脱敏[HIDDEN]机制ClickHouse 在语法树格式化阶段对密钥字段做了统一脱敏。以命名集合的 DDL 输出为例src/Parsers/ASTCreateNamedCollectionQuery.cpp 中if (settings.show_secrets) ostr applyVisitor(FieldVisitorToString(), change.value); else ostr [HIDDEN];即只有显式开启show_secrets时才输出真实值否则一律以[HIDDEN]占位。MySQL 引擎的SHOW CREATE路径遵循同样的安全策略默认隐藏password等敏感字段仅在具备相应权限并显式要求时展示。PR #52962 正是把这一策略补全到SHOW CREATE MYSQL TABLE的生成逻辑中堵住泄漏通道。使用建议升级到包含该修复的版本23.7.3.14 及之后的补丁日常运维不要把SHOW CREATE的输出直接贴进日志或工单其中可能残留脱敏前的历史输出涉及外部引擎MySQL、PostgreSQL、Kafka、S3的凭据应尽量收敛到 Named Collections 中集中管理。修复三ZstdDeflatingWriteBuffer 偶发截断输出#53064问题现象ZstdDeflatingWriteBuffer是 ClickHouse 的 zstd 流式压缩写缓冲区负责把数据用 zstd 算法压缩后写入底层缓冲。修复前的版本在特定条件下会偶尔截断输出——即压缩写入的文件不完整末尾数据丢失表现为压缩文件大小异常或解压时报错。源码级成因分析从 src/IO/ZstdDeflatingWriteBuffer.cpp 的实现看压缩过程的核心是flush(ZSTD_EndDirective mode)size_t compression_result ZSTD_compressStream2(cctx.get(), output, input, mode); ... bool everything_was_compressed (input.pos input.size); bool everything_was_flushed compression_result 0; ended everything_was_compressed everything_was_flushed;循环只有在输入全部消费且压缩器输出已全部落盘compression_result 0表示 zstd 内部缓冲已清空时才结束。在流式边界如大输入被切分到多个输出块、ZSTD_e_flush与ZSTD_e_end切换处若结束条件判断不严谨就可能提前退出循环导致剩余压缩数据未写入底层缓冲最终输出被截断。PR #53064 修正了这类边界条件下的收尾逻辑确保ZSTD_e_end之后 zstd 的所有内部状态都被冲刷干净。缓冲区还暴露了另一个与本次修复相关的参数——window_logzstd 长距离匹配的窗口对数见 src/IO/ZstdDeflatingWriteBuffer.h。当window_log超出 zstd 支持范围时构造函数会抛出ILLEGAL_CODEC_PARAMETER相关行为在 tests/queries/0_stateless/04826_zstd_deflating_write_buffer_invalid_window_log.sh 中有专门验证。测试佐证tests/queries/0_stateless/04826_zstd_deflating_write_buffer_invalid_window_log.sh以INSERT INTO FUNCTION file(...) SETTINGS output_format_compression_zstd_window_log 1000触发非法窗口参数断言报错码ILLEGAL_CODEC_PARAMETERtests/queries/0_stateless/01622_codec_zstd_long.sqlzstd 编解码器的长数据回归测试tests/queries/0_stateless/02293_test_zstd_window_log_max.sh验证window_log上限行为。这些测试共同守护了 zstd 压缩路径的完整性防止截断类问题回归。非发布条目DISTINCT 崩溃与 Parquet 统计信息NOT FOR CHANGELOG / INSIGNIFICANT类别表示这些修复不会写入对外发布的 changelog通常用于内部质量改进但对稳定性同样重要Suspicious DISTINCT crashes#52636由 SQLancer数据库差分模糊测试工具在DISTINCT查询中发现的疑似崩溃。SQLancer 是 ClickHouse 长期使用的模糊测试体系之一这类由模糊测试驱动的修复体现了项目以自动化工具保障查询正确性的做法Fix Parquet stats for Float32 and Float64#53067修复 Parquet 格式中浮点列统计信息min/max的写入错误。此前 Float32/Float64 列的统计元数据可能不准确影响依赖 Parquet 文件统计信息做查询裁剪predicate pushdown的下游系统。构建/打包改进Docker 镜像与内联缓存#53008本次唯一的 Build/Testing/Packaging 条目与 Docker 镜像构建相关。背景是ClickHouse 的构建产物有时会携带内联缓存inline cache即构建期内联到二进制中的缓存数据打入 Docker 镜像后可能引发奇怪的副作用。由于该缓存并未被实际使用PR #53008 直接将其从打包流程中移除。这一改动印证了仓库 docker/server/ 与 docker/binary-builder/ 等打包目录的职责构建产出物需要经过裁剪与净化才能保证镜像体积与运行时行为的确定性。升级与验证建议升级路径v23.7.3.14-stable 是 23.7 分支的补丁版本官方发布渠道包括 deb/rpm 包与 Docker 镜像具体安装方式可参考 docker/server/ 与 packages/ 目录中的打包配置回归重点升级后建议重点验证三类场景——ON CLUSTER下的命名集合 DDL、外部引擎表的SHOW CREATE输出确认密码以[HIDDEN]脱敏、zstd 压缩的文件/HTTP 压缩输出完整性复现测试可直接运行仓库中的无状态测试如04826_zstd_deflating_write_buffer_invalid_window_log.sh验证 zstd 相关行为在当前环境的表现。小结v23.7.3.14-stable 是一个典型的补丁版本体量小、目标明确集中在三个用户可见的缺陷上——分布式命名集合的一致性、SHOW CREATE 的凭据泄漏、zstd 压缩输出的偶发截断。通过阅读源码可以看到这些修复背后是 ClickHouse 一贯的安全脱敏策略show_secrets开关、流式压缩的严格收尾语义以及 SQLancer 模糊测试驱动的质量保障体系。对于在生产环境使用 23.7 分支的用户该版本是一次值得跟进的稳定性与安全性更新。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表