资讯详情

资讯详情

ClickHouse 23.8 LTS 补丁版 v23.8.6.16-lts 修复详解:从 MergeTree 校验错误到 T64 解码器崩溃

ClickHouse 23.8 LTS 补丁版 v23.8.6.16-lts 修复详解从 MergeTree 校验错误到 T64 解码器崩溃【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHousev23.8.6.16-lts 是 ClickHouse 23.8 LTS 分支上的一次关键补丁发布集中修复了 5 个在官方稳定版中可见的用户行为问题user-visible misbehavior涵盖 ReplicatedMergeTree 校验错误、正则索引条件、启动加载崩溃、Keeper 信号处理器段错误以及 T64 压缩解码器的缓冲区溢出。本文基于仓库内该版本的 官方变更日志 逐条拆解这些修复的背景、影响面与源码依据帮助运行 23.8 LTS 的读者评估升级的必要性并理解 ClickHouse 补丁发布机制。版本概况一次典型的 LTS 补丁发布该版本全称为ClickHouse release v23.8.6.16-lts (077df679bed)其比较基准为上一补丁版v23.8.5.16-lts (e8a1af5fe2f)。从变更日志的标题结构可以读出 ClickHouse 补丁发布的几个核心信息版本命名规范v23.8表示 23 年 8 月发布的主版本major.minor.6.16为补丁序列第 6 次补丁、build 16-lts表明这是长期支持Long Term Support分支的版本与-stable、-prestable共同构成 ClickHouse 的三类发布通道发布性质该版本只包含Bug Fix用户可见的官方稳定版错误行为一类条目没有新功能这正是 LTS 补丁分支的典型形态——以最低风险修复稳定版问题FIXME 占位符标题中保留了FIXME字样说明该变更日志由发布脚本自动生成、在人工复核前保留了占位标记这是 ClickHouse 发布流水线的常见痕迹。每次补丁发布都依赖backport向后移植机制修复先在主分支合入再通过独立 PR 移植回 LTS 分支。本版本 5 个修复对应的 backport 请求编号分别为#54583、#56253、#56322、#56292、#56443每个修复都关联了原始 issue 与移植 PR。变更日志还包含一条NOT FOR CHANGELOG / INSIGNIFICANT条目改善 docker 镜像构建此类条目不计入对外变更说明。修复一ReplicatedMergeTree 的罕见CHECKSUM_DOESNT_MATCH自愈问题问题现象本次修复对应移植请求#54583针对 ReplicatedMergeTree 的一个罕见 bug该 bug 会在日志中产生CHECKSUM_DOESNT_MATCH错误但能够自我恢复self-recovering即错误出现后系统能够自动修复不会导致数据永久损坏或服务不可用。虽然不影响最终数据一致性但这类校验错误在日志中会引发告警且若与真实损坏混淆会给运维排障带来干扰。源码依据CHECKSUM_DOESNT_MATCH是 ClickHouse 合并树存储引擎的数据校验错误码在仓库中的定义与使用位置集中在合并树数据部件处理逻辑里MergeTreeDataPartChecksum.cpp负责数据部件data part的 checksum 计算与比对是校验错误的产生源头DataPartsExchange.cpp处理副本间数据部件交换网络传输后的校验也在此路径上。从代码结构看ReplicatedMergeTree 在接收副本数据部件、合并merge或变更mutation过程中都会对 part 逐一校验 checksum。此修复针对的正是这些路径中某条边缘状态下误报校验失败、随后又被正常流程修正的场景——因此表现为日志报错但可自愈。对于 23.8 LTS 用户该修复的价值在于消除误报噪音让CHECKSUM_DOESNT_MATCH日志真正成为数据损坏的可信信号。修复二match()正则函数交替模式产生错误索引条件问题现象match()函数用于判断字符串是否匹配给定的正则表达式是 ClickHouse 中最常用的字符串搜索函数之一。本次修复#56253指出当正则模式中包含交替alternation即|时该函数可能产生错误的键条件key condition进而导致查询优化器基于错误的条件下推索引返回错误的结果集。源码依据match()函数的实现位于 match.cpp其核心定义为using FunctionMatch FunctionsStringSearchMatchImplNameMatch, MatchTraits::Syntax::Re2, MatchTraits::Case::Sensitive, MatchTraits::Result::DontNegate;它基于RE2正则库实现大小写敏感、不取反并以REGISTER_FUNCTION(Match)注册同时注册了别名REGEXP_MATCHES。实现细节在 MatchImpl.h 中MatchTraits枚举了SyntaxLike/Re2、CaseSensitive/Insensitive、ResultDontNegate/Negate三组模板参数match、like、ilike等函数族共享同一套搜索框架对形如.*、.*?的模式有常数填充的短路优化对简单正则提供 JIT 编译的快速路径getRegexpJITMatcher并支持将LIKE模式降级为子串搜索RE2 匹配按 UTF-8 语义工作.默认匹配换行符可用(?-s)关闭模式默认不锚定。从实现推断交替模式alternation的错误键条件问题出现在查询优化阶段match(col, pattern)这类谓词会被优化器尝试转换成对列索引如 primary key 前缀列的 range/IN 条件。当模式含|时若索引构建逻辑未正确处理分支展开就可能生成比实际匹配范围更窄的键条件从而漏掉本应命中的行。该修复正是修正了交替模式在键条件下推时的展开逻辑。规避建议在编写正则时若需匹配多个候选值可优先考虑multiMatchAny系列函数支持多模式数组或将模式明确锚定^...$以减少优化器对复杂模式的误判面。修复三启动时加载表崩溃问题现象本次修复#56322解决了一个服务器启动阶段加载表时可能触发的崩溃问题。ClickHouse 启动时会扫描并加载所有已存在的表结构与数据部件元数据任何表在此阶段加载失败都可能中断整个启动流程。该问题对应 issue#55767即部分用户反馈的启动崩溃场景。影响面启动加载是 ClickHouse 生命周期中最敏感的环节之一涉及从 system database 与配置目录读取表定义DDL为每个表构建 Storage 对象并恢复数据部件列表对 ReplicatedMergeTree 等引擎还需与 ZooKeeper/Keeper 同步元数据。崩溃发生在这一路径上意味着即使磁盘数据本身完好异常的表元数据也可能阻断实例重启。该修复让加载过程对异常状态具备更强的容错能力降低升级后首次重启的风险。对于生产环境升级后建议先在测试实例上完整执行一次冷启动验证。修复四Keeper 信号处理器中的段错误问题现象本次修复#56292修复了KeeperClickHouse 自带的 ZooKeeper 兼容协调服务在信号处理路径中的段错误segfault。信号处理器signal handler用于在进程收到终止、崩溃信号时执行收尾动作如刷新日志、生成 core dump 信息等。若信号处理器自身崩溃会导致进程异常退出时无法生成有效的诊断信息core dump、堆栈集群协调节点keeper在故障切换场景下表现异常运维排障时缺失关键证据。该修复位于 Keeper 服务的信号处理实现中属于低概率但高影响的崩溃路径修复。使用 Keeper 替代外部 ZooKeeper 的 23.8 LTS 集群尤其值得包含此修复的补丁版本。修复五T64 压缩编解码器解压畸形数据的缓冲区溢出问题现象本次修复#56434修复了T64 压缩编解码器在解压畸形数据malformed data时因缓冲区溢出导致的崩溃。值得注意的是该问题由 ClickHouse Bug Bounty Program漏洞赏金计划发现并报告说明这是一类面向恶意/损坏输入的安全相关修复——攻击者或损坏的存储介质可能通过构造畸形压缩块触发越界读写。T64 编解码器原理与源码依据T64 是 ClickHouse 内置的专用压缩预处理编码实现在 CompressionCodecT64.cpp其核心思想取 64 个整数值组成 64×64 的位矩阵并转置裁掉所有值共同未使用的高位most significant zeroes。例如某列UInt8只含 0/1 两种取值64 个UInt8可被压缩为 1 个UInt64。关键实现细节均可在源码中确认磁盘布局每次编码调用依次为cookie1 字节低 7 位类型 id 高位 variant、unaligned prefix不足一个元素宽度的剩余字节原样拷贝、min/max header16 字节、若干matrix block每个 8·n_bits 字节两种变体Byte按字节转置位矩阵默认与Bit完整位转置对 ZSTD 压缩率更好但对 LZ4 更差见枚举Variant类型魔法数MagicNumber枚举为每种支持类型分配固定 idUInt81 … IPv421并在压缩端serializeTypeId/ 解压端deserializeTypeId中交叉校验解压时遇到未知 magic 会抛出INCORRECT_DATA支持类型baseType()/typeIdx()表明 T64 支持所有整数、Date/Date32、DateTime/DateTime64、Time/Time64、Enum8/Enum16、Decimal32/Decimal64、IPv4SIMD 加速在 x86-64SSE2与 aarch64NEON且小端序环境下启用向量化转置内核transposeByteLanes。从代码结构推断缓冲区溢出风险点在于解压路径对畸形输入的长度/位宽推导n_bits、块数量等参数均由输入数据决定若未对越界值做充分校验恶意构造的块大小可能超出输出缓冲区。本次修复正是加固了解压侧对这些派生参数的边界检查。这也解释了为何同类问题常通过 Bug Bounty 发现——畸形输入正是模糊测试fuzzing与安全审计的核心场景。运维含义使用 T64 编码CODEC(T64, ...)的列在读取到异常压缩块时旧版本可能直接崩溃而本修复将崩溃转化为可处理的解压错误。建议所有启用 T64 的 23.8 LTS 实例尽快升级。升级建议与验证谁应该升级由于本版本全部 5 项修复均为稳定版用户可见问题的修正且包含一处安全相关的缓冲区溢出修复建议所有 23.8 LTS 用户按以下优先级评估使用了 T64 codec 的实例优先升级安全相关修复大量使用match/正则查询并依赖索引下推的实例尽快升级避免错误的键条件导致查询漏数据使用 Keeper 且重视故障诊断的集群升级以获得信号处理崩溃修复其余实例可在常规变更窗口升级消除 MergeTree 校验误报与启动崩溃风险。升级后验证要点冷启动验证重启后观察日志确认无表加载失败执行覆盖正则查询的回归测试重点验证含|交替模式的match谓词结果观察CHECKSUM_DOESNT_MATCH日志是否消失在测试环境用损坏压缩块验证 T64 解压不再崩溃仅限受控环境。相关资源本文依据的完整变更日志docs/changelogs/archive/v23.8.6.16-lts.mdT64 编解码器实现src/Compression/CompressionCodecT64.cppmatch函数注册与实现src/Functions/match.cpp、src/Functions/MatchImpl.hMergeTree 校验逻辑src/Storages/MergeTree/MergeTreeDataPartChecksum.cpp、src/Storages/MergeTree/DataPartsExchange.cpp更多历史版本变更日志见 docs/changelogs/archive。总结v23.8.6.16-lts 是一次小而精的 LTS 补丁发布5 个修复全部指向真实故障场景其中 T64 溢出修复具有安全属性。理解每个修复背后的机制backport 流程、checksum 校验、RE2 索引下推、启动加载、Keeper 信号处理、T64 位矩阵编解码能帮助你在升级时做出更准确的判断并在生产环境出现相关症状时快速定位问题。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →