ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ClickHouse v22.6.9.11-stable 版本变更深度解读:su 权限、ORC 缓冲越界修复与打包改进

ClickHouse v22.6.9.11-stable 版本变更深度解读:su 权限、ORC 缓冲越界修复与打包改进 ClickHouse v22.6.9.11-stable 版本变更深度解读su 权限、ORC 缓冲越界修复与打包改进【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文以 ClickHouse 官方稳定版本v22.6.9.11-stable对应提交9ec61dcac49的发布日志为核心逐条拆解该补丁版本包含的改进项、打包/测试改进项与用户可见的 Bug 修复并深入当前仓库源码讲解clickhouse su工具的设计动机与实现细节、ORC 格式写入缓冲越界问题的成因与修复位置、以及 deb 包Source字段与 nfpm 打包流水线的来龙去脉。读完本文你将能理解 ClickHouse 版本发布节奏中补丁版本patch release的管理方式并能依据源码定位相关实现具备排查同类问题的能力。该版本是在v22.6.8.35-stable提交b91dc59a565基础上的增量修复版本属于 2022 年 6 月功能分支的补丁序列当前仓库以 docs/changelogs/archive/v22.6.9.11-stable.md 归档了该日志。一、版本概览与发布背景Changelog 文件头部给出了该版本的核心定位ClickHouse release v22.6.9.11-stable (9ec61dcac49) FIXME as compared to v22.6.8.35-stable (b91dc59a565)版本号语义v22.6.9.11表示 2022 年 6 月功能分支22.6下的第 9 个维护maintenance发布、内部构建序号 11后缀-stable表示稳定通道。对比基准该版本是相对v22.6.8.35-stable的增量补丁意味着只包含少量经过挑选的修复backport不引入新功能。归档说明日志文件开头以sidebar_position: 1、sidebar_label: 2022表明其作为 2022 年度 changelog 归档的一部分被收录在文档站点中。补丁版本的管理策略从本次发布的NOT FOR CHANGELOG / INSIGNIFICANT条目中可以窥见发布流程仅从 master 分支构建最新标签对应 PR #41567这保证了版本标签来源单一、可追溯。二、Improvementclickhouse su回退为sudo -u尊重 limits.conf 限制2.1 变更内容本次改进对应 PR #41847由 Eugene Konkov 提交将服务启动流程中的clickhouse su命令替换回sudo -u目的正是为了尊重/etc/security/limits.conf中的资源限制配置。2.2 源码级理解clickhouse su是什么当前仓库在 programs/su/su.cpp 中实现了这一工具入口声明位于 programs/su/clickhouse-su.cpp该程序被注册为clickhouse su子命令。其文件头注释完整解释了设计动机su means set user. In fact, this program can set Unix user and group. The motivation for this tool is very obscure and idiosyncratic. It is needed for Docker. People want to run programs inside Docker with dropped privileges (less than root). But the standard Linux su program is not suitable for usage inside Docker, because it is creating pseudoterminals to avoid hijacking input from the terminal... people use alternative and less secure versions of su tools like gosu or su-exec. But it would be very strange to use 3rd-party software only to do two-three syscalls. Thats why we provide this tool.核心要点clickhouse su是一个极简的降权执行工具用法为clickhouse su user[:group] args...它不创建伪终端PTY因此与 Docker 的终端处理兼容可作为 gosu / su-exec 的零依赖替代品实现上仅调用几个系统调用getpwnam_r/getgrnam_r解析用户与组、initgroups重置补充组、setgid设置组 ID、setuid设置用户 ID最后execvp执行目标程序。从源码结构看setUserAndGroup函数programs/su/su.cpp的实现细节包括优先解析数字 UID/GID非数字或为 0 时回退到名称解析getgrnam_r/getpwnam_r在调用setuid之前先执行initgroups或setgroups重置补充组避免降权后仍继承 root 的补充组权限若目标 UID/GID 为 0 而当前并非 root会抛出BAD_ARGUMENTS错误——降权到 0 没有意义。2.3 与 limits.conf 的关系/etc/security/limits.conf是 PAM 模块pam_limits读取的配置文件用于为登录会话设置nofile文件描述符上限、nproc进程数上限、memlock内存锁等资源限制。sudo -u通过 PAM 会话建立流程会正确应用这些限制而clickhouse su类似 gosu/su-exec 的实现仅做setuid/setgid系统调用不经过 PAM因此不会加载 limits.conf。这正是该版本将启动命令回退为sudo -u的原因——确保 ClickHouse 服务进程在受控的资源限制下运行。2.4 Docker 场景中的实际用法当前仓库的 docker/server/entrypoint.sh 展示了clickhouse su在容器内降权场景下的真实用法# 当系统不将 root 映射为 admin 权限时如 NFS 挂载rootnobody # mkdir 必须以目标 uid/gid 执行而非权限为零的 nobody mkdir( clickhouse su ${USER}:${GROUP} mkdir )以及启动服务器本体exec clickhouse su ${USER}:${GROUP} clickhouse-server --config-file$CLICKHOUSE_CONFIG $对比之下docker/keeper/entrypoint.sh 则选用gosu完成同样的降权。这印证了 changelog 中的描述clickhouse su与 gosu 等工具功能等价官方在补丁版本中根据实际运维诉求在二者之间切换以兼顾 Docker 兼容性与系统资源限制的遵守。三、Bug FixApache ORC 格式写入的缓冲越界buffer overrun3.1 变更内容本次修复对应 PR #41458由 Alexey Milovidov 提交解决了以 Apache ORC 格式写入数据可能导致缓冲越界buffer overrun的问题属于用户可见的官方稳定版缺陷修复。3.2 相关实现定位ORC 输出格式的核心实现位于 src/Processors/Formats/Impl/ORCBlockOutputFormat.h受USE_ORC编译开关控制ORCOutputStream适配orc::OutputStream接口将 ORC 库的写入请求转发到底层WriteBufferORCBlockOutputFormat继承IOutputFormat通过consume(Chunk)消费数据块、finalizeImpl()收尾类型转换辅助函数族writeNumbers、writeDecimals、writeStrings、writeDateTimes负责将 ClickHouse 数据类型映射到 ORC 的ColumnVectorBatch。从源码结构可以推断缓冲越界类问题通常发生在类型转换路径上例如 UInt8 需要先转换为unsigned char头文件注释中明确提及bugprone-signed-char-misuse的 clang 检查或 ClickHouseInt128与 ORCInt128的位宽转换。本次修复属于补丁版本的标准流程发现问题后经由 backport 机制Issue #41504合入维护分支。3.3 对使用者的影响与验证建议ORC 是列式存储格式常用于与 Apache Hive / Iceberg 生态互操作该输出格式还支持为 Iceberg 写入附加iceberg.id字段 ID 属性见头文件注释。受影响的用户应升级到该版本或更高版本避免在批量导出 ORC 数据时触发内存破坏导致的服务崩溃或数据损坏回归验证场景使用SELECT ... INTO OUTFILE ... FORMAT ORC或INSERT INTO FUNCTION file(..., ORC)批量导出包含数值、字符串、日期时间混合类型的表并配合CHECKSUM或读回比对确认数据完整性。四、Build/Testing/Packagingdeb 包新增 Source 字段与 nfpm 升级4.1 变更内容打包改进对应 PR #41531由 Mikhail f. Shiryaev 提交为 deb 包增加了source字段并同步升级了nfpmGo 语言编写的跨平台打包工具。4.2 仓库中的打包配置证据当前仓库使用 nfpm 的 YAML 配置描述各 deb/rpm/apk 包例如 packages/clickhouse-common-static.yaml 中已经可以看到该字段的落地形态name: clickhouse-common-static version: ${CLICKHOUSE_VERSION_STRING} vendor: ClickHouse Inc. homepage: https://clickhouse.com license: Apache section: database priority: optional maintainer: ClickHouse Dev Team packageslinuxclickhouse.com deb: fields: Source: clickhouse其中deb.fields.Source: clickhouse正是本条目所述的deb 包的 source 字段。Debian 打包规范要求二进制包声明其对应的源码包名Source 字段便于apt-get source溯源与版权审计工具工作在添加该字段之前dpkg -s clickhouse-common-static等查询命令无法正确回显源码包归属。打包流水线本身位于 packages/build它调用 nfpm 依次产出 deb、apk、archlinux、rpm 等格式PKG_PATH$(nfpm package --target $OUTPUT_DIR --config $config --packager deb ...) nfpm package --target $OUTPUT_DIR --config $config --packager apk nfpm package --target $OUTPUT_DIR --config $config --packager archlinux nfpm package --target $OUTPUT_DIR --config $config --packager rpm配置中的路径变量${CLICKHOUSE_VERSION_STRING}、${DEB_ARCH}等在构建时由环境注入packages/clickhouse-client.yaml、packages/clickhouse-server.yaml 等文件遵循同一套模板风格覆盖 server、client、common-static、common-static-dbg 等全部发行包。4.3 对使用者的影响对普通用户而言该改动提升了包元数据质量使用apt-cache show clickhouse-server或dpkg -s查看包信息时可以看到Source: clickhouse方便依赖解析与源码级排障。对打包维护者而言升级 nfpm 意味着获得更新的模板语法与安全修复属于持续性的工程基建改进。五、发布流程规范仅从 master 构建最新标签日志末尾的 NOT FOR CHANGELOG / INSIGNIFICANT 分类收录了一条流程性变更PR #41567仅从 master 分支构建最新标签。这条规则保证了版本标签来源唯一所有发布标签统一从 master 生成避免从多个分支产出语义重叠的版本号回溯可审计结合每条 backport 条目中记录的Backported in #XXXXX的 Issue/PR 编号可以精确重建修复 → 合入 master → backport 到维护分支 → 发布的完整链路补丁发布节奏清晰v22.6.9.11 这样的补丁版本只承载少量经过挑选的修复配合 changelog 中Improvement、Build/Testing/Packaging Improvement、Bug Fix、NOT FOR CHANGELOG / INSIGNIFICANT的严格分类用户可以快速评估升级风险。六、总结与升级建议v22.6.9.11-stable 是一个典型的 ClickHouse 维护补丁版本变更面虽小但价值明确类别变更内容仓库中的落点Improvement启动流程以sudo -u替代clickhouse su尊重/etc/security/limits.conf限制programs/su/su.cpp、docker/server/entrypoint.shBug Fix修复 Apache ORC 写入时潜在的缓冲越界src/Processors/Formats/Impl/ORCBlockOutputFormat.hPackagingdeb 包新增Source字段升级 nfpmpackages/clickhouse-common-static.yaml、packages/build流程仅从 master 构建最新发布标签docs/changelogs/archive/v22.6.9.11-stable.md升级建议正在使用 ORC 格式Hive/Iceberg 集成批量导出数据的实例建议升级至本版本或更新的稳定版本以规避缓冲越界风险在容器中运行 ClickHouse 并依赖系统资源限制的部署请确认启动脚本/编排逻辑与官方 docker/server/entrypoint.sh 行为一致必要时显式通过sudo -u或以CLICKHOUSE_RUN_AS_ROOT/CLICKHOUSE_UID/CLICKHOUSE_GID环境变量控制降权方式后续版本已在官方仓库中持续迭代阅读 docs/changelogs 目录下的归档可以横向对比同一时间窗口内其他稳定分支的修复范围用于制定跨版本升级路径。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表