ClickHouse v22.8.1.2097-lts 变更日志解读:从 SLRU 缓存、并行分布式插入到轻量级删除的实现全景 ClickHouse v22.8.1.2097-lts 变更日志解读从 SLRU 缓存、并行分布式插入到轻量级删除的实现全景【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇基于 ClickHouse 官方变更日志 v22.8.1.2097-lts系统梳理该 LTS长期支持版本相对上一基线 v22.7.1.2484-stable 的全部变更向后不兼容变更、新特性、性能优化、常规改进、Bug 修复与构建变化并结合当前仓库源码印证其中关键特性的实现机制帮助 DBA 与开发者在升级或选型时准确评估影响面与收益点。版本定位与基线信息该版本由提交9a2ff88435构建文档中标注 FIXME对比基线为 v22.7.1.2484-stable提交f4f05ec786a。变更日志按 ClickHouse 的标准分类组织为如下小节分类内容概要Backward Incompatible Change可组合缓存filesystem cache重构、remote_url_allow_hosts覆盖面扩大、Date32/DateTime64 取值范围扩展New Featureexact_rows_before_limit、SLRU 缓存策略、DeflateQpl 压缩编解码器、线程软限制、并行分布式 insert select、文本格式 schema 推断设置、JSON 日志、nowInBlock、X-ClickHouse-Summary、Ordinary转Atomic数据库等Performance ImprovementDISTINCT 与 ORDER BY 协同优化、AVX512 指令优化、AST 遍历剪枝等Improvement标准DELETE FROM语法、timeSlots支持 DateTime64、schema 推断缓存、fsync 事件计数、system.backups表重构等Bug Fix / Bug Fix (user-visible)涵盖排序、投影、JOIN、复制、磁盘 IO 等多类缺陷修复Build / Testing / Packaging预构建二进制要求 AVX 支持、RISC-V 64 进 CI、s390x 字节序修复等向后不兼容变更升级必读这一节是升级评估的核心。v22.8.1.2097-lts 共包含三项向后不兼容变更1. 文件系统缓存cache disk可组合化变更日志原文要点缓存现在可以叠加在任意磁盘之上包括 Azure Blob 存储磁盘、Local 磁盘、StaticWeb 磁盘等旧缓存配置在新版本中依然可用服务可以正常启动旧的缓存文件也会继续被使用但要让缓存按新语义工作需要更新配置文件。该变更关闭了 issue #36140 与 #37889对应 PR #36171作者 Kseniia Sumarokova。其动机是让缓存层与存储介质解耦之前缓存必须独占一种disk类型重构后任何磁盘都可以作为缓存的下层介质从而在对象存储场景中获得一层本地块缓存。当前仓库中 FileCache 实现 与 文件缓存设置 仍保留了这一层抽象并且本版本同时引入了两个新的系统指标FilesystemCacheSize与FilesystemCacheElementsPR #40260便于通过system.metrics监控缓存占用与对象数量。2.remote_url_allow_hosts覆盖全部字典来源此前该安全设置只作用于 HTTP、Cassandra、Redis 三类字典来源本版本扩展到 ClickHouse、MongoDB、MySQL、PostgreSQL 来源的字典PR #39184作者 Nikolai Kochetov。需要注意两点限制只有通过 DDLCREATE DICTIONARY创建的字典会检查主机白名单如果你的字典配置了不在白名单中的主机升级后这些字典将拒绝加载。3. Date32 与 DateTime64 取值范围扩展到 1900–2299 年此前两个类型实际支持 1925–2283 年本版本扩展为 1900–2299 年PR #39425作者 Roman Vasin关闭 issue #28216。实现采用 proleptic Gregorian calendar延展格里高利历符合 ISO 8601:2004 条款 3.2.1不处理历史上儒略历到格里高利历的切换。对超范围入参的实现相关行为也随之改变例如旧版本中1899-01-01会被钳制clamp为1925-01-01新版本会被钳制为1900-01-01使用toStartOfInterval配合INTERVAL 3 QUARTER时由于区间从实现相关的起点计算舍入结果可能与旧版本相差至多一个季度。如果你的业务逻辑隐式依赖旧的钳制边界或季度舍入行为升级前需要对涉及超范围日期的查询做回归验证。新特性详解SLRU 缓存策略本版本为非压缩数据缓存uncompressed cache与 marks 缓存引入 SLRUSegmented LRU策略PR #34651。SLRU 的核心思想是把缓存划分为保护区与非保护区只被访问过一次且长期未再使用的条目会优先被淘汰而多次命中的热数据在顺序扫描冲击下不会被轻易挤出。从当前仓库源码可以印证这一机制SLRUCachePolicy.h 中的注释明确写道——SLRU evicts entries which were used only once and are not used for a long time, this policy protects entries which were used more than once from a sequential scan构造函数接受size_ratio参数max_protected_size 0时默认保护区大小取总容量的一半。该策略通过 CacheBase.h 提供线程安全封装供 marks 缓存等场景复用。对于有大量顺序扫描型查询混入点查场景的集群启用 SLRU 通常能显著提升热数据的缓存命中率。DeflateQpl 压缩编解码器Intel IAA 硬件加速面向 Intel Xeon Scalable Sapphire Rapids 平台新增DeflateQpl压缩编解码器PR #36654、#39494利用 Intel In-Memory Analytics AcceleratorIAA硬件加速器执行 DEFLATE 压缩/解压底层通过 Intel QPL 库抽象硬件访问硬件不可用时自动回退到软件实现。DEFLATE 相比 ClickHouse 默认的 LZ4 压缩率更高因此可以换取更少的磁盘 IO 与更低的内存占用适合存算分离或带宽受限场景中的冷数据表。注意当时该编解码器被标记为实验性质见 NO CL ENTRY 中的 Mark new codec DEFLATE_QPL as experimental生产使用前需要评估兼容性。线程并发控制concurrent_threads_soft_limit为应对高 RPS每秒请求数场景下大量小查询同时创建线程导致的调度开销本版本引入concurrent_threads_soft_limit配置参数PR #37285、#37558用于限制所有查询合计并发创建的线程总数属于服务器级并发控制手段。当前仓库中该设置定义于 ServerSettings.cpp由全局上下文统一执行。它与按单查询生效的max_threads形成两级控制后者限制单条查询并行度前者为集群整体线程池规模兜底避免高并发下 CPU 过度超卖与上下文切换开销。并行分布式 insert select支持向 Distributed 与 Replicated 引擎表执行并行的INSERT ... SELECTPR #39107关闭 issue #34670。在此之前Distributed 表的多副本写入只能串行等待各分片/副本完成大表导入时吞吐受限支持并行后各目标可并发接收数据显著缩短导入窗口。文本格式 schema 推断系列设置围绕从无 schema 数据源推断表结构这一能力本版本密集落地了四项设置PR #39186、#40068作者 Kruglov Pavel设置作用input_format_try_infer_dates尝试从字符串推断 Date 类型input_format_try_infer_datetimes尝试从字符串推断 DateTime 类型input_format_try_infer_integers优先推断 Int64 而非 Float64input_format_json_try_infer_numbers_from_stringsJSON 格式中尝试从字符串推断数值schema_inference_hints为指定列显式给出结构提示覆盖自动推断结果配套地file()/s3()/hdfs()/url()表函数引入了schema 推断缓存PR #38286同一文件的首次查询完成推断后后续查询直接复用缓存的 schema数据未变化时并新增系统表system.schema_inference_cache查看缓存内容以及SYSTEM DROP SCHEMA CACHE [FOR FILE/S3/HDFS/URL]语句手动失效缓存。这对频繁查询同一远端大文件的场景减少了重复采样开销。其他值得注意的新特性exact_rows_before_limit0/1PR #25333关闭 issue #6613开启后rows_before_limit_at_least统计量返回精确值代价是必须完整读取 limit 之前的数据会牺牲查询速度。适合需要对被 LIMIT 截断了多少行做精确审计的场景。当前仓库中该设置仍定义于 Settings.cpp并被 QueryPlan 优化如 limitPushDown.cpp作为优化开关引用。nowInBlock([timezone])函数PR #39533关闭 issue #39522返回每个数据块处理时刻的当前时间与now()查询级常量、会被常量折叠不同适合长时间运行的INSERT SELECT中生成贴近真实的写入时间。源码 nowInBlock.cpp 中注释直接点明 In contrast to now function, its not a constant expression and is not a subject of constant folding且isDeterministicInScopeOfQuery()返回 false。官方文档注明不存在now64InBlock与todayInBlock变体。函数文档中给出的示例SELECT now(), nowInBlock(), sleep(1) FROM numbers(3) SETTINGS max_block_size 1 FORMAT PrettyCompactMonoBlock -- now() 三行相同查询开始时刻常量nowInBlock() 随块递增X-ClickHouse-Summary响应头PR #39567HTTP 接口在查询完成后返回的进度报告中新增result_rows与result_bytes字段当前实现位于 WriteBufferFromHTTPServerResponse.cpp便于网关层无需解析结果即可统计真实产出规模。executable()表函数支持设置PR #39681可以为外部可执行程序管道指定 settings 列表控制查询执行行为。Ordinary数据库自动转换为AtomicPR #39933解决 issue #39546在数据目录的flags目录中创建空文件convert_ordinary_to_atomic下次服务启动时所有 Ordinary 数据库自动迁移为 Atomic 引擎。当前仓库中该标志文件的识别逻辑位于 loadMetadata.cppconvert_ordinary_to_atomic关键字可在该文件及 Context.cpp 中检索到。JSON 格式控制台日志输出PR #39277便于日志分析工具直接摄取与查询。file(path[, default])表函数第二参数PR #39218文件不存在时返回默认值而非报错。性能改进本版本性能类改动集中在排序/去重路径与 SIMD 优化DISTINCT 与 ORDER BY 协同优化PR #39432、#39528、#39538作者 Igor Nikonov当 DISTINCT 列与 ORDER BY 列匹配或构成其前缀时DistinctSortedTransform可利用输入流已有序的特性显著降低内存占用并缩短执行时间此前该 Transform 实际退化为普通 DISTINCT 实现未利用排序并修复了仅当排序描述可应用于 DISTINCT 列时才启用优化的判断逻辑减少执行期检查。基于输入流排序描述跳过排序PR #38719若输入流已满足排序描述则直接跳过排序步骤。AVX512 指令优化ColumnVector 过滤使用 AVX512VBMI2 compress storePR #39633bytes-to-bits 掩码转换的 SSE/AVX/AVX512 路径优化PR #39586针对 AVX512 VBMI2 平台SSB 基准查询 3.1/3.2/3.3SF100性能提升约 6%PR #40033测试环境为双路 Icelake Xeon 8380。其他cluster等表函数取远端表结构时优先使用本地节点PR #39440未注册任何 UDF 时跳过 AST 的 UDF 遍历PR #40069CurrentMemoryTracker分配/释放路径优化PR #40078修复复杂查询 analyze 卡死PR #38185。常规改进要点标准DELETE FROM语法支持PR #37893MergeTree 系表支持 SQL 标准DELETE FROM table WHERE ...写法底层即轻量级删除lightweight delete实现不再要求必须使用ALTER TABLE ... DELETE。timeSlots支持 DateTime64PR #37951亚秒级 duration 与 slot 尺寸在 DateTime64 上可用。system.backups表重构PR #39503移除internal列允许用户指定操作 ID新增num_files、uncompressed_size、compressed_size、start_time、end_time列。fsync Profile EventsPR #39179新增 fsync 相关计数方便定位持久化瓶颈。clickhouse-obfuscator新增--save/--load参数PR #39541可保存与复用预训练混淆模型便于压测生成与源分布一致的合成数据。Keeper 相关退出时创建快照由配置keeper_server.create_snapshot_on_exit控制默认truePR #39755Keeper 集群发现功能新增观察者模式PR #40035节点自身不属于集群。溢出监控计数PR #40205新增OverflowBreak/OverflowThrow两类 ProfileEvent用于区分因read_overflow_mode break等限制如max_rows_to_read产生的不完整结果。客户端显示服务端耗时PR #39968clickhouse-client与clickhouse-benchmark默认展示 server-side elapsed time用于公平比较跨数据中心/云上的服务性能clickhouse-benchmark可通过--client-side-time关闭--randomize改为无参开关形式PR #40193。时区数据更新至 tzdata 2022bPR #40184智利 2022 年夏令时开始日期从 9 月 4 日推迟到 9 月 11 日伊朗计划于 2022-09-21 回落后永久停止夏令时并修正了 Asia/Tehran 1977 年前后的历史数据。Arrow 支持 LARGE_BINARY/LARGE_STRINGPR #40293。新增多个 Pretty 输出变体格式PrettyMonoBlock、PrettyCompactNoEscapes等PR #39646用于测试与调试输出。关键 Bug 修复面向用户的修复变更日志中 Bug Fix (user-visible misbehavior in official stable release) 一节的代表性修复包括ORDER BY WITH FILL 在不同日期/时间类型组合下查询挂起PR #37849ORDER BY 匹配 projection 的 ORDER BY 时未排序即直接返回PR #38725GROUP BY 中函数与表列/表达式重名时的错误优化PR #39103列裁剪优化中的位置参数错误PR #39293——可能直接导致读错列属高危修复Replicated数据库下CREATE/DROP INDEX ... ON CLUSTER曾在所有副本执行导致 DDL 队列卡死已修复PR #39565local_filesystem_read_method pread_threadpool在 Linux 5.9/5.10 内核上的CANNOT_READ_ALL_DATA异常PR #39800及配合O_DIRECTmin_bytes_to_use_direct_io时的竞态PR #39506mmap IO 缓存 Ordinary 数据库下删除后重建同名表可能读到旧数据PR #39708——这是又一处推动用户迁移到 Atomic 数据库的修复指数衰减窗口函数衰变原点错误PR #39593由exp((t - curr_row_t) / decay_length)修正为以窗口末行为原点exp((t - last_row_t) / decay_length)对ROWS BETWEEN ... AND CURRENT ROW形式结果不变加密磁盘读取 seek 修复PR #39687、HashMethodOneNumber常量列取错 keyPR #40020、多列ENGINE Set表IN操作列顺序错误PR #40225等。另有常规 Bug Fix 若干Hadoop secure RPCprivacy/integrity 模式支持PR #39411、JOIN 计划中重复列问题终于解决PR #40009关闭长期 issue #26809。构建、测试与打包预构建 x86 二进制开始要求 AVX 指令集PR #39000即要求 CPU 不低于 2011 年的 Intel Sandy Bridge / AMD Bulldozer。这是该版本对部署环境最直接的硬件门槛变化老旧 CPU 只能选择自行编译带ENABLE_AVXOFF等选项或使用更早版本。移除将 ClickHouse 工具构建为独立可执行文件的选项PR #39520RISC-V 64 构建接入 CIPR #40197并持续修复 s390x 的字节序问题BitHelpers、SipHash、Coordination 快照、Codec、BigEndian 读写辅助等PR #39656/#39732/#39931/#40008/#40179clang-16 构建支持PR #40181TSAN 因 clang-14 问题临时改用 clang-13 构建PR #39450修复 systemd service 文件在/etc下的残留清理PR #39323修复 macOS 构建中__kevp__保留标识符告警PR #39493。升级建议与影响面小结结合以上变更从源码结构与变更日志可以归纳出该 LTS 版本的三条升级主线存储层filesystem cache 可组合化 SLRU 策略 缓存监控指标对象存储前置缓存场景需要按新方式配置disk typecache或对应磁盘类型同时两处读取路径修复mmap 缓存读旧表数据、Ordinary引擎缺陷进一步佐证了迁移 Atomic 数据库的必要性可借助convert_ordinary_to_atomic标志文件在下次启动时自动完成转换。资源治理concurrent_threads_soft_limit提供全局线程软上限配合既有的max_threads、max_concurrent_queries可构建更完整的容量模型OverflowBreak/OverflowThrow计数让限流截断结果可观测。数据工程并行分布式INSERT SELECT、标准DELETE FROM语法、schema 推断缓存与 hints 设置降低了大表导入、在线修正和异构数据源接入的工程成本。需要注意的是remote_url_allow_hosts的扩大覆盖与 Date32/DateTime64 边界钳制行为变化属于语义层面的不兼容建议升级前用生产只读副本回放关键查询验证同时确认部署机器的 CPU 满足 AVX 要求再制定滚动升级计划。完整的逐条 PR 清单可查阅 原始变更日志其中 NO CL ENTRY 与 NOT FOR CHANGELOG / INSIGNIFICANT 两节收录了不计入对外变更日志的内部提交包含数次 revert 与恢复操作可作为版本稳定性回溯的原始材料。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考