ARTICLE DETAIL

资讯详情

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

ClickHouse v22.8.7.34-lts 版本变更解析:一个 LTS 维护版本中的关键修复与工程细节

ClickHouse v22.8.7.34-lts 版本变更解析:一个 LTS 维护版本中的关键修复与工程细节 ClickHouse v22.8.7.34-lts 版本变更解析一个 LTS 维护版本中的关键修复与工程细节【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇基于 v22.8.7.34-lts 变更记录 展开逐条解读该 LTS 补丁版本相对 v22.8.6.71-lts 的全部变更服务启动方式的调整、MergeTree 数据正确性修复、查询设置与投影projection相关的 bug 修复、备份系统对超大文件的处理以及时区数据库的更新并结合当前仓库源码给出每项修复对应的实现位置帮助运维与二次开发者理解这些修复背后的机制与影响范围。1. 版本定位LTS 维护版本与回移植Backport机制该文档记录的是 ClickHousev22.8.7.34-lts提交3c38e5e8ab9相对于上一版本v22.8.6.71-lts提交7bf38a43e30的变更。22.8 是 ClickHouse 的一个长期支持LTS分支其维护版本以-lts后缀发布主要接收主干master上经过验证的修复并回移植backport到维护分支——变更记录中大量条目开头的Backported in #xxxxx标记即表明该修复先在某主干 PR/Issue 中产生再被回植到 22.8 LTS 线。从本次变更的构成可以看出 LTS 维护版本的工作重点不改新功能只修稳定性与正确性问题——涵盖启动脚本行为、存储引擎MergeTree的 mutation 机制、聚合计数函数、备份系统、HTTP 响应元数据以及第三方依赖时区数据库的更新。2. 启动机制修复从clickhouse su改回sudo -u以尊重/etc/security/limits.conf变更条目Improvementstart阶段把clickhouse su命令替换回sudo -u目的是让/etc/security/limits.conf中的资源限制如文件描述符上限nofile真正生效。这一条针对的是传统 SysV 风格启动路径。ClickHouse 的 RPM/deb 包附带 init 脚本 clickhouse-server.init其中start()最终调用的是clickhouse start --user ${CLICKHOUSE_USER}这类子命令# packages/clickhouse-server.init当前仓库中的脚本结构 CLICKHOUSE_USERclickhouse PROGRAMclickhouse-server start() { ${CLICKHOUSE_GENERIC_PROGRAM} start --user ${CLICKHOUSE_USER} --pid-path ${CLICKHOUSE_PIDDIR} \ --config-path ${CLICKHOUSE_CONFDIR} --binary-path ${CLICKHOUSE_BINDIR} }问题在于如果服务切换用户是通过clickhouse su内部实现的用户切换完成的Linux 的 PAM 模块不会被完整触发于是limits.conf里针对clickhouse用户配置的资源限制会被跳过而改用sudo -u走标准的用户切换路径后PAM 的 limits 模块可以正常加载这些限制。对运维的实际意义在 22.8.7.34-lts 之前若你在/etc/security/limits.conf中为 ClickHouse 提高了nofile上限但发现不生效很可能就是命中了这个行为。升级到该版本或后续版本后该限制会按预期生效。对于使用 systemd 的部署服务单元文件见 clickhouse-server.servicesystemd 自身通过LimitNOFILE等指令管理限制不受此条影响。3. MergeTree 核心修复移除跳过未受影响分区 mutation的优化变更条目Bug Fix, user-visible misbehavior移除了 MergeTree 表中对未受影响分区unaffected partitions跳过 mutation 的优化因为该特性从未正确工作过且可能导致已完成的 mutation 复活resurrection of finished mutations。这是本版本中风险等级最高的一条修复。背景机制如下对 MergeTree 表执行ALTER TABLE ... UPDATE/DELETE会生成 mutationmutation 会逐个分区partition异步落地为新的 data part优化本意是如果某个 mutation 的过滤条件不涉及某分区就跳过对该分区的处理缺陷在于跳过逻辑在 mutation 完成后清理状态时不可靠某些分区看起来已经执行过的 mutation 可能在后续流程中被重新执行造成数据重复更新等难以排查的问题。从当前代码库结构看mutation 的分区级跳过逻辑集中在 StorageMergeTree.cpp 中可以看到与canSkipMutationCommandForPart相关的注释如src/Storages/StorageMergeTree.cpp#L1171附近描述 parts of unaffected partitions 的跳过行为说明这一机制在后续主干中仍在持续演进——22.8.7.34-lts 采取的策略是直接在维护分支上移除该优化用保守路径换正确性。对于使用ALTER UPDATE/ALTER DELETE较多、尤其是大量分区表的集群升级到该版本是消除mutation 复活隐患的正确做法。同条线的另一条修复同样值得关注Part ... intersects part ... 错误修复修复了在极罕见场景下出现的 Part ... intersects part ... 报错——当某个副本replica在刚把某个 data part detach 为 broken 之后立刻重启时可能触发。这属于副本元数据与磁盘 part 状态在异常重启窗口内不一致的问题修复后副本重启的鲁棒性更强。4. data part 元数据损坏风险ALTER UPDATE作用于已附加 part 时写出非法columns.txt变更条目对已附加attached且列结构与表 schema 不一致的 part 执行ALTER UPDATE可能在磁盘上产生非法的columns.txt元数据之后从该 part 读取会报错或返回错误数据。columns.txt是 MergeTree 每个 data part 目录下的列清单文件列名 类型是 part 可读性的基础元数据。此修复的意义在于堵住一条会产生数据层面脏元数据的路径一旦columns.txt被写坏问题不是查询报错这么简单而是可能静默返回无效数据这比崩溃更危险。如果你曾在 22.8 分支上手工 attach 过 part 或对非标准 part 执行过 mutation升级到该版本后建议对异常表做SYSTEM CHECK PART或重建校验。5. 聚合计数函数修复LowCardinalityBigInt 聚合方法选择、groupBitmap* 崩溃防护本次版本包含两条与聚合函数相关的修复1LowCardinality 与 BigInt 组合时的聚合方法选择错误Bug Fix 分类。LowCardinality包装的BigInt列在聚合时可能选错底层聚合实现导致结果异常。修复确保组合类型走正确的聚合路径。2向groupBitmap*系列传入错误的聚合状态时触发崩溃的防护。groupBitmap、groupBitmapAnd/Or/Xor及其-Merge/-State组合形式定义在 AggregateFunctionGroupBitmap.cpp 中函数签名要求参数是AggregateFunction(groupBitmap, UInt*)类型-- 典型用法来自该函数文档注释 SELECT groupBitmap(UserID) AS num FROM t; SELECT arraySort(bitmapToArray(groupBitmapAndState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, tag%);该修复属于错误输入不应导致进程崩溃类的健壮性加固类型不匹配时抛出可理解的错误而不是使服务器 crash。对于高频使用 bitmap 去重uniqCombined之外的精确 bitmap 方案的场景这是一项稳定性改进。6. 设置项与投影aggregate_functions_null_for_empty与additional_table_filters的两处修复1投影projection与aggregate_functions_null_for_empty的交互 bug。该设置Bool默认false在 Settings.cpp 中定义开启后空输入上的聚合函数返回NULL而非默认值。修复说明指出这是一个非常罕见的 bug仅在服务器配置中显式开启了该设置时才可能出现且涉及 projection 路径——投影描述与匹配逻辑分别位于 ProjectionsDescription.cpp 和 projectionsCommon.cpp。如果你的 22.8 服务器开启了这个冷门设置且表上建有 projection升级本版本可消除该隐患。2additional_table_filters未对Distributed存储生效Fixes #41692。该设置是一个 Map 类型设置定义于 Settings.cpp用于给指定表强制附加 WHERE 条件典型用法SETTINGS additional_table_filters {table_1: x ! 2}修复前该过滤条件在Distributed表上被漏掉意味着行级过滤在分布式查询链路上形同虚设修复后对 Distributed 存储也正确施加。注意从当前源码注释可以看到官方对它的定位它只是附加的 WHERE 过滤不是访问控制机制行级安全应使用 row policy但它必须在所有存储类型上一致生效本修复正是补齐了 Distributed 这个缺口。3HTTP 响应头X-ClickHouse-Summary中 read bytes/rows 统计错误在存在物化视图materialized view参与查询时Summary 头里的读取字节数/行数不正确。该响应头由 WriteBufferFromHTTPServerResponse.cpp 组装依赖查询执行的进度统计read_rows/read_bytes。物化视图会引入额外的内部查询路径修复后依赖X-ClickHouse-Summary做监控/计费统计的用户尤其是 HTTP 接口接入可得到准确数字。7. 备份系统修复从 base backup 复用大于 4GB 文件的 bug变更条目修复从 base backup 复用大于 4GB 文件的 bug。ClickHouse 的BACKUP体系支持增量备份链full/base backup 之上做增量后续备份能直接复用未变化文件而不重复传输。此版本之前大于 4GB 的文件在 base backup 复用路径上处理有误通常与 32 位长度截断有关会导致增量备份失败或复用错乱。备份实现位于 src/Backups 目录文件复用涉及 BackupEntryFromImmutableFile.cpp 等不可变文件条目类。如果你的备份链中包含超过 4GB 的单个文件例如未压缩的大 part 文件、对象存储磁盘上的大对象升级本版本后再做增量备份可避免该故障。8. 第三方依赖更新cctz 与 tzdata 2022e构建/测试/打包类变更包含两条时区库更新cctz 更新至最新 mastertzdb 更新到 2020ecctz 是 C 时区处理库对应子模块目录为 contrib/cctz构建接入在 contrib/cctz-cmaketzdata 更新到 2022e本版本时区数据库的关键变化引自变更说明巴勒斯坦的夏令时切换改为星期六 02:00执行乌克兰时区分区从三个简化为一个约旦和叙利亚从 02/03 带夏令时 改为全年固定 03。对业务的影响面是TimeZone相关的SimpleDateFormat/时区转换函数在 IANA 2022e 之后的规则变化上的正确性。跨时区对账、日志时间归一化等场景建议以更新后的 tzdb 为准验证。9. 其余条目说明Decimal 缓冲区溢出修复修复了 Decimal 数据类型处理中的缓冲区溢出问题属于内存安全类修复无直接可见的行为变化但应升级到该版本以消除潜在崩溃/越界风险另一条无描述编号的修复关闭 #42453变更记录仅给出 PR/Issue 编号而无正文描述遵循不推测未证实内容的原则本文不对其做进一步断言NOT FOR CHANGELOG / INSIGNIFICANT 部分包含两条不面向用户的改动——为release.py发布脚本增加必须指定 release 类型的警告与校验以及回滚了一个此前被合入的旧 PR#27787 的 revert。这类条目通常影响发布流程与依赖管理不进入正式 changelog。10. 小结如何对待一个 LTS 维护版本v22.8.7.34-lts 是一个典型的静默但重要的补丁版本没有新功能却覆盖了mutation 正确性第 3 节、part 元数据完整性第 4 节、分布式过滤设置生效第 6 节、大文件备份复用第 7 节四类对生产数据可信度有实质影响的修复。若你的生产环境运行在 22.8 LTS 线上升级到该版本或更后续版本的收益排序大致是MergeTree mutation 相关修复 additional_table_filters修复若使用 4GB 备份复用修复 时区数据更新。需要说明的前提本文引用的源码位置如src/Storages/StorageMergeTree.cpp、src/Core/Settings.cpp等来自当前仓库主干代码与 v22.8 分支上的具体实现可能存在差异用于理解机制与定位相关模块而非逐行对应 v22.8 的代码。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表