ClickHouse 26.9 秋季版发布;RisingWave v3.1.0 打版;DuckDB-Wasm 支持 OPFS 持久化;Streamhouse 工作组成立
本期聚焦引擎与运行期的边界内移:ClickHouse 26.9 把 Iceberg 增量复制、Prometheus 接口与 Trino 方言收进引擎,RisingWave v3.1.0 让 sink 换源与并行度调整在流作业运行期完成,DuckDB-Wasm 借 OPFS 把数据库文件落进浏览器,五家流式厂商则为 Streamhouse 给出一份带商标承诺的公开定义。
本期四条指向同一个动作:把原本要跨一个系统才能完成的事,搬进自己这一层完成。ClickHouse 26.9 在稳定版打版的同一周,把 Iceberg 增量复制、Prometheus HTTP 接口和 Trino 方言收进引擎;RisingWave v3.1.0 让 sink 换源与并行度调整在流作业运行期完成,代价是五条破坏性变更;DuckDB-Wasm 借 OPFS 把数据库文件落进浏览器沙箱,代价是持久性降级为缓存;Aiven、Confluent、Redpanda、StreamNative 与 Ververica 五家则为 Streamhouse 给出一份带商标承诺的公开定义。四次收拢之后,原来那个系统不再是对等协作者,而变成被兼容的对象。
ClickHouse 26.9:引擎把外部系统的活接了进来
事件概述
ClickHouse 26.9 的稳定构建 v26.9.1.1629-stable 于 2026 年 9 月 21 日打版(UTC 21:25)。官方 Release Call 材料给这一版标了三个数字——56 个新特性、135 项性能优化、464 个缺陷修复,并称之为「Autumn Release 26.9」。同日还有 v26.8.10.6-lts 的补丁构建。
改动面铺得很宽,但有一半以上落在两个方向:一是把 Iceberg / Delta Lake / Prometheus / Trino 这些外部系统的接口做成引擎内部的一等公民,二是不改查询语义、只改「读多少、走几趟」的执行层优化。官方 changelog 页与 GitHub release 页均可查。
技术解析
- 增量刷新的可刷新物化视图:
REFRESH EVERY 1 HOUR APPEND INCREMENTAL让物化视图每次只处理上次刷新以来源表新增的行。源表需开enable_block_number_column与enable_block_offset_column,游标就是源表的 block number。官方给的头号用例是把 MergeTree 表复制进 Iceberg,并写明往 Iceberg 目标的追加是精确一次的——游标写在快照里。 - Iceberg manifest 并行解码:查询规划要遍历 manifest(取回、解 Avro、按分区与 min/max 剪枝),这一步原先是串行的,26.8 只补了预取。26.9 改成并发解码,存活条目流式进一个有背压的有界队列。PR 给的例子:18 份 manifest、113 MB、约 7.5 万条目,串行 8.45 秒,4 线程 2.55 秒,16 线程 1.68 秒;并发度由
iceberg_manifest_decode_concurrency控制,默认 4。另加一条:manifest list 里的lower_bound/upper_bound/contains_null现在能在打开任何 manifest 之前先剪掉整份 manifest。 - Delta Lake 可以直接建表:打开
allow_delta_lake_writes与allow_delta_lake_create_table后,ENGINE = DeltaLake(...)可以CREATE TABLE并插入,写出的_delta_log里commitInfo.operation记为CREATE TABLE、engineInfo记为 ClickHouse。也能挂到已有的_delta_log或注册进 Unity catalog。 - DISTINCT 落盘:3 亿 distinct key 的实测,纯内存 12.9 GB / 12.3 秒;设 1 GB 起落盘后为 1.14 GB / 12.1 秒——速度基本不变,内存降到约十一分之一,默认开启。
- 聚合走列统计:26.4 起默认记录的每 part 精确 min/max,现在
min/max/count直接读它,官方示例从 26.8 的 8–24 ms 降到 2 ms。缺统计的 part 仍按原路径读再合并。 - 原生协议收尾合并:26.8 里
SELECT 1的服务端回包是 7 个 TCP 包,26.9 合成 2 个。空闲后 Linux 会收缩拥塞窗口,超出窗口的突发要等一次 ACK;在 30 ms 链路上,这一处曾给空闲客户端带来约 2 倍延迟。 - ARM 一批修复:memcpy 小拷贝辅助函数在 AArch64 上被编译成 libc memcpy 调用(x86 早在 2024 年修过),现已内联;WHERE 过滤改用 NEON 寄存器累加。官方自己给了两组量级不同的数字:Graviton3 单线程对 1 亿条短字符串做 DISTINCT 从 12.4 秒降到 7.6 秒;「最高 15 倍」出自 PR #119555 的微基准,PR #117353 在 Neoverse-V2 上 4–16 字节实测为 1.34–1.36 倍。页面上还写着 NVIDIA Grace 未测(NOT done),理由是手上没有机器。
- 强制 analyzer:自 26.9 起 analyzer 是强制的,
enable_analyzer作废,设为 0 会被拒绝,24.3 之前的查询分析路径不再支持。这是升级前最该先核对的一项。 - S3Queue 的第三种模式:
mode = 'exclusive'把已处理文件记在本机内存里,省掉每文件一次 Keeper 往返,适合一个 bucket 只归一台服务器摄取的场合。官方附了诚实备注:26.9.1.1592 里CREATE仍要求 server config 里有 Zookeeper 段(表注册与元数据还是进一次 Keeper),省掉的只是每文件的处理状态。 - 作用域临时凭据:
CREATE TOKEN VALID FOR INTERVAL 7 DAY GRANTS (SELECT ON default.sales)生成的令牌只在现有授权子集内生效,在query_log里仍显示为原用户,用户被删即失效,授权收窄时令牌一并收窄。 - 方言扩展:PromQL 从实验性进 private preview,官方称覆盖 85% 以上 PromQL 且语义与 Prometheus 一致,26.9 补了
absent、count_values、*_over_time、predict_linear;Trino 方言仍是实验性,走 token 级语法翻译加约 340 个函数的 AST 映射;KQL 方言重写了词法、语法与 AST 翻译。
行业影响
ClickHouse 在把「外部系统的接口」当成自己的功能面来做:Iceberg 是一个 ENGINE 而非需要外部调度任务的目标表,Prometheus 是一个 HTTP handler 而非要单独部署的组件,Trino 是一种 dialect 而非要迁移的集群。对使用者,省掉的是一层胶水;代价是兼容深度由 ClickHouse 自己定义——Trino 方言只映射了约 340 个函数且标注实验性,KQL 重写前曾注册 28 个什么都不做的函数。这类「部分兼容 + 标注成熟度」的组合会变成新的评估成本,选型时要按方言逐项核,不能按名字整体采信。
列统计、manifest 剪枝、原生协议收包、ARM memcpy 这一组优化有一个共通点:都不改查询语义,只改「读多少、走几趟」。这类优化的可迁移性最强,也能解释为什么一个季度版本能凑出 135 项性能优化——绝大多数是局部替换,不是架构改动。
相关链接
RisingWave v3.1.0:把运行期的调整权收进引擎,代价是五条破坏性变更
事件概述
RisingWave v3.1.0 的 GitHub 标签于 2026 年 9 月 21 日 11:00 UTC 打版。需要提醒的是,官方文档站的发布说明里 v3.1.0 一栏仍标着「Upcoming」,没有给出正式发布日期,升级前应以官方公告为准。
这一版的主线由官方文档概括为四项:新增 VARIANT 类型、周期性刷新的物化视图、分区间隙填充,以及对 backfill 与 sink 操作更多的控制。真正影响现有部署的是最后一项附带的一组破坏性变更。
技术解析
VARIANT类型:配套to_variant、variant_get、try_variant_get、variant_typeof,可与varchar、jsonb互相转换。官方写明VARIANT不能作键,也不能用于分组、排序或连接条件。- 周期性刷新的物化视图:通过
refresh.interval.sec让物化视图消费上游快照并按间隔刷新。限制是这类视图需要 snapshot backfill,且不能有下游流作业。 - 分区间隙填充:
GAP_FILL(..., PARTITION_BY(...))为每个分区独立补点,支持EMIT ON WINDOW CLOSE。窗口关闭的实现会保留分区列,并为每个分区分别保留前一行状态。 REPLACE SINK ... FROM ...:在 cut-over barrier 处切换现有 sink,不回填历史行。限制:不支持 exactly-once sink、sink-into-table 与AS query替换;旧 sink 的权限不会转移。- 创建中也能改:流作业还在创建时,就可以改运行时配置、并行度、resource group 与速率限制。重命名这类元数据变更仍需等创建完成。
- 五条破坏性变更:① WebSocket ingestion 现在需要含
WebSocketIngest的许可证,否则新建或重连返回 HTTP 403(HTTP webhook ingestion 不受影响);② 移除了用mysql-cdc/postgres-cdc/sqlserver-cdc直连建 CDC 表的方式,必须先建共享 CDC source 再CREATE TABLE ... FROM source TABLE(MongoDB CDC 不受影响);③ Parquet 的VARIANT列从struct<metadata bytea, value bytea>改为原生variant,仍按旧 struct 声明的列会读出 NULL,file_scan()也推断为variant;④ 弃用 no-shuffle backfill,改用 snapshot 或 locality backfill;⑤ release builds 默认禁用posix_fs与fs本地文件系统连接器,要用得开frontend.unsafe_enable_local_fs_connector。
行业影响
把「停下来重做」换成「在线改」,是流式系统这一年最一致的方向。Databricks 在 9 月中旬为 Structured Streaming 加了按需状态重分区(本专栏 Vol.67 报过),RisingWave 这次落的是 sink 换源与参数调整,两者的账也很像:能力给了,边界写进文档。RisingWave 这版的边界尤其具体——五条破坏性变更里有三条会直接中断现有部署(WebSocket 403、CDC 建表方式、Parquet VARIANT),另两条改变默认行为。升级前逐条核对,比看特性清单重要。
相关链接
DuckDB-Wasm:数据库文件进了浏览器,持久性却降级为缓存
事件概述
DuckDB 官方博客 2026 年 9 月 18 日发文,说明 DuckDB-Wasm 如何用浏览器的 Origin Private File System(OPFS)打开一个持久化的数据库文件。OPFS 是 per-origin 的沙箱文件系统,支持随机读写,现代浏览器自 2023 年 3 月起普遍可用。
DuckDB-Wasm 在 2021 年上线时不能持久化,数据全在 Wasm 堆里,关标签页即消失;想留数据得把表序列化成 Parquet、塞进 IndexedDB、下次加载再注册回来。OPFS 把这件事从应用层搬进了引擎。
技术解析
- 用法:
db.open({ path: 'opfs://analytics.duckdb', accessMode: READ_WRITE })。opfs://前缀让文件系统层把路径解析到 origin 的私有文件系统,而不是默认的内存 Emscripten 文件系统。生成的是标准.duckdb文件加.wal,从 OPFS 里取出来用 CLI 或 Python 客户端直接能开。 - 一个必须知道的版本坑:官方明确写,撰写时 npm 上标为
latest的 1.33.1-dev57.0 会创建 OPFS 文件但从不写入,原因是路径被规范化成opfs:/analytics.duckdb(单斜杠),与 OPFS handle 不再匹配。要么钉 1.32.0,要么用next标签(1.33.1-dev64.0 及以后)。1.33.1-dev64.0 起还会多出.wal.checkpoint与.wal.recovery两个辅助文件。 - 持久性语义:与本地 DuckDB 一致,先写 WAL,checkpoint 时落到主文件,阈值默认 16 MB。浏览器标签页很少干净关闭(用户关页、手机杀后台、合盖都不会可靠执行收尾代码),官方给的两条规则是「不能丢的写之后调
CHECKPOINT」和「按批 checkpoint 而不是按语句」;不想跟踪批次就SET checkpoint_threshold = '0KB',每条语句后落盘,代价是写吞吐。 - 两种文件注册模式:
opfs: { fileHandling: 'auto' }会扫描语句里的'opfs://...'字面量并自动注册、用完释放;默认是手动注册,代码多但避免了每条语句重新获取一次 OPFS access handle。一个文件一次只能被一个 handle 持有,官方建议用完db.dropFile()。 - 导出:DuckDB-Wasm 自己还不能把文件搬进搬出 OPFS,需走浏览器 API(
navigator.storage.getDirectory()拿到 File 再URL.createObjectURL),或者用 SQL 导出成 Parquet。反向也成立:可以把预建好的.duckdb随应用分发,首次启动拷进 OPFS,用户开局即有数据。 - 限制:OPFS 是浏览器存储而非硬保证,磁盘紧张或长期未访问时会被驱逐,用户也能在站点设置里清掉。官方的定性是「把它当成本地缓存,不是唯一副本」,真正要留的底应放在 DuckLake catalog 或
s3://上。SQL 里的重命名只在两个已注册的 OPFS 文件之间有效。
行业影响
local-first 分析应用少掉了一个服务端:不用 IndexedDB 包装,不用自己做序列化,也不用起一个后端。代价是持久性的责任从数据库引擎转移到了应用——checkpoint 时机、版本钉法、导出通道、被驱逐后的恢复,这四件事都得由应用作者接住。版本坑尤其值得记:它出现在 npm 的 latest 标签上,而不是某个边缘构建上,凡是按默认安装走的应用都会踩到。
相关链接
Streamhouse 工作组:五家厂商给一个架构名词配了商标承诺
事件概述
2026 年 9 月 15 日,Aiven、Confluent、Redpanda、StreamNative 与 Ververica 联合宣布成立 Streamhouse Working Group,并发布一份厂商中立的 Streamhouse 定义。配套发布的还有一份有约束力的商标承诺。发起方覆盖的商业形态相当分散——托管服务、Kafka 商业版、自研引擎的 Kafka 兼容实现、Pulsar 商业版,以及 Flink 商业版。
技术解析
- 三个定义属性:real-time(数据随业务事件持续更新,而非靠周期性批处理刷新)、production-native(按生产服务水平构建,因为关键应用、分析与 agent 持续依赖它)、decentralized(在数据已经在的地方对接,而不是先把全企业数据归拢到一个系统)。
- 商标承诺:Streamhouse 这个词由 Ververica 提出。承诺规定任何人可以永久、免费地用这个名字描述、讨论、实现、销售或分析符合该定义的架构,无需许可、通知、注册或费用。
- 治理形式:定义会以带版本的公开仓库维护,工作组负责推进相关技术、开放标准与互操作实践,并邀请客户、从业者与其他厂商参与。定义正文与商标承诺分别放在 streamhouse.com 的
/definition与/trademark页,GitHub 上已有streamhouse组织。 - 与 Lakehouse 的关系:官方定位是共存。Lakehouse 解决的是大规模历史数据的存储与分析,Streamhouse 解决的是应用与 agent 在事件发生时运行业务,两者通过开放格式交换数据。官方把 CDC、事件流、流处理、开放表格式、catalog 与低延迟服务列为该架构的典型组件,并强调没有一个单独的项目或厂商产品线能独自构成一个 Streamhouse。
- 当前的交付物边界:这一批发布的是定义与商标承诺,没有规范文本、没有一致性测试套件、没有基准。
行业影响
五家互为竞争对手的流式厂商能为同一个名词签一份免费使用承诺,说明他们都判断这个品类的价值在「被共同做大」而不是「被一家占住」——这也是 AWS 收购 DuckLabs 之后开放表格式一侧已经发生的格局在流式一侧的回声。对使用者而言,眼下能拿到的只有一份定义:把它当选型依据还太早,把它当讨论实时架构的公共词汇已经够用。真正值得盯的是后续有没有出现规范与互操作测试,那才是这个工作组能否从市场动作变成技术动作的分水岭。
相关链接
- Aiven, Confluent, Redpanda, StreamNative and Ververica Form Streamhouse Working Group
- Streamhouse 定义
- Streamhouse 商标承诺
编者评
四条放在一起看,是一次相当一致的边界内移:ClickHouse 把 Iceberg、Prometheus、Trino 从「要对接的外部系统」变成引擎里的一个 ENGINE、一个 HTTP handler、一种 dialect;RisingWave 把 sink 换源与并行度调整从「停机窗口里的操作」变成运行期的一条 DDL;DuckDB-Wasm 把数据库文件从服务端搬进浏览器沙箱;Streamhouse 工作组把一个架构名词从各家自己的市场话术搬进一份可公开引用、带商标承诺的定义。搬进来之后,原来那个系统不再是对等协作者,而变成一个被兼容的对象,兼容到什么深度由搬的这一方决定,也就由这一方负责——ClickHouse 的 Trino 方言只映射约 340 个函数且标注实验性,DuckDB 的持久化依赖应用自己掌握 checkpoint 时机,RisingWave 给出能力也列出五条会中断现有部署的变更,Streamhouse 目前只有定义没有规范。代价没有变小,只是从「跨系统协作的摩擦」变成了「写进文档的能力边界」,而后者至少是可以逐条核对的。本期没有中文厂商的产品级更新:阿里云社区站 9 月 21—22 日的新帖集中在模型与 API 网关,火山引擎与墨天轮的可见更新停在 9 月中旬,「EMR Serverless StarRocks 与 DLF 直连」一文的技术细节无法从官方页面核实发布时间,按不可核验处理未采用。还有一条留作下期线索:Apache Iceberg 1.12.0-rc1 于 9 月 22 日 00:05 UTC 打版,Vol.72 已报过 rc0,等官方 changelog 出来再展开。