十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

ClickHouse v26.1.1.912-stable 版本发布解读:从破坏性变更到并发调度与 JSON 能力升级

ClickHouse v26.1.1.912-stable 版本发布解读:从破坏性变更到并发调度与 JSON 能力升级 ClickHouse v26.1.1.912-stable 版本发布解读从破坏性变更到并发调度与 JSON 能力升级【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 官方发布说明 docs/changelogs/v26.1.1.912-stable.md 撰写系统梳理 v26.1.1.912-stable 版本的全部核心变更包括向后不兼容变更、新特性、实验特性、性能改进与 Bug 修复并结合仓库源码如 src/Core/Settings.cpp、src/Functions/FunctionReverseBySeparator.cpp、src/Coordination/FourLetterCommand.cpp进行底层原理印证。读完本文你将掌握该版本升级前必须评估的兼容性风险、可直接上手的新功能用法以及各模块性能优化与关键修复的全貌为制定升级与回归测试计划提供依据。版本概览与升级导读v26.1.1.912-stablecommit4c47e680f55与v26.1.1.1-new对比是 ClickHouse 2026 年 1 月发布的一个稳定版本。整个变更集覆盖 10 个分类、超过 100 项独立 PR核心主题可以概括为一批明确的破坏性变更移除两个硬件加速压缩编解码器、移除Lazy数据库引擎、joinGet权限收紧、JSON 类型序列化格式升级等升级前需要逐条评估。围绕并发与资源调度的新能力CPU 调度默认切换为抢占式、新增max_min_fair公平调度器、use_primary_key开关、max_insert_block_size_bytes精细控制。KeeperClickHouse 内置协调服务的大幅增强HTTP API 与嵌入式 Web UI、支持参数的四字母命令rcfg。大量围绕数据湖、JSON 类型、文本索引、JOIN 优化与稳定性的改进与修复。无论你是 DBA、平台工程师还是在使用 ClickHouse 的开发者这份解读都能帮助你快速定位与本集群相关的变更点。向后不兼容变更升级前必读该版本共有 16 项向后不兼容变更以下是需要重点关注的部分。1. 移除DEFLATE_QPL与ZSTD_QAT硬件加速编解码器变更内容列压缩编解码器DEFLATE_QPL和ZSTD_QAT被彻底移除PR #92150。这两个编解码器分别依赖 Intel QPL 与 Intel QAT 硬件加速。影响与操作升级前必须将使用这两个编解码器压缩的存量数据转换为其他编解码器例如ZSTD否则升级后数据将无法读取。背景知识这两个编解码器此前需要开启enable_deflate_qpl_codec与enable_zstd_qat_codec设置才能使用属于对特定硬件的可选优化官方出于维护成本决定移除。2. 移除Lazy数据库引擎Lazy数据库引擎被移除且不再可用PR #93627issue #91231。该引擎会在内存中仅保留最近访问的表元数据用于大量小表的场景。使用该引擎的库需要迁移到Ordinary/Atomic等引擎后升级。3. JSON 类型启用高级共享数据advanced shared data变更内容默认启用 JSON 类型的高级共享数据存储PR #92511。之后降级到 25.8 以下的版本将不再可能因为这些旧版本无法读取带 JSON 列的新数据 part。升级建议如需安全升级/回退官方建议设置compatibility为上一个版本或在 MergeTree 设置中显式指定dynamic_serialization_versionv2、object_serialization_versionv2。源码佐证JSON 类型的动态子列dynamic subcolumn机制在 v26.1 中进一步强化包括新增merge_max_dynamic_subcolumns_in_compact_part与max_dynamic_subcolumns_in_json_type_parsing两个限制子列数量的设置PR #94184说明该版本对 JSON 动态子列的序列化与内存控制投入很大。4.joinGet/joinGetOrNull强制要求SELECT权限从本版本起执行joinGet(db.table, column, key)需要用户对 Join 表的键列和被读取的属性列同时拥有SELECT权限否则查询失败并报ACCESS_DENIEDPR #94307。-- 表级授权 GRANT SELECT ON db.join_table TO user; -- 列级授权更精细 GRANT SELECT(key_col, attr_col) ON db.join_table TO user;所有依赖joinGet且之前未配置显式SELECT授权的应用都会受影响升级前应检查授权。5. 空列表的JOIN USING ()变为语法错误空列表的JOIN USING ()子句现在被视为语法错误PR #92371。此前它在执行期才报INVALID_JOIN_ON_EXPRESSION且与Join存储引擎组合时可能触发LOGICAL_ERRORissue #82502。这是把“运行期错误”提前到“解析期错误”的合理性收紧。6. CPU 调度默认改为抢占式cpu_slot_preemption服务器设置默认启用工作负载的 CPU 调度改为抢占式PR #94060。这意味着Workload机制下 CPU 槽位可以在查询之间更主动地重新分配避免长查询长期占满 CPU 资源。与此配套的还有新的公平调度器见下文新特性。7. 索引文件名转义索引文件名现在进行转义PR #94079。旧版本创建的名称中含非 ASCII 字符的索引将无法加载可通过 MergeTree 设置escape_index_filenames处理。8. 一批格式设置改为常规设置exact_rows_before_limit、rows_before_aggregation、cross_to_inner_join_rewrite、regexp_dict_allow_hyperscan、regexp_dict_flag_case_insensitive、regexp_dict_flag_dotall、dictionary_use_async_executor这 7 个设置从“格式设置”改为“常规设置”PR #94106。这是纯内部变更唯一可见影响是如果你曾在 Iceberg、DeltaLake、Kafka、S3、S3Queue、Azure、Hive、RabbitMQ、Set、FileLog、NATS 等表引擎定义中指定过这些设置此前会被静默忽略现在会直接报错需要从表定义中移除。9. 其他不兼容变更速览UDF 调试变更PR #92209system.query_log.exception现在默认捕获 UDF 的 stderr完整 Python traceback 会出现在查询日志中stderr 累积上限 1MB。简单ALIAS列的INSERT支持被回滚PR #92849revert #84154。数据湖目录无对象存储访问权限时新增抛错设置PR #93606。移除metric_log的transposed_with_wide_view模式PR #93867。SHOW COLUMNS权限检查修正PR #94556CREATE TABLE ... AS ...现在检查SHOW COLUMNS而非SHOW TABLES。JSON 类型中SKIP REGEXP默认改为部分匹配PR #92847issue #79250。新特性并发调度、Keeper、新函数与可观测性1.max_min_fair最大最小公平调度器新增max_min_fair并发调度器通过服务器设置concurrent_threads_scheduler启用PR #94732。在 src/Core/ServerSettings.cpp 中可以看到完整的三种取值定义取值行为round_robin每个开启use_concurrency_control1的查询最多分配max_threads个 CPU 槽位竞争时按轮询授予第一个槽位无条件授予可能在大量单线程查询时造成不公平fair_round_robin最多分配max_threads - 1个槽位单线程查询无需槽位避免不公平占满max_min_fair与fair_round_robin类似但释放的槽位总是授予当前已分配槽位最少的查询在高过订阅大量查询竞争有限 CPU 槽位下公平性更好短查询不会因长查询累计的槽位而受罚该调度器可在运行时热切换无需重启服务器。2. 抢占式 CPU 调度默认开启配合max_min_fair服务器设置cpu_slot_preemption使工作负载Workload的 CPU 调度默认为抢占式。与之相关的还有concurrent_threads_lazy_allocation默认true查询启动时只占 1 个 CPU 槽位只有当执行管线真正产生更多可并行工作时才向调度器申请额外槽位避免“预留了max_threads个槽位却只用一小部分”导致的资源饥饿。3. KeeperHTTP API、嵌入式 Web UI 与rcfg命令HTTP API 与嵌入式 Web UIPR #78181CH Keeper 现在可以通过 HTTP 接口访问并内置 Web UI便于运维管理。rcfg四字母命令PR #91354新增带参数的四字母命令rcfg用于在线修改集群配置能力比标准reconfigure请求更广。在 src/Coordination/FourLetterCommand.cpp 中可以看到supportArguments对rcfg返回true即该命令支持携带参数。协议格式为rcfg{json_string_length_big_endian}{json_string}典型命令示例{preconditions: {leaders: [1, 2], members: [1, 2, 3, 4, 5]}, actions: [ {transfer_leadership: [3]}, {remove_members: [1, 2]}, {set_priority: [{id: 4, priority: 100}, {id: 5, priority: 100}]}, {transfer_leadership: [4, 5]}, {set_priority: [{id: 3, priority: 0}]} ]}该 JSON 由preconditions前置条件例如当前 leader 与成员集合和actions动作序列如转移领导权、移除成员、设置优先级组成可实现复杂的条件化集群变更。其他 Keeper 增强新增KeeperChangelogWrittenBytes、KeeperChangelogFileSyncMicroseconds、KeeperSnapshotWrittenBytes、KeeperSnapshotFileSyncMicroseconds等 profile events以及KeeperBatchSizeElements、KeeperBatchSizeBytes直方图指标PR #92149CHECK_STAT与TRY_REMOVE扩展默认开启PR #93886检测到损坏的 snapshot 或 changelog 时改为抛异常而非自动清理PR #94168。4.reverseBySeparator字符串函数新增函数reverseBySeparator按指定分隔符切分子串后反转其顺序再拼接PR #91780issue #91463。源码 src/Functions/FunctionReverseBySeparator.cpp 的实现细节非常清晰支持 1 或 2 个参数reverseBySeparator(string[, separator])两个参数都必须是String类型第二个参数必须为常量默认分隔符为.。边界行为空字符串返回空空分隔符等价于整体反转整个字符串单字符分隔符走专门优化路径多字符分隔符使用StringSearcher的TokenSplitter切分。注册文档中内置的示例见 源码SELECT reverseBySeparator(www.google.com); -- com.google.www SELECT reverseBySeparator(a/b/c, /); -- c/b/a SELECT reverseBySeparator(x::y::z, ::); -- z::y::x SELECT reverseBySeparator(.a.b., .); -- .b.a. SELECT reverseBySeparator(single); -- single SELECT reverseBySeparator(abcde, ); -- edcba适合域名反转、路径解析等分层数据处理场景。注意源码中IntroducedIn标记为 26.2实际可用版本请以安装版本为准。5.use_primary_key开关新增查询级设置use_primary_keyPR #93319默认true。在 src/Core/Settings.cpp 中定义为DECLARE(Bool, use_primary_key, true, ...)含义为“MergeTree 表查询执行时是否使用主键剪枝 granule”。设置为false可强制禁用主键剪枝例如用于对比测试或排查索引问题。对应的实现逻辑见 src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp当use_primary_key false时key_condition的skip_analysis_置为trueRPN 只有一个元素主键条件不再参与索引分析。6.max_insert_block_size_bytes精细控制插入块新增设置max_insert_block_size_bytesPR #92833与既有的max_insert_block_size_rows协同更精细地控制插入块的成型。在 src/Core/Settings.cpp 中其默认值为0不参与块成型。块成型的完整规则同文件 第 175-243 行启用use_strict_insert_block_limits时最小值阈值ANDmin_insert_block_size_rows且min_insert_block_size_bytes都达到或最大值阈值OR二者之一达到即发出块。未启用时最小值阈值按 OR 逻辑max_insert_block_size_*不强制执行。注意异步插入async insert会自动禁用该严格限制因为异步插入按条目附加去重 token与块拆分不兼容。7. 可观测性新能力ClickHouse_Info指标PR #91125Prometheus/metrics端点新增ClickHouse_Info指标主要包含版本信息可以基于它绘制随时间变化的详细版本图表。system.parts.files列PR #94337system.parts表新增files列显示每个数据 part 包含的文件数。源码见 src/Storages/System/StorageSystemParts.cppfiles列类型UInt64描述为 The number of files in the data part.数据来源是part-checksums.files.size()。system.zookeeper_info表PR #90809新增系统表展示 ZooKeeper/CH Keeper 连接信息issue #88014。zookeeper_log只记录慢请求PR #93999可配置只记录慢请求降低日志量。8. 其他新特性速览分布式索引分析PR #86786多副本上的分布式索引分析对共享存储与大集群数据量场景收益明显。异步插入去重支持物化视图PR #89140、#93957当block_id冲突时过滤冲突行后用所有相关物化视图的 select 查询重建原始块。客户端 TLS SNI 覆盖PR #89761clickhouse-client可覆盖连接服务器时的 TLS SNI。Array 列文本索引PR #89895文本索引支持Array列。FunctionVariantAdaptorPR #90900函数层支持Variant类型的适配器。投影索引新语法与框架PR #91844扩展投影索引能力follow-up #81021。Paimon REST CatalogPR #92011支持 Paimon REST catalog。mergeTreeAnalyzeIndex()函数PR #92954分析 MergeTree 表索引使用情况。icebergLocalCluster表函数PR #93323本地集群模式的 Iceberg 表函数。数据湖 PREWHERE 与多级 PREWHEREPR #93542Parquet reader v3 支持数据湖的 prewhere 与多级 prewhere注意该 PR 后续被 revert见下文的 Bug 修复部分 #95496。cosineDistanceTransposed函数PR #93621近似计算两点间的余弦距离。SYSTEM CLEAR [...] CACHE语句PR #93727新语法语义更明确旧SYSTEM DROP [...] CACHE仍可用。Replicated 数据库ON CLUSTERPR #92872启用ignore_on_cluster_for_replicated_database后Replicated 数据库可执行带ON CLUSTER的 DDL集群名被忽略。EXPLAIN indices 1PR #92774作为EXPLAIN indexes 1的别名。实验特性Nullable(Tuple)新增对Nullable(Tuple)类型的支持PR #89643需要显式开启设置SET allow_experimental_nullable_tuple_type 1;开启后可以在Tuple外层使用Nullable为异构结构数据的空值表达提供更多可能性。性能改进解析1. JOIN 过滤下推与运行时过滤更多过滤条件下推到 JOINPR #85556use_join_disjunctions_push_down优化默认开启PR #89313。JOIN ON 条件在只使用单侧输入时支持更多下推场景覆盖ANY、SEMI、ANTIJOINPR #92584。允许用等价集equivalent sets为SEMI JOIN下推过滤条件PR #92837issue #85239。外部过滤条件下推到 view可在本地与远程节点应用PREWHEREPR #88316issue #88189。右侧表为空时跳过读取 hash join 左侧PR #94062当布隆过滤器置位过多或运行时过滤掉的行太少时自动关闭 join 运行时过滤器以降低开销PR #91578。2. 查询执行优化更多函数的 JIT 编译PR #88770issue #73509提升热路径执行效率。fastrangeDaniel Lemire 方法PR #93080用于查询管线内的数据分区可改善并行排序与 JOIN。分数LIMIT/OFFSET优化PR #91167优化性能与内存占用。read-in-order 识别常量排序列PR #94103当ORDER BY列因WHERE条件变为常量时如WHERE tenant42 ORDER BY tenant, event_time DESC可直接使用InReverseOrder反向读取而非全量排序利于多租户查询。3. 索引相关优化文本索引全文搜索性能提升配合sparseGramstokenizer 减少索引中搜索的 token 数PR #93078。mapContainsKeyLike/mapContainsValueLike可复用mapKeys()/mapValues()上的文本索引PR #93049。distinctJSONPaths聚合函数优化只读取 JSON 路径而非整个 JSON 列PR #92196。use_skip_indexes_on_data_read默认开启PR #93407。4. 数据写入与存储优化极宽表启用自适应写缓冲区降低 INSERT/merge 内存占用并支持加密磁盘PR #92250。增量统计statisticsmaterialize_statistics_on_merge设置控制 merge 期间是否物化统计信息默认1PR #93379估算聚合键列的 total rows 与 NDV 统计PR #92812。5. 其他性能改进DISTINCT在LowCardinality列上的性能提升PR #91639issue #5917。uniqExact在相同元素连续出现时的优化PR #93268。isValidASCII对全 ASCII 输入的正向优化PR #93347、#93611注意后者被 revert见 NO CL ENTRY 部分。EnumAST 用 string/integer 对存储值参数降低内存PR #94178。S3Queue Ordered 模式重构为按 bucket 处理减少 Keeper 请求数PR #92889。EC2 实例凭证 Provider 缓存共享避免并发 S3 查询打爆 EC2 metadata 端点PR #92891。uniqTheta并行聚合精度修复PR #94095。改进项亮点存储与 ALTERALTER TABLE ... ATTACH PART ... FROM directoryPR #74816可从detached/目录的任意子目录如broken-on-start、unexpected等带前缀目录直接附加 part无需再手动重命名目录。RocksDB 嵌入式存储支持多列主键PR #33917issue #32819。min_free_disk_bytes_to_perform_insert在 JBOD 卷上正确工作PR #90878。avg()聚合函数支持Date/DateTime/Time参数PR #87845issue #82267。大量ALTER ... MODIFY SETTING并发时返回 timeout 而非 logical errorPR #93856。日志、客户端与格式服务器日志支持复合轮转策略size timePR #87620。CLI 客户端支持warningsfalse/warnings配置PR #87783历史搜索改进——interactive_history_legacy_keymap下 CtrlR 常规搜索、CtrlT 模糊搜索PR #87785CtrlR 无历史匹配时执行当前查询PR #92749输入时高亮数字字面量的千分位分组PR #93108支持等号周围带空格的命令行参数PR #93174。Pretty JSON 格式中简单类型不再单独换行输出PR #93836。Parquet reader允许把 Tuple/Map 列按 JSON 读取select x from file(f.parquet, auto, x JSON)PR #92864支持空 tuplePR #92868。安全与权限system.functions中敏感数据脱敏修复PR #94436。URL 存储/url()表函数中的密码不再出现在查询日志PR #93245redis表函数密码参数脱敏PR #95325。merge表引擎绕过SHOW COLUMNS权限获取列信息的问题修复PR #93695。mergeTreeProjection表函数补充访问检查PR #95480。通配符 GRANT 检查逻辑修正PR #92725。clickhouse-local的default用户启用访问管理权限PR #94501。数据湖DeltaLake 表引擎支持 deletion vectorsPR #93852deltaLakeCluster同样支持PR #94365DeltaLake CDF 与 DataLake 数据库引擎集成修复PR #94342。数据湖支持 Google Cloud StoragePR #93866。Iceberg manifest 中解析 position deletes 对应文件名上下界PR #93980。Bug 修复分类速览本版本的 Bug 修复用户可见的稳定版行为错误数量庞大按领域归类如下领域代表性修复JOIN 相关多 JOIN USINGjoin_use_nulls逻辑错误#92251Join存储 outer-to-inner 优化INCOMPATIBLE_TYPE_OF_JOIN#84292运行时过滤器多个场景的崩溃/逻辑错误#93144、#93187、#93211、#93526、#94555、#95000RIGHT JOIN 复杂 ON 条件结果错误#94680JSON 类型类型化路径检查#92539、#94070动态子列在别名中的解析#92583插入/突变后FILE_DOESNT_EXIST#92860、#93016稀疏偏移读取#94399文本索引大 part超 42.9 亿行临时禁用创建/物化#92644merge 崩溃#92925、#93073、#93140.mrk不兼容#94494空 token 场景#93457Parquet reader跨页边界的 Array 截断#94125可用input_format_parquet_use_native_reader_v30规避prewhere 断言#90635DELTA_BYTE_ARRAY 解码#91929分布式/复制GLOBAL IN在 analyzer 下重复建 set#93507分布式ORDER BY返回错位的 ALIAS 列#94644lag/lead分布式remote()失效#93858并行副本孤儿范围窃取改进#91374权限与安全SYSTEM SYNC FILE CACHE缺失访问检查#92372groupConcat反序列化整数溢出漏洞#93426ngram_bf非 UTF-8 数据未初始化内存读取#93663Keeper/ZooKeeper死会话后持久 watch 清理#93213ZooKeeper 客户端连接挂起崩溃#94320日志条目间隙处理#90403内存与稳定性大 patch parts 轻量更新后内存记账不准确导致 OOM#95231SCOPE_EXIT抛异常崩溃#94100DataPartStorageOnDiskBase::remove与system.parts数据竞争#94262函数与类型h3索引函数无效输入崩溃#93657tokens非 const 参数崩溃#93383arrayShuffle等函数物化常量列#94134toStartOfInterval与toStartOfX行为对齐#95011备份并发备份争用同一文件崩溃#93659BACKUP/RESTORE 权限问题#94617tar 归档 entry size 错误#92122值得特别注意的回归风险PR #93542数据湖多级 PREWHERE在 26.1 后续被 revert#95496见 源码 changelog若你正在使用该功能应关注官方后续修复版本。构建、测试与打包改进移除传递性 libc 头文件PR #92523清理构建标志PR #93679启用implicit-int-conversion与implicit-int-float-conversion检查PR #93610、#94643。新增基于 jemalloc 的 SQL 解析器内存分配剖析工具集PR #93523、#94072对应工具位于 utils/parser-memory-profiler。依赖版本升级c-ares v1.34.6修复 CVE-2025-62408与 ClickHouse 无关PR #94129、curl 8.18.0#94742、libexpat 2.7.3#95218、postgres REL_18_1#95189。顺序测试并行化改造PR #93030CI 流水线praktika大量重构。总结与升级建议综合 v26.1.1.912-stable 的全部变更升级前建议按以下清单行动数据格式检查确认没有使用DEFLATE_QPL/ZSTD_QAT编解码器的存量数据JSON 列数据在升级后将无法降级回 25.8 以下提前通过compatibility或 MergeTree 设置锁定序列化版本。引擎与语法检查迁移Lazy数据库检查是否存在JOIN USING ()、在表引擎定义中误用格式设置的情况。权限审计为所有使用joinGet/joinGetOrNull的账号补齐SELECT授权表级或列级。行为变化回归CPU 抢占式调度与max_min_fair默认值会改变高并发场景的调度行为use_primary_key、max_insert_block_size_bytes等新设置为性能调优提供新手段值得针对性压测。关注后续修复部分 PR如多级 PREWHERE后续被 revert升级后应结合 docs/changelogs 目录中的更新日志跟踪官方后续版本及时评估相关回归修复。如需深入了解文中涉及的设置与函数可直接在仓库中查阅 src/Core/Settings.cpp、src/Core/ServerSettings.cpp、src/Functions/FunctionReverseBySeparator.cpp、src/Coordination/FourLetterCommand.cpp 与 src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表