ClickHouse 26.10 把过滤推到数据所在的一侧,哈希表面内存减半;DataHub 1.8.0 让指标与语义模型进血缘并收紧权限口径;Weaviate 1.36.24 按租户大小延迟分配向量缓存;JuiceFS 1.4.2 修掉超时与并发下的读错与丢数据
本期聚焦四条 10 月 22 至 24 日的开源侧进展,动作形状一致:把一件原本默默生效、出事才被看见的行为,改成有名字、有默认值、有回滚开关,并把迁移代价逐条写出来的显式契约。
本期四条都来自开源侧,形状高度一致:ClickHouse 26.10 把过滤条件下推进到并行副本与 Parquet 读取器内部、把哈希表面的内存砍掉一半,并把删除旧查询分析器的迁移步骤写在变更日志第一行;DataHub 1.8.0 把指标与语义模型接进列级血缘,并把访问令牌、时序读取与查询 SQL 的权限口径逐条收紧;Weaviate 1.36.24 把多租户向量缓存改成按租户规模延迟分配;JuiceFS 1.4.2 修掉的是对象存储超时与元数据并发下会读错数据、会丢切片的一类问题。Databricks、AWS 大数据博客、Google Cloud 数据博客在 10 月 24 至 25 日没有新条目,上一期覆盖的 10 月 23 日条目仍是各自最新。
ClickHouse 26.10:把过滤推到数据所在的一侧,并把旧分析器的退场步骤写明
事件概述
ClickHouse 在 2026 年 10 月 22 日打出 26.10 版本,10 月 24 日发布稳定构建 v26.10.2.103-stable。官方 release webinar 给出的口径是 104 项新功能、225 项性能优化与 739 项修复,是第一个新功能数过百的版本。
这一版的重心不在新增 SQL 语法,而在执行计划层面的裁剪:原来由 initiator 统一执行的过滤,现在被推进到并行副本各自执行的查询片段里;原来先物化再丢弃的聚合分组,现在在物化之前就被跳过;原来必须全量读出的 Top-K 查询,现在把边界值发布给读取步骤,让它在读其他列之前就丢掉不可能入选的行。三条改动指向同一件事——把「读多少数据」从执行器的内部决定,变成可以在计划层谈判的对象。
技术解析
- 并行副本的过滤下推默认打开:
parallel_replicas_filter_pushdown现在默认启用,过滤条件被推进到并行副本执行的查询片段,副本可以先过滤行、先裁剪数据,再把结果送回 initiator,连接运行时过滤(join runtime filter)也一并抵达相关读取。设parallel_replicas_filter_pushdown = 0回到 26.10 之前的行为。 - Top-K 动态过滤:
GROUP BY key LIMIT n与GROUP BY key ORDER BY key LIMIT n在 MergeTree 上会把聚合阶段的 Top-K 堆边界发布给读取步骤,超出边界的行在读取其他列之前就被丢掉,还能通过主键或minmax跳过索引整块跳过 granule。开关是enable_group_by_top_k_dynamic_filtering。同样的 granule 跳过现在也覆盖主键列上的ORDER BY column LIMIT n;Parquet 侧的use_top_k_dynamic_filtering则把不可入选的行在读取器内部过滤,并用 row group 的 min/max 统计整组跳过,浮点排序列暂不参与。 - HAVING 的分组预过滤:新增
query_plan_aggregation_having_prefilter,针对HAVING count() <比较> <常量>:二级哈希桶转成 chunk 时,count 不可能满足边界的分组在 key 列物化之前就被跳过。它加速的是高基数、宽 key 的「超过阈值的分组」类查询——被丢弃的 key 占了转换开销的大头。这里有一条必须留意的行为变化:被跳过的分组既不参与过滤也不参与 finalize,写在边界之前的 HAVING 合取项与兄弟聚合的 finalize 不再在这些分组上求值,一条原本抛异常的查询现在会返回行。设query_plan_aggregation_having_prefilter = 0或把compatibility调到 26.10 以下可回到旧行为。 - 哈希表面内存减半:用于
GROUP BY、uniqExact与JOIN的大哈希表现在最多只用原来一半的内存,多键聚合在多线程下也更快。 - 排序归并连接按主键区间并行:
query_plan_join_shard_by_pk_ranges默认启用。两张 MergeTree 表的full_sorting_merge/parallel_full_sorting_merge连接,当连接键包含双方主键前缀时,不再跑单线程归并,而是在所有线程上按主键区间跑独立的流式归并连接,官方口径是快数倍、内存少数倍。归并连接现在还声明结果按连接键有序,其上层的排序、链式归并连接的预排序与ORDER BY直接归并已排序流,多表同键连接不再每连接一次就全排一遍。 - 旧查询分析器彻底移除:analyzer 之前的那套查询分析被删掉。
enable_analyzer自 26.9 起已不可选,现在一台服务器也不再为别的服务器发来的查询使用它——发起方早于 26.10 的混合集群会在旧 initiator 上看到NOT_FOUND_COLUMN_IN_BLOCK,因为两套分析给结果列起的名字不同。升级任何一台之前先在所有服务器上设enable_analyzer = 1。use_analyzer_for_mutations被移除,parallel_replicas_only_with_analyzer变为废弃。 - 启动时的系统调用过滤:
clickhouse-server可在启动时加载seccomp过滤器,seccomp设置取log(只记录)、trap、kill、errno(强制执行)与disabled。随包与 Docker 镜像分发的config.xml现在把它设为trap,跑在拒绝seccomp系统调用的沙箱里的服务器必须在升级前改成log或disabled。 - 升级前必须清理的空库名:
Remote、RemoteSecure、Cluster数据库引擎现在对空远程库名报BAD_ARGUMENTS,而不再建出一个列不出表也读不出表的库。持有这类库的服务器升级后无法启动,升级前要先 drop。 - 数据湖侧:新增
Icebergv3 删除向量(存于 Puffin 文件)的读支持;DataLakeCatalog引擎新增unity的 v2 实现,从同一套 Unity Catalog 一并服务DeltaLake与Iceberg表,按表探测格式并把 Iceberg 表路由到 Unity Catalog 的 Iceberg REST 端点,开关是use_unity_catalog_v2。Parquet 的VARIANT类型(未 shredded,例如 Spark 4.0 写出的)可读入Dynamic,对象值读成JSON;s3_plain_rewritable盘在开启enable_hard_links后支持硬链接,mutation 与分区操作共享未改动的 blob 而不再复制;同一类盘的元数据加载改为按 key 前缀并行列举,官方给的数是一个含 3.6 万目录、50 万对象的盘从 116 秒降到 37 秒。 - 缓存与配额:查询条件缓存现在能服务含当前时间的条件(如
WHERE time >= now() - INTERVAL 10 DAY),做法是把当前时间常量对齐到时间网格上派生出确定性条件;新增实验性的 columns cache(use_columns_cache),按 granule 条带缓存已反序列化的宽表列,省掉反序列化与拷贝;配额新增written_rows资源,可以按行数而不是字节数限制写入。实验性LATERAL JOIN(allow_experimental_lateral_join)支持 FROM 子句里的相关子查询,覆盖 top-N-per-group 模式。
行业影响
这一版把 ClickHouse 的性能叙事从「单算子更快」推进到「计划层少读」:Top-K 动态过滤、并行副本过滤下推、HAVING 预过滤、按主键区间并行的归并连接,四条都是把裁剪点往数据所在的一侧搬。这类改动对用户的可见性很低——查询文本不用改,执行计划变了——代价是行为边界变复杂:HAVING 预过滤会让原本抛异常的查询返回行,旧分析器的移除会让混合版本集群报错。ClickHouse 的处理方式是把回滚开关(= 0 或 compatibility)写在每一条的末尾,这在近几个版本里已经成了固定格式。
值得单独指出的是它对数据湖格式的姿态:Iceberg v3 删除向量、Unity Catalog v2 双格式路由、Parquet VARIANT 读成 Dynamic,三条都说明 ClickHouse 在把自己定位成一个直接读开放表格式的引擎,而不是先把数据搬进自有格式再查。VARIANT → Dynamic 这一条尤其关键——Spark 4.0 写出的半结构化列不必在摄入时定型。
相关链接
- ClickHouse Changelog
- v26.10.2.103-stable Release
- ClickHouse Release 26.10 发布演示
- ClickHouse v26.10 Release Webinar
- 大哈希表内存减半 #125001
- 并行副本过滤下推 #117373
- Top-K 动态过滤 #121145
- HAVING 分组预过滤 #120510
- 归并连接按主键区间并行 #117856
- Unity Catalog v2 #115879
- Iceberg v3 删除向量读支持 #110781
- 旧查询分析器移除 #120311
DataHub 1.8.0:指标与语义模型接进列级血缘,权限口径逐条收紧
事件概述
DataHub v1.8.0 于 2026 年 10 月 22 日发布,配套 CLI / Python SDK 1.7.0.14 与 Helm chart 1.1.8。这一版最有架构意味的改动是 Metrics 与 Semantic Models:图表、看板与数据集现在可以把一个 Metric 作为上游,且血缘能穿过 Metric 的上游走到列级;Metrics 与 Semantic Models 一并进入全局搜索。功能默认关闭,需要在 GMS 上设 METRICS_ENABLED=true。
更值得数据平台团队注意的是 Breaking Changes 那一节:访问令牌、时序读取、查询 SQL、角色与组成员、合规表单分配、资产摘要设置,六处的权限口径在同一版里被收紧。
技术解析
- 指标进血缘:Charts、Dashboards、Datasets 可以挂一个 Metric 作为上游,并支持穿过 Metric 上游的列级血缘。Cube 连接器可用
emit_semantic_model_entities: true产出一等公民的 semantic model、metric 与 semantic-model dataset 实体(该路径依赖METRICS_ENABLED=true);MicroStrategy 的项目 schema 可被采集为 Semantic Model。 - 搜索文档 id 换代:Search V3 文档改用实体 URN 的 SHA-256 作为
_id,V2 索引不变。这不是原地重写——已经用 URL 编码 id 写过 V3 文档的环境,必须跑RestoreIndices加-a clean,或重新索引到一个干净索引;不带 clean 的 fill 会留下旧_id,下一次更新会造出重复文档。 - 访问令牌不再允许无过期时间:新建无过期时间的令牌被禁用,允许时长默认为 1 小时、1 天、7 天、30 天、90 天、180 天、365 天。已存在的令牌(含原先签发的无期限令牌)继续可用。需要放开时用
ACCESS_TOKEN_ALLOW_NO_EXPIRY=true,用ACCESS_TOKEN_ALLOWED_DURATIONS改可选 TTL。 - 查询 SQL 的读取权限:读一条 query、一个 view 定义或
topSqlQueries,现在需要主体数据集上的 View Entity Queries,或平台级 View All Queries。升级时已授予 View Entity Page 的策略会被回填这两项;升级之后新建的、只授予 View Entity Page 的策略不再能看到查询 SQL。 - 时序读取与角色成员:数据集 profile、usage、operations 与看板 usage 统计,现在在 Rest.li 与 OpenAPI 上也需要与 GraphQL 匹配的对应 View 权限;专用时序 API 在开启 REST 授权时还需要 Get Timeseries Aspect API。加角色(
roleMembership)需要 Manage Policies,加组成员需要 Edit Group Members,加组 owner 需要 Edit Owners;当操作者就是被加入者本人,两者都需要 Manage Users & Groups。对用户实体的 Edit Entity 不再足以授予该用户 Admin。 - 检索引擎扩到 OpenSearch 3.x:与 OpenSearch 2.x、Elasticsearch 8.x 并列支持,引擎版本自动探测。OpenSearch 3.x 不再用
nmslibkNN 引擎建新索引,并对 bulk 写入强制 512 字节的文档 id 上限。 - 连接器分级改名:支持级别改为 Alpha / Beta / GA,原来的 Certified、Incubating、Testing 三个名称被移除——对依赖
Certified做采购或上线门槛的团队,这是需要改文档的一处。 - 采集侧新增:IBM/HCL Informix、Monte Carlo、SQLMesh 三个新数据源。Snowflake 语义视图里的逻辑表保留存储的大小写,新增默认关闭的
preserve_column_case——打开会改变每一列的schemaFieldURN。BigQuery 支持共享的 linked dataset、多列分区信息与物化视图的 dataset profile。 - 其他:结构化属性从侧边抽屉改为独立页面,允许值可重排且各带可选描述,表格新增 Type 与 Platforms 列;Data Product 支持嵌套到父 Data Product 下,升级时一次性系统更新会把资产侧的
dataProducts搜索字段从已存成员关系补齐;深色主题随包发布但默认关闭(THEME_DARK_MODE_ENABLED=true开启);界面语言新增日语、简体中文、繁体中文与俄语的公测。
行业影响
Metrics 与 Semantic Models 进血缘这一条,对应的是语义层与元数据层正在合并这个更大的趋势:指标过去住在 BI 工具或语义层里,血缘系统只能看到表与表之间的关系,看不到「这个看板数字来自哪个指标、指标又来自哪些列」。DataHub 把它做成一等实体并打通列级血缘,等于把指标纳入了与数据集相同的治理与影响面分析路径。官方选择默认关闭、需要显式开关,说明这条链路还在验证期。
权限口径的集中收紧是这一版的另一半重量。DataHub 过去不少读接口只校验实体 GET,查询 SQL、时序 profile 这类敏感读取暴露得过宽。这一版把它们拆成细粒度的平台权限,并给出「升级时回填、升级后新建不继承」的迁移规则——这条规则本身值得注意,它意味着权限模型的变更不是幂等的,团队在升级后新建策略时要重新确认。
相关链接
Weaviate 1.36.24:多租户向量缓存改成按租户规模延迟分配
事件概述
Weaviate 于 2026 年 10 月 23 日发布 v1.36.24。这一版在 release notes 里明确写出「无破坏性变更、无新功能」,全部是修复,但其中三条牵动的是多租户向量库最敏感的资源账:按租户规模延迟且成比例地分配向量缓存内存、HNSW 访问集合改用 slab 分配、cyclemanager 在上下文过期时回滚 shouldAbort。
技术解析
- 每租户向量缓存延迟分配:per-tenant 的向量缓存内存改为延迟分配,且分配量与租户规模成比例。此前在租户数量很大时,缓存按租户数预留会形成与实际数据量脱钩的常驻开销;改成按规模成比例后,小租户不再占用与大租户同量级的缓存预算。
- HNSW 访问集合 slab 分配:
visited稀疏集合的段改用 slab 分配,减少图遍历期间的高频小块分配与随之而来的 GC 压力。HNSW 查询每次都要重建访问集合,这条改动落在最热的路径上。 - cyclemanager 的 abort 回滚:修的是上下文在回调执行期间过期时
shouldAbort没有回滚的问题。后台周期任务(压缩、向量索引维护)依赖这个标志判断该不该中止,标志残留会让后续周期误判状态。 - 索引创建失败时的清理:当向量索引的队列创建失败时关掉索引,避免留下孤儿索引占住资源。
- 多向量写入幂等:修
AddMultiVector的幂等性问题——重放一条多向量写入不再产生重复条目。 - 认证 singleflight 的键:认证侧的 singleflight 从只按 user 改成按 key 去重。此前不同 API key 属于同一用户时会互相合并并发请求,导致限流与并发语义串味。
- RBAC 正则修复与移除旧备份格式的恢复支持:前者修 RBAC 规则里的正则匹配问题,后者意味着老版本写出的备份不再能被这一版恢复,回滚路径要提前确认备份版本。
- 可观测性:新增统一的后台进程活动与时长指标;遥测侧为集群与节点提供持久化身份,让跨节点的遥测数据可关联(该提交受遥测开关门控)。
行业影响
多租户是向量数据库在 SaaS 场景下的主流形态,而「每个租户分多少缓存」长期是个拍脑袋的默认值。Weaviate 这次把它改成延迟分配加按规模成比例,等于承认了租户规模分布是长尾的——预分配模型在长尾分布上必然浪费。这条改动对超大租户数的部署是实打实的内存下降,对超大单租户的部署影响很小,官方在 release notes 里把这一条归到 Fixes 而非 Features,也说明它是对既有行为的修正而非新能力。
HNSW 的 slab 分配与 cyclemanager 的状态回滚属于同一类工程动作:把高频路径上的分配开销与状态机残留清掉。这类改动不出现在功能列表里,却决定了高负载下的稳定性上限。移除旧备份格式恢复这一条是需要在升级前核对的硬约束。
相关链接
- Weaviate v1.36.24 Release
- 按租户大小延迟比例分配向量缓存 #12116
- HNSW 访问集合 slab 分配 #12374
- cyclemanager 回滚 shouldAbort #12265
JuiceFS v1.4.2:修掉对象存储超时与元数据并发下的读错与丢切片
事件概述
JuiceFS 于 2026 年 10 月 22 日发布 v1.4.2,是 v1.4 的第二个补丁版本,包含 13 位贡献者的 33 个提交。这一版没有新功能,全部是 bugfix,但条目指向的都是分布式文件系统的核心风险区:对象存储超时后的读正确性、并发下的元数据事务与垃圾回收、以及挂载重启时的在途请求。
技术解析
- 对象存储超时后的错误读取:chunk 层修了对象存储请求超时之后读到错误数据的一类问题,涉及四个 PR。对以对象存储为后端的分层文件系统,超时重试与部分读取的边界处理是最容易出静默错误的地方——这类错误不会报错,只会返回错的内容。
- zstd 解压越界:修 zstd 解压覆盖相邻 slice 的问题。压缩块的解压如果写入边界算错,会污染同缓冲区的其他数据块。
- 陈旧事务重试状态导致的数据丢失:元数据层修了重试状态残留引起的数据丢失。分布式事务重试时若未清理上一轮的状态,重试会基于错误的上下文执行。
- 并发 GC 删除存活切片:修并发垃圾回收删除仍在使用的 slice 的问题。GC 与写入并发时,slice 的引用判定与删除之间存在时间窗。
- 并发操作下的命名空间更新丢失:SQL 元数据引擎修了并发操作期间命名空间更新被覆盖的问题。
- 元数据格式竞态与配置损坏:修 format 竞态、配置损坏与 reload 回归三类问题;另有 sticky 目录权限检查顺序、分离树中含不可变文件的清理、备份时的 goroutine 泄漏与内存占用等修复。
- 挂载与 FUSE 层:优雅重启不再打断在途请求;FUSE 在 writeback caching 下不再意外重置 tier;VFS/元数据层的 ioctl flag 权限检查被补齐,避免清掉无关的标志位。
行业影响
JuiceFS 这类「对象存储 + 独立元数据引擎」的架构,把数据面与元数据面分开之后,正确性问题几乎全部集中在两者的交界处:对象存储的超时语义、元数据事务的重试语义、GC 与写入的并发窗口。这一版修的条目正好分布在这三处。它们的共同特征是静默——不抛异常、不中断作业,只让返回结果偏离正确值,在数据管道里往往要等到下游对账才被发现。
对已经在用 JuiceFS 承载训练数据或湖仓存储的团队,这一版属于应当尽快跟进的补丁:chunk 层的错误读取与 GC 删除存活切片两条,都是数据正确性级别的问题,而不是可用性级别的问题。
相关链接
编者评
本期四条分布在四个不同层次——查询引擎、元数据目录、向量库、文件系统——却在做同一件事:把一件原本由实现内部悄悄决定、出事才被看见的事,摊成一个有名字、有默认值、有回滚开关、并把迁移代价写在旁边的显式契约。ClickHouse 把「读多少数据」从执行器内部决定变成计划层可谈判的对象,代价是每条优化都要附上 = 0 的回滚开关和一条行为变化说明;DataHub 把「谁能看到查询 SQL」从隐含的实体 GET 拆成显式权限,并明确写出回填只在升级时发生一次;Weaviate 把「每个租户分多少缓存」从预分配改成按规模成比例的延迟分配;JuiceFS 修的是超时与并发窗口里那些不报错、只让结果偏离正确值的隐式行为。
一个值得留意的对照是厂商侧的静默:Databricks、AWS 大数据博客与 Google Cloud 数据博客在 10 月 24 至 25 日都没有新条目,三方最新的技术发布仍停留在 10 月 22 至 23 日。阿里云博客与开发者社区、火山引擎文档站与开发者社区这四个入口依旧返回 200 但无可确认日期的条目,这已经是连续第 22 期无法从中取到可用性内容——中文源的观察仍然只能靠中国背景开源项目的版本快照间接完成,本期 JuiceFS 与 CnosDB(v2.5.0,10 月 23 日)属于这一类。
另一条跨产品的线索是开放表格式的读侧竞争:ClickHouse 26.10 在同一版里补齐了 Iceberg v3 删除向量的读支持、Unity Catalog 对 Delta 与 Iceberg 的双格式路由、以及 Spark 4.0 写出的 Parquet VARIANT 读成 Dynamic。当引擎开始直接消费别家写出的格式细节时,格式本身就成了接口,而不再是中间态。