ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ClickHouse v23.8.4.69-lts 变更日志深度解读:LTS 分支回补机制与 17 项关键修复解析

ClickHouse v23.8.4.69-lts 变更日志深度解读:LTS 分支回补机制与 17 项关键修复解析 ClickHouse v23.8.4.69-lts 变更日志深度解读LTS 分支回补机制与 17 项关键修复解析【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇基于 ClickHouse 官方归档变更日志 docs/changelogs/archive/v23.8.4.69-lts.md系统梳理 ClickHouse v23.8.4.69-lts 相对上一版本 v23.8.3.48-lts提交ebe4eb3d23e的全部变更内容。读完本篇你将掌握LTS 分支中 Backport回补机制的工作方式、本版本在构建打包层面解决的容器无限重启问题、Quorum 写入与 Keeper 重试交互导致的写入状态误判修复、以及 Sparse 列函数执行、虚拟列 OR 过滤等用户可见缺陷的源码级实现位置与验证测试便于在生产环境做版本升级评估与故障排查。版本定位一个典型的 LTS 补丁版本本变更日志的标题为ClickHouse release v23.8.4.69-lts (d4d1e7b9ded) FIXME as compared to v23.8.3.48-lts (ebe4eb3d23e)表明这是 23.8 LTS长期支持分支上的一个补丁版本由主干开发分支中已验证的修复通过回补Backport方式进入 LTS 线。理解这一点对阅读变更日志很关键版本号规则v23.8.4.69-lts 中23.8为主版本线4为该线的补丁级别69为构建序号-lts标识其为长期支持分支产物Backport 标记日志中每条记录开头的Backported in #NNNNN表示该修复先在主干以某个 PR 合入、再被回补到 23.8 分支的 PR 编号紧随其后的#NNNNN则为实际提交修复的 PR。例如 Quorum 修复的回补记录为Backported in #55097 ... #55026即主干 PR 55026 被回补进 LTS 分支条目分类本版本按Build/Testing/Packaging Improvement构建/测试/打包改进、Bug Fix用户可见缺陷修复、NO CL CATEGORY无变更日志分类、NOT FOR CHANGELOG / INSIGNIFICANT不进入变更日志的琐碎变更四类组织。构建、测试与打包改进本版本共包含 4 项构建与打包层面的改进其中第一项对容器化部署场景尤为关键。数据库已初始化时跳过重复初始化消除容器无限重启Backported in #55673对应 PR #50724作者 Alexander Nikolaev若数据库目录已经完成初始化后续启动时不再重新执行初始化流程。这一修复针对的是特定故障模式——当数据库在 1000 次尝试内无法完成加载时常见于数据量极大的数据库或多节点集群冷启动场景容器会进入无限重启循环。从源码结构看初始化逻辑集中在src/Storages下的存储引擎启动路径中重复初始化会反复触发目录扫描与元数据加载从而放大启动耗时跳过已初始化目录的检查使启动路径更短、更确定。对使用 Docker 部署 ClickHouse 的用户该修复可参考 docker/server 目录下的镜像与配置示例理解其部署上下文。Darwin 平台支持含子模块的资源构建Backported in #55293对应 PR #51435作者 Ilya Yatsishin在 macOSDarwin平台新增了专门的构建任务产出的资源包包含子模块源码可用于在不 checkout 全部 git 子模块的情况下构建 ClickHouse。这对构建环境受限无法拉取全部 contrib 依赖的开发者有实用价值仓库中 contrib/CMakeLists.txt 与各*-cmake目录展示了第三方依赖的组织方式而 CI 侧可参见 ci/jobs/build_clickhouse.py 中的构建作业定义。从 clickhouse-server 包独立启动 clickhouse-keeper 的问题修复Backported in #55366对应 PR #55226作者 Mikhail f. Shiryaev修复了安装clickhouse-server软件包后单独拉起clickhouse-keeper进程时出现的问题。仓库中 packages/clickhouse-keeper.service 与 packages/clickhouse-server.service 分别定义了两类进程的 systemd 单元programs/keeper 目录则包含 keeper 的独立可执行程序源码理解打包层面的进程分离有助于定位此类部署问题。CI 集成检查脚本修正Backported in #55725对应 PR #55716作者 Max K.修正了 CI 集成检查 Python 脚本使用的 API 地址并补充了 CI 测试的 README 文档属于纯工程侧改进。用户可见缺陷修复Bug Fix本版本共回补 15 项用户可见缺陷修复。按问题域组织如下并给出可对照的仓库源码位置。存储引擎与复制Quorum 写入、S3 分区、分区挂载Quorum 写入状态在 Keeper 重试时被错误标记为满足。Backported in #55097对应 PR #55026作者 Igor Nikonov修复 issue #54543当insert_quorum写入正在等待多数派副本确认期间、底层 Keeper 写入触发了重试Quorum 条件可能被错误地标记为已满足。仓库中保留了专门验证此场景的状态测试 tests/queries/0_stateless/02887_insert_quorum_wo_keeper_retries.sql该测试通过SET insert_keeper_fault_injection_probability0; SET insert_keeper_max_retries 0; SET insert_quorum 2;配合 failpointreplicated_merge_tree_insert_quorum_fail_0注入副本失败验证两个 ReplicatedMergeTree 副本在 Quorum2 下的写入行为预期首个插入报UNKNOWN_STATUS_OF_INSERT。这一项修复保障了复制表数据一致性的关键前提。ReplicatedMergeTree on S3非零拷贝无法删除 detached 分区。Backported in #55475对应 PR #55309作者 alesapin修复 issue #55225运行在 S3 之上的 ReplicatedMergeTree 系引擎未启用 zero-copy 复制无法DETACH/DROP分区同一 PR 还顺带修复了 Array、Nested 等复杂类型列在 S3 上遗留孤儿 blob的问题部分修复 issue #52393。防止跨表挂载ATTACH PARTITION索引/投影不一致的分区。Backported in #55473对应 PR #55062作者 János Benjamin Antal现在拒绝从定义了不同索引SKIPPED/SET/...或投影PROJECTION的表挂载分区避免挂载后读取语义与源表不一致。MaterializedPostgreSQL 出现 Invalid number of rows in Chunk。Backported in #55304对应 PR #54844作者 Kseniia Sumarokova修复了 PostgreSQL 版本 ≥ 13 时 MaterializedPostgreSQL 引擎可能抛出的 Invalid number of rows in Chunk 异常。该引擎的读取与消费逻辑位于 src/Storages/PostgreSQL/StorageMaterializedPostgreSQL.cpp 与 src/Storages/PostgreSQL/MaterializedPostgreSQLConsumer.cppChunk 行数不一致通常源于复制消息与本地缓冲的行数统计失配该修复保证了物化同步链路的块结构完整性。崩溃与死锁类修复Sparse 列上执行函数报错。Backported in #55349对应 PR #55275作者 Azat Khuzhin修复了对 Sparse 列执行函数时出现的DB::Exception: isDefaultAt is not implemented for Function: while executing FUNCTION Capture错误。从源码结构看这一异常的抛出点位于 src/Columns/ColumnFunction.h其中isDefaultAt默认以NOT_IMPLEMENTED抛出——Sparse 列在稀疏存储下要求实现该接口以判断默认值位置函数结果列此前未实现导致报错本版本补全了 Sparse 列上的函数执行路径。ShellCommandSource 异常路径触发 abort。Backported in #55461对应 PR #55103作者 Alexander Gololobov修复 issue #55091ShellCommandSource构造过程中、在部分send_data_threads已启动后若发生异常这些线程必须先 join否则ThreadFromGlobalPool析构时会触发abort()。在 src/Processors/Sources/ShellCommandSource.cpp 中可以看到send_data_threads的创建约 L536与析构/异常路径上的 join 逻辑约 L591、L713该修复保证了使用SELECT url(cmd://..., ...)等 shell 命令数据源时异常退出的安全性。QueryNormalizer 处理循环别名时崩溃。Backported in #55747对应 PR #55602作者 vdimir修复查询规范化阶段遇到循环定义别名如SELECT a AS b, b AS a形态的自引用时的崩溃。异步任务取消异常时 fiber 未销毁导致死锁。Backported in #55534对应 PR #55516作者 Kruglov Pavel关闭 issue #55185异步任务取消过程中若抛异常coroutine fiber 未被销毁可能造成后续死锁。LDAP 分配角色更新死锁。Backported in #55412对应 PR #55119作者 Julian Maicher修复了 LDAP 认证下、针对 ClickHouse 中不存在的角色做分配更新时的死锁。fs cache 后台下载修复。Backported in #55323对应 PR #55252作者 Kseniia Sumarokova修复文件系统缓存fs cache后台下载逻辑的缺陷影响通过缓存加速远端对象存储读取的场景。解析、类型与过滤语义修复cast 操作符::解析数组出错。Backported in #55437对应 PR #55417作者 Anton Popov修复了x::Array(UInt32)一类强制类型转换写法中数组类型的解析问题。虚拟列 OR 过滤失效回补两次。这是本版本中唯一出现两次回补记录的修复凸显其在发布中的紧迫性Backported in #55635对应 PR #55418作者 Azat Khuzhin修复查询中用 OR 条件过滤虚拟列的问题涉及MergeTree的_part*系列虚拟列、各类File/HDFS引擎的_path/_file虚拟列、以及Merge引擎的_table虚拟列Backported in #55760对应 PR #55678同一作者对同一 OR 过滤问题在回补过程中发现的回归做了再次修复。这意味着形如SELECT _part FROM t WHERE _part x OR _path LIKE y的跨引擎虚拟列 OR 过滤此前可能未生效升级后应重新验证相关监控类查询。MongoDB 连接问题。Backported in #55445对应 PR #55419作者 Nikolay Degterinsky关闭 issue #55376 与 #55232修复与部分 MongoDB 版本建立连接时的问题。废弃格式参数的 Unknown setting 异常。Backported in #55018对应 PR #54855作者 Kruglov Pavel关闭 issue #54792将已废弃的 format settings 移入独立分组并让其与普通 format settings 合并解析避免用户继续使用这些旧参数时抛Unknown setting异常。这提升了FORMAT子句参数如旧版 FORMAT 设置的向后兼容性。一项旧优化的错误回滚。Backported in #55399对应 PR #55353作者 Alexey Milovidov日志原文为一年前引入的一项优化是错误的关闭 issue #55272。由于回滚类修复会改变查询计划或执行路径升级前后如有性能对比数据建议关注该改动影响的热路径。其余变更条目NO CL CATEGORYBackported in #55706对应 PR #55657作者 Antonio Andelic该条目在日志中未附描述属于未归类的回补项。NOT FOR CHANGELOG / INSIGNIFICANT共 10 项琐碎变更不面向用户S3 构建产物#54504、CI 跳过构建/测试检查修复#54532、WebObjectStorage 相关代码更新#54695、去除 PR 状态标签设置#54799、清理 CI 脚本中的os.path用法#55028、聚合函数兼容性测试中清理数据目录并固定启动旧版本#55105、async insert 重试后检查块是否为空#55143、MaterializedPostgreSQL 移除重复回查#55297、当allow_remove_stale_moving_parts关闭时删除已存在的 moving 目录#55480、以及将 curl 升级至 8.4#55492。升级与验证建议版本核对升级后可用SELECT version()确认返回23.8.4.69并以本变更日志逐项核对 Backport 记录与所修复的 issue 编号确认所有目标修复均已包含。重点回归项若生产环境使用了insert_quorum复制表、S3 上的 ReplicatedMergeTree、MaterializedPostgreSQL、Sparse 列或依赖虚拟列 OR 过滤的监控查询建议优先回归这些路径仓库中的状态测试如前述 02887 测试可作为行为基线参考。回滚准备LTS 补丁版本之间的数据格式兼容风险较低但涉及 Quorum 写入与 S3 分区管理的修复意味着此前在这些路径上可能积累的不一致状态会在升级后暴露建议升级前做好数据目录备份并保留旧版本二进制以便回退。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进