ClickHouse v21.3.2.5-LTS 版本全解析:新特性、性能优化与关键修复
ClickHouse v21.3.2.5-LTS 版本全解析新特性、性能优化与关键修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 docs/changelogs/archive/v21.3.2.5-lts.md 的官方变更记录逐节解读 ClickHouse v21.3.2.5-lts 这一长期支持LTS版本中的新增功能、性能改进、行为变更与关键 Bug 修复并结合当前仓库源码定位对应的实现文件。无论你是负责升级的运维工程师还是关注新函数与新设置的开发者本文都能帮你快速判断该版本的能力边界与升级注意事项。版本定位与对比基线v21.3.2.5-lts 的变更记录明确标注了对比基线为 v21.2.1.5869-prestable即该版本是在 21.2 预发布版基础上修复问题、收敛能力后固化下来的 LTS 版本。变更内容按标准分类组织向后不兼容变更、新特性、性能改进、改进、Bug 修复、构建/测试/打包改进、实验特性以及无变更记录NO CL ENTRY和无关紧要的内部改动。理解该版本的要点在于LTS 意味着稳定性优先因此本文特别强调了其中两条“向后不兼容”变更和一条“实验特性”限制升级前务必评估。向后不兼容变更升级前必须了解的两点该版本包含两条明确的不兼容变更查询分析阶段统一将大小写不敏感的函数名转为小写PR #20174。这是为了支持投影projection查询路由而引入的规范化行为意味着依赖函数名大小写做区分例如在配置或自定义逻辑中拼写NOW()与now()为不同函数的场景需要适配。禁止使用旧语法创建带表级 TTL 的 MergeTree 表PR #20282。旧语法中表级 TTL 会被静默忽略容易造成数据清理策略失效新版本直接拒绝创建但ATTACH旧表仍然允许保证存量数据可正常挂载。新特性详解实验性 Replicated 数据库引擎新增实验性的Replicated数据库引擎PR #16193可在多个主机之间复制 DDL 查询。它改变了数据库层而非表引擎层的复制模型适合需要在集群内统一分发建库、建表等 DDL 操作的场景。作为实验特性使用时需关注其稳定性边界。分布式查询去重随 PR #17348 引入的分布式查询去重是对 issue #16033 的跟进并部分解决了 issue #13574 提出的分布式执行下重复读取问题。这有助于降低分布式查询在异常重试场景下的重复计算开销。新函数与新聚合file()函数PR #19204将文件内容读取为String关闭 issue #18851。实现位于 src/Functions/FunctionFile.cpp。timezoneOffset(datetime)PR #19962返回指定时刻相对 UTC 的偏移秒数Int32自动考虑夏令时与历史时区变更关闭 issue #19850。其实现注册于 src/Functions/timezoneOffset.cpp源码示例SELECT toDateTime(2021-04-21 10:20:30, America/New_York) AS Time, toTypeName(Time) AS Type, timezoneOffset(Time) AS Offset_in_seconds, (Offset_in_seconds / 3600) AS Offset_in_hours; -- ┌────────────────Time─┬─Type─────────────────────────┬─Offset_in_seconds─┬─Offset_in_hours─┐ -- │ 2021-04-21 10:20:30 │ DateTime(America/New_York) │ -14400 │ -4 │ -- └─────────────────────┴──────────────────────────────┴───────────────────┴─────────────────┘聚合函数deltaSumPR #20057累加相邻行之间的差值可用于计算单调递增序列的净增量。实现位于 src/AggregateFunctions/AggregateFunctionDeltaSum.cpp其核心状态包含first、last、sum与是否已见首行的seen标志add阶段仅在last value且已见前序值时累加差值。reinterpretAs支持大整数PR #19858修复 issue #19691 后reinterpretAs(x, Type)可作用于大整数类型随后在 PR #20611 中该函数更名为reinterpret(x, Type)。HTML 粗解析函数htmlOrxmlCoarseParsePR #19600 为提取文本增加了htmlOrxmlCoarseParse支持script、style块解析、![CDATA[]]解析、空白折叠以及任意content格式并在单次遍历内完成底层使用 HyperScan 支持 SIMD 加速。该版本同时重写了相关实现见 src/Functions/extractTextFromHTML.cpp。表级查询并发控制MergeTree* 家族表新增两个表级设置PR #19544max_concurrent_queries限制与该表相关的并发执行查询数量min_marks_to_honor_max_concurrent_queries仅当查询至少读取该数量的 mark 时才应用上一设置。设置定义可见 src/Storages/MergeTree/MergeTreeSettings.cpp执行期接入可参考 src/Interpreters/ProcessList.cpp。配额类型与分布式写入控制新增配额类型QUERY_SELECTS与QUERY_INSERTSPR #19603可将 SELECT 与 INSERT 分开计量。新增设置insert_shard_idPR #19961支持从分布式表将数据插入到指定分片实现定义于 src/Core/Settings.cpp分布式写入链路涉及 src/Storages/StorageDistributed.cpp 与 src/Storages/Distributed/DistributedSink.cpp。其他新增能力DiskS3 元数据备份/恢复PR #18377支持对 S3 磁盘的元数据文件进行备份与恢复。S3 服务端加密客户密钥PR #19748支持x-amz-server-side-encryption-customer-(key/md5)请求头。system.part_log新增event_time_microseconds列PR #20027。插入时的非活跃分片保护PR #20178新增两个设置在非活跃分片过多、服务端清理不及时时可选择延迟或抛错。File 引擎新设置PR #20620engine_file_empty_if_not_exists与engine_file_truncate_on_insert实现于 src/Storages/StorageFile.cpp。ExecutableDictionarySource 的implicit_key选项PR #19677修复 issue #14527使可执行字典源支持隐式键。性能改进要点SELECT ... FINAL并行化PR #19375在do_not_merge_across_partitions_select_final 1时对 level0 的单个分区可并行执行 final 合并。HTTP 服务器减少数据拷贝PR #19516部分重写 HTTP 服务器插入长记录场景下性能最高提升约 1.5 倍。聚合更严格的内存别名aliasingPR #19946与多固定大小键的 GROUP BY 优化PR #20472。Memory 表支持压缩PR #20168新增compress设置启用后可降低内存占用同时修复 INSERT SELECT 过度合并块的问题PR #20169。注意注释中明确指出 Memory 表相比 MergeTree 可能更慢的三点原因缺乏压缩、块大小固定、缺乏索引与 PREWHERE。分布式聚合默认开启内存高效模式PR #20599distributed_aggregation_memory_efficient默认启用降低内存占用并提升分布式查询性能。修复 DataType 解析器指数级复杂度PR #20132由 fuzzer 发现以及intDiv/modulo向量常量特化回退PR #21307。若干关于聚合与 GROUP BY 的小幅优化PR #20454、#20468、#20978。改进Improvement精选Hedged Requests 远程查询PR #19291默认启用use_hedged_requests允许为一次查询与不同副本建立多个连接当现有连接在hedged_connection_timeout内未建立、或receive_data_timeout内未收到数据时发起新连接并使用首个发送非空进度包或数据包若启用allow_changing_replica_until_first_data_packet的连接其余连接取消。支持max_parallel_replicas 1的查询。相关实现位于 src/Client/HedgedConnections.cpp 与 src/Client/HedgedConnectionsFactory.cpp。行级安全表达式支持PREWHEREPR #19576。Distributed 表插入限流PR #19673为 Distributed 引擎新增bytes_to_delay_insert/max_delay_to_insert/bytes_to_throw_insert设置基于待发送字节数对异步插入进行限流。JSONExtract到Float32的宽松转换PR #19960例如 JSON 中0.1为双精度、无法精确表示为 Float32 时不再返回 0/NULL而是允许非精确转换修复 issue #13962 引发的用户困惑。配额计算修正PR #20106SHOW TABLES 按一条查询计费SYSTEM 查询开始消耗配额修正配额区间结束时间的计算。SYSTEM FLUSH DISTRIBUTED无锁化PR #20215与不匹配结构的 INSERT 转换PR #19947。MySQL 复制源优化PR #20632、#21237随机化同优先级副本列表实现轮询并对 SSL/TLS 连接下偶发的 “Lost connection to MySQL server” 重试。DateTime64解析与钳位对齐PR #20131、#21053识别以缩放整数形式给出的亚秒级 unix 时间戳如1111111111222并让 DateTime64 钳位行为与 DateTime 一致。DDL 队列并发安全PR #20448修复分布式 DDL 任务执行与队列清理之间的竞态有活跃 worker 时不允许从 ZooKeeper 移除 DDL 任务。其他细节access_management可通过CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT环境变量在启动时配置默认关闭PR #20139字典缓存改用 LRUHashMap 作为底层索引PR #20164位图函数支持所有原生整数类型PR #20171avg内算术表达式代数优化PR #20183禁止删除被物化视图引用的列PR #21303Protobuf 格式序列化改进PR #20506。关键 Bug 修复该版本修复了大量稳定性问题值得关注的几类崩溃类BloomFilter 索引崩溃PR #19884、if函数返回复杂 Tuple 导致的服务崩溃PR #20133、join_use_nulls1时空指针与LOGICAL_ERRORPR #20344、#20461、HTTP 客户端断开导致的异常终止PR #20464、#20981、分布式查询失败时的 SIGSEGVPR #21434、async INSERT 目录名解析导致的 SIGSEGVPR #20498、EXPLAIN UNION 崩溃PR #21246。复制与 DDLON CLUSTER后台线程挂起PR #19684、ReplicatedMergeTree 后台任务过度重试PR #20335、ZooKeeper 冗余重连与双活动会话PR #21264、自定义 ZooKeeper 集群下删除表导致元数据泄漏PR #21119。查询正确性负小数取模结果类型不足PR #20067、transform浮点键失效PR #20479、CTE 用于 INSERT SELECT 的修复PR #20211、WITH别名传播到子查询时的死循环PR #20476、带 LIMIT 的 UNION DISTINCT 子查询PR #20610、toMinute特殊时区处理PR #20149。类型与格式不同小数位常量 Decimal 二元运算结果错误PR #20339、DateTime64越界格式化导致越界内存访问PR #21023、LowCardinality列从 VALUES 格式插入时的坏转换PR #21357、input_format_null_as_default对可空类型不生效PR #21121。管理行为force_drop_table对 MATERIALIZED VIEW 不生效PR #20626、仅支持特定引擎的 mutation 并给出清晰报错PR #21183、ALTER MODIFY COLUMN未正确影响分区键/跳过索引/TTLPR #21334。构建 / 测试 / 打包改进允许全局启用 AVX-2 构建PR #20180对现代 CPU 有少量性能收益但官方说明不推荐用于生产、暂不作为官方构建。集成测试中 Kafka 相关用例以日志事件等待取代大部分sleepPR #21111。允许在 gdb 下启动修改过的二进制PR #21258此前完整性校验会拒绝启动。修复 Kerberized HDFS 测试端口冲突PR #19974、修复 Coverity 发现的部分问题PR #20010。实验特性窗口函数重要限制该版本引入窗口函数的实验性支持PR #20337需设置allow_experimental_functions 1才能启用。官方明确说明这是alpha 质量、不适合生产使用的初步实现后续版本会以向后不兼容的方式变更。从仓库内部提交看同期仍在持续迭代 RANGE/ROWS 帧见 NOT FOR CHANGELOG 中的窗口函数相关提交并且在发布前关闭了 hedged requestsPR #21534见内部修复条目可见该版本对不稳定能力采取了保守策略。源码印证与延伸阅读变更记录原文docs/changelogs/archive/v21.3.2.5-lts.md新函数timezoneOffset注册与文档src/Functions/timezoneOffset.cppdeltaSum聚合实现src/AggregateFunctions/AggregateFunctionDeltaSum.cppHedged Requests 客户端实现src/Client/HedgedConnections.cpp、src/Client/HedgedConnectionsFactory.cpp表级并发控制设置src/Storages/MergeTree/MergeTreeSettings.cppFile 引擎新设置src/Storages/StorageFile.cpp各类设置的默认值与类型定义汇总于 src/Core/Settings.cpp说明文中所列 PR 编号均取自原变更记录便于在版本历史中追溯对应改动使用该版本前请结合自身部署环境评估两条不兼容变更与窗口函数实验特性的影响面。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考