
ClickHouse v20.8.6.6-lts 版本发布详解7 项 Bug 修复全解析与源码级验证【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHousev20.8.6.6-lts 是 ClickHouse® 20.8 LTS 系列的一个补丁版本Patch Release相对上一版本 v20.8.5.45-lts 只包含 Bug Fix 类别更新。它针对 MySQL 数据库引擎可用性、分布式表 DROP 竞态、复制队列大条目处理、AVRO 类型解析、MaterializeMySQL 元数据膨胀以及查询剖析器罕见崩溃等真实生产问题给出了修复。阅读本文后你将能逐一理解每个修复的背景原因、影响面、验证方法并在当前仓库源码中定位到对应实现为自己的生产环境升级与排障提供依据。版本定位20.8 LTS 补丁分支的修复节奏ClickHouse 版本号采用主版本.次版本.补丁版本-构建号-渠道的结构。v20.8.6.6-lts表示 20.8 系列的第 6 个补丁版本、构建号为 6渠道为lts长期支持。该文件位于仓库 docs/changelogs/archive/v20.8.6.6-lts.md属历史归档 changelog与 docs/changelogs 目录下仍在持续更新的 v24.x、v25.x、v26.x 等版本记录共同构成完整的版本演进史。本版本的变更主体只有一个Bug Fix分类共 7 项修复。每项修复都带有被回溯Backport的源 Issue/PR 编号便于跨版本追踪修复来源。逐一来看修复主题回溯源 Issue修复 PR主要作者MySQL 数据库引擎宕机导致无关查询报错#16494#16032Kruglov Pavel过滤集合未创建导致部分返回数据被丢弃#16816#16308Nikita Mikhaylov复制队列中超大条目近 1MB 结构处理失败#16506#16332Alexey MilovidovDistributed 表 DROP 与 INSERT 竞态#16472#16409Azat KhuzhinMaterializeMySQL 元数据快速增长#16573#16504TCeasonAVRO 输入解析 LowCardinality 类型问题#16552#16521Mike Kot查询剖析器在旧 glibc 下罕见静默崩溃#16823#16613Nikita Mikhaylov修复一MySQL 数据库引擎宕机时无关查询不再被误伤问题现象MySQL 引擎数据库ENGINE MySQL(...)将远程 MySQL 实例暴露为 ClickHouse 中的数据库。此前当远程 MySQL 服务器不可用时本应只针对本地 MergeTree 表的查询如SELECT ... FROM system.parts也会抛出异常原因是查询处理过程中会尝试从已停机的 MySQL 服务器拉取表列表而这种拉取对这类查询其实毫无必要。源码验证该引擎实现位于 src/Databases/MySQL/DatabaseMySQL.h 与 src/Databases/MySQL/DatabaseMySQL.cpp。从类注释可以确认其设计定位“Real-time access to table list and table structure from remote MySQL. It doesnt make any manipulations with filesystem.”DatabaseMySQL继承自DatabaseWithAltersOnDiskBase通过mysqlxx::PoolWithFailover维护到远程 MySQL 的连接池用local_tables_cache缓存远端表结构与修改时间。这意味着它天然是每次访问都实时触达远端的数据库只要查询流程触发了getTablesIterator/isTableExist/tryGetTable等接口就可能产生对远端 MySQL 的连接尝试。修复思路修复的关键是让查询计划不再对 MySQL 引擎库做无谓的表探测像system.parts这类只关心 MergeTree 表的元数据查询应完全跳过 MySQL 引擎数据库。仓库中对应逻辑同样可以在 src/Databases/MySQL/DatabaseMySQL.cpp 的empty()、getTablesIterator等接口中看到对远端连接的容错处理。对用户的启示如果生产环境混合部署了 MySQL 引擎库与本地 MergeTree 表升级到包含此修复的版本后MySQL 后端宕机不再会让系统级查询如监控system.parts、system.tables的巡检脚本整体失败该修复通过system.parts示例明确限定影响面不接触 MySQL 引擎库的查询不应受其可用性影响。修复二修复过滤集合未创建导致返回数据被丢弃的不一致行为本项修复针对一个数据完整性问题在特定执行路径下用于过滤数据的集合Set通常由IN子查询构建未被创建导致结果集中一部分本应返回的数据被静默丢弃造成查询结果不一致。从仓库当前的 src/Interpreters 与 src/Processors 的架构看ClickHouse 的查询流水线会把IN子查询物化为内存中的 Set再交给下游 Processor 做过滤。如果物化失败或提前短路过滤步骤便失去了正确的过滤依据这正是 changelog 中 the set for its filtration wasnt created 描述的根因场景。此修复保证过滤集合的创建与过滤执行严格配对杜绝部分数据被静默丢弃。修复三复制队列支持近 1MB 的超大 ALTER 条目问题现象在 Replicated 表上执行 ALTER 时操作会以队列条目的形式写入 ZooKeeper 的复制队列。当表结构极其庞大接近 1MB时对应 ALTER 队列条目也会非常大旧实现无法正确处理这种超大条目见 Issue #16307。源码验证复制队列的核心实现在 src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp 与 src/Storages/MergeTree/ReplicatedMergeTreeQueue.h。该模块负责在 ZooKeeper 与本地执行之间协调每个副本监听队列从 ZooKeeper 读取log节点下的事件并逐一执行。当队列条目体积接近 ZooKeeper 单节点数据上限时读取与解析逻辑就需要特殊处理否则会导致 ALTER 在副本上无法正确推进。修复思路修复后复制队列可以正确处理大体积条目超大表结构的 ALTER 也能在副本间正常同步。对于一个表几百上千列、ALTER 携带大量列变更的极端场景此修复消除了复制停滞的隐患。修复四Distributed 表 DROP TABLE 与 INSERT 的竞态问题现象StorageDistributedsrc/Storages/StorageDistributed.h表是分布式写入的入口插入数据会先在本地暂存再异步分发到远端分片。此前若在插入进行的同时执行DROP TABLE两者存在竞态racy with INSERTDROP 过程中可能仍有写入线程在向即将销毁的对象提交数据导致崩溃或数据丢失。相关实现与写入侧相关的还有 src/Storages/Distributed/DistributedSink.h负责接收写入并将其放入异步队列与 src/Storages/Distributed/DistributedAsyncInsertDirectoryQueue.h负责扫描本地暂存目录并分发。竞态修复需要确保 DROP 与这些写入路径之间正确的生命周期同步。对用户的启示频繁重建分布式表例如批量导数据场景下先DROP TABLE再CREATE TABLE的环境应优先升级以消除偶发的崩溃风险。修复五MaterializeMySQL 在 MySQL 主从并行复制下元数据快速增长问题现象MaterializeMySQL原 MaterializedMySQL引擎将 MySQL 的 binlog 实时同步为 ClickHouse 中的数据库。当链路为MySQL Master → MySQL Slave → ClickHouse MaterializeMySQL且 MySQL Slave 开启了slave_parallel_worker并行复制时旧实现无法正确收缩 GTID 集合导致 ClickHouse 侧维护的元数据随复制推进持续膨胀最终可能耗尽内存或拖慢同步见 Issue #15951。修复思路修复通过正确收缩 GTID 集合让已消费的 GTID 能被及时回收元数据不再无限增长。对使用 MaterializeMySQL 做实时同步的生产环境这是防止长期运行后内存与磁盘水位异常抬升的关键补丁。修复六AVRO 输入解析时移除 LowCardinality 包装问题现象从 AVRO 格式读取数据时若目标类型声明为LowCardinality(...)解析流程存在类型处理问题见 Issue #16188。源码验证LowCardinality是 ClickHouse 的字典编码类型实现位于 src/DataTypes/DataTypeLowCardinality.cpp。AVRO 格式的读写逻辑位于 src/Formats/FormatFactory.cpp 所注册的格式列表中。修复后从 AVRO 输入解析时会将LowCardinality从其类型包装中移除按底层实际类型进行解析避免类型层与格式层解析逻辑不一致导致的数据读取异常。对用户的启示通过 AVRO 协议如 Kafka Connect、HDFS 等生态摄取数据且 schema 中带有LowCardinality列的用户升级后读取行为将恢复正常。修复七查询剖析器在异常 glibc 异步展开表下罕见静默崩溃问题现象查询剖析器Query Profiler开启时ClickHouse 需要周期性采集各线程的堆栈。某些操作系统发行版自带的 glibc 对部分函数存在推测损坏的异步展开表asynchronous unwind tables导致采样过程偶发静默崩溃见 Issue #15301 与 #13098。源码验证查询剖析器实现在 src/Common/QueryProfiler.cpp 与 src/Common/QueryProfiler.h其通过定时信号signal handler中断线程并回溯调用栈来统计热点。当回溯过程命中 glibc 中损坏的展开表时就可能发生崩溃。修复思路修复让采样回溯过程对异常的展开表数据具备容错能力避免在异常栈帧上直接崩溃。对于开启query_profiler或trace_log相关配置的在线服务尤其是运行在较老 glibc 发行版上的实例此修复直接消除了这一类偶发崩溃。升级与验证建议确认渠道-lts后缀适用于追求稳定、以修复为主的部署20.8 系列仅建议为修复特定问题而升级新功能请关注后续 stable 版本。优先升级场景MySQL 引擎库 本地表混合部署、大量IN子查询、超大表结构 ALTER、分布式表频繁重建、MaterializeMySQL 长期同步、AVRO 含LowCardinality列、开启查询剖析器的实例——以上场景至少命中其一就应评估升级。回归验证升级后在预发环境重点回归SELECT ... FROM system.partsMySQL 后端离线时、AVRO 导入、DROP TABLE期间并发 INSERT 等操作对照本文的 7 项修复逐一确认无回归。延伸阅读完整变更记录docs/changelogs/archive/v20.8.6.6-lts.md最新版本历史docs/changelogs项目根 READMEREADME.md涉及的核心源码MySQL 引擎 src/Databases/MySQL/DatabaseMySQL.cpp、复制队列 src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp、分布式表 src/Storages/StorageDistributed.h、查询剖析器 src/Common/QueryProfiler.cpp、LowCardinality 类型 src/DataTypes/DataTypeLowCardinality.cpp【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考