惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
MongoDB | Blog
MongoDB | Blog
Engineering at Meta
Engineering at Meta
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
Know Your Adversary
Know Your Adversary
月光博客
月光博客
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
NISL@THU
NISL@THU
爱范儿
爱范儿
S
Securelist
博客园 - 叶小钗
C
CERT Recently Published Vulnerability Notes
Recorded Future
Recorded Future
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
G
GRAHAM CLULEY
P
Proofpoint News Feed
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
C
Cyber Attacks, Cyber Crime and Cyber Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
Jina AI
Jina AI
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
博客园 - 【当耐特】
H
Help Net Security
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
列存引擎内核 — 系列规划
Liao Tonglang · 2026-06-18 · via 土法炼钢兴趣小组的算法知识备份

列存引擎内核 — 系列规划

本文是写作规划,不是可发布正文。主选 ClickHouse 作为拆解对象,DuckDB 作为嵌入式/OLAP 对照;不写泛泛的「列存概念」科普。


一、为什么写这个系列

1.1 存储引擎三角的缺口

已有内容 引擎类型 视角
postgresql-kernel/ (26) 行存 OLTP B-Tree + MVCC + WAL
db/lsm-tree/ (9) 写优化 LSM MemTable + SSTable + Compaction
storage/ (79) 通用原理 含列存概念但未落到具体实现
db-frontier/ (25) AI 原生 DB 前沿 向量/HTAP,非经典列存内核

结论:读者理解行存(PG)和写优化(LSM)后,缺 读优化列存 的完整源码级拆解。ClickHouse 是开源列存工程标杆;DuckDB 代表「嵌入式分析」路径——两者对照覆盖 OLAP 主战场。

1.2 为什么选 ClickHouse(主)+ DuckDB(辅)

维度 ClickHouse DuckDB
源码 C++,结构清晰,MergeTree 家族完整 C++11,向量化执行教科书
文档 官方 MergeTree 文档详尽 官方 Internals 文档
生产案例 国内大量 OLAP/日志分析 数据科学、SQLite 替代分析
与 PG 关系 常作 PG 分析副本/外表 pg_duckdb 扩展兴起
系列篇幅 主系列 15–18 篇 3–4 篇对照/专题

1.3 系列定位

列存 = 存储布局 + 向量化执行 + 合并策略 + 分布式(可选)

不写 SQL 教程,写: - 为什么列存 scan 1 列比行存读整行快(含 CPU cache / SIMD) - MergeTree part 如何 merge、为什么 merge 是列存的心脏手术 - PRIMARY KEY 在 ClickHouse 里不是唯一约束——排序键语义 - 向量化 volcano vs 向量批处理(morsel-driven)


二、核心问题与目标读者

2.1 六个关键问题

  1. 列存文件在磁盘上长什么样? → 第 1、2 章:Part、Column、Mark、Granule、压缩块。

  2. 一次 SELECT 如何从 part 读到向量批? → 第 3、4 章:Read path、Mark Range、PREWHERE、向量化执行。

  3. MergeTree 的 merge 到底在合并什么? → 第 5、6 章:Merge 算法、TTL、Mutation vs Merge。

  4. ClickHouse 的「索引」是什么? → 第 7 章:稀疏主键索引、跳数索引(minmax/set/bloom)、与 B-Tree 的本质差异。

  5. 分布式表如何工作? → 第 8、9 章:Local table、Distributed、ReplicatedMergeTree、ZooKeeper/ Keeper 协调。

  6. 列存生产环境会出什么事故? → 第 14–16 章:Parts 过多、merge 跟不上、mutation 阻塞、副本延迟、内存 OOM。

2.2 目标读者

  • 数据平台工程师、OLAP 开发者、从 PG/MySQL 转 ClickHouse 的 DBA
  • 先修:SQL、postgresql-kernelstorage 索引章节、基本 C++ 阅读能力
  • 不假设:已有 ClickHouse 运维经验

三、篇目结构(主系列 16 篇 + DuckDB 专题 3 篇)

第一部分:存储格式(第 1–3 章)

第 1 章:列存基础与 ClickHouse 架构

  • 行存 vs 列存:带宽、压缩、向量化三角
  • ClickHouse 进程模型:Server、MergeTreeBackgroundExecutor
  • 表引擎概览:MergeTree 家族地图
  • 源码入口:src/Storages/src/Databases/

第 2 章:MergeTree Part 文件格式

  • Part 目录结构:columns.txtchecksums.txt.bin.mrk.idx
  • Column 文件:压缩块、Granule、Mark 文件语义
  • 实验:clickhouse-local 建表 + 查看 data/ 目录
  • 源码:src/Storages/MergeTree/MergeTreeDataPart*

第 3 章:压缩与编码

  • LZ4、ZSTD、Delta、DoubleDelta、Gorilla(时序)
  • 编码选择与列类型
  • 实验:同列不同编码的压缩比 benchmark(本机,≥3 轮)
  • PG 对照:TOAST 压缩 — 不同优化目标

第二部分:读取路径(第 4–7 章)

第 4 章:向量化执行引擎

  • Block 结构:列向量 batch
  • 算子 pipeline:filter、project、aggregate 的向量实现
  • 与 volcano 模型对比(引用 PG 执行器 #12-executor
  • 源码:src/Processors/src/Columns/

第 5 章:查询读取路径

  • Mark Range 定位 Granule
  • PREWHERE vs WHERE
  • 并行读:max_threads、parts 级并行
  • 实验:EXPLAIN indexes=1 输出解读

第 6 章:Merge 与 Mutation

  • Merge 触发条件、merge selector
  • ReplacingMergeTree、CollapsingMergeTree 语义
  • Mutation(ALTER UPDATE/DELETE)的异步路径与危害
  • 源码:MergeTreeDataMergerMutator

第 7 章:索引与跳数索引

  • PRIMARY KEY = 排序键 ≠ 唯一
  • Data Skipping Index:minmax、set、bloom_filter
  • 与 PG B-Tree(postgresql-kernel/14-btree)对照表

第三部分:分布式与高可用(第 8–10 章)

第 8 章:ReplicatedMergeTree

  • Log entry、ZooKeeper/Keeper 路径
  • 副本同步、recovery
  • 实验:双节点副本 + 断网观察

第 9 章:Distributed 引擎

  • 分片键、分布式查询路由
  • GLOBAL IN/JOIN 的代价
  • 与 PG Citus / 分布式系列边界

第 10 章:物化视图与增量管道

  • Materialized View 触发机制
  • Kafka 引擎 + MV 典型架构
  • 坑:MV 目标表引擎选择错误

第四部分:DuckDB 对照专题(第 11–13 章)

第 11 章:DuckDB 架构与嵌入式 OLAP

  • 进程内、无服务器
  • Storage:Row Group + Column Segment
  • 与 ClickHouse 部署模型差异

第 12 章:DuckDB 向量化与 Pipeline

  • Morsel-driven parallelism
  • 源码:src/execution/src/storage/

第 13 章:ClickHouse vs DuckDB 选型

  • 规模、并发、嵌入、联邦查询(pg_duckdb)
  • 决策树,不排名

第五部分:运维实战(第 14–16 章)

第 14 章:监控与系统表

  • system.partssystem.mergessystem.replication_queue
  • 关键指标:parts 数、merge 延迟、memory tracking

第 15 章:经典故障模式

  • Too many parts
  • Merge 跟不上 insert
  • Mutation 堆积
  • 副本延迟 / lost replica
  • OOM:max_memory_usage

第 16 章:配置陷阱与容量规划

  • parts_to_throw_insert / parts_to_delay_insert
  • merge_max_block_size
  • max_bytes_to_merge_at_max_space_in_pool
  • 磁盘:SSD vs HDD merge 策略

四、依赖关系

1 → 2 → 3 → 4 → 5
        ↓       ↓
        6 ← 7   8 → 9
                ↓
               10
11 → 12 → 13(DuckDB,可与 4–7 并行)
14 → 15 → 16

五、阅读路径

路径 篇目 适合
OLAP 开发者 1→2→4→5→7 理解读写
平台/运维 1→6→8→14→15→16 集群稳定
嵌入式分析 11→12→13 DuckDB
从 PG 来 1→7→5 + PG 14 对照 索引语义差异

六、来源台账

A 级

  • ClickHouse 源码(标注 release,如 24.3
  • ClickHouse 官方文档:MergeTree、Replication
  • DuckDB 源码 + https://duckdb.org/docs/internals/
  • 论文:MonetDB/X100(向量化)、C-Store(列存)

B 级

  • Altinity / ClickHouse 官方博客(版本标注)

七、实验台账

环境 | ClickHouse 24.x single node + 可选 2-node replica |
工具 | clickhouse-clientclickhouse-local、系统表 |
数据集 | hits 样本或 clickhouse-benchmark 默认 |

实验
2 列文件 hex 结构对照文档
3 编码压缩比表
5 PREWHERE 行数对比 EXPLAIN
6 触发 merge + 观察 system.merges
8 副本 lag 人工制造
15 too many parts 复现(测试环境)

八、系列联动

系列 联动
postgresql-kernel/ 执行器、B-Tree、监控对照
db/lsm-tree/ Compaction vs Merge 对照
storage/ 压缩、块设备
observability/ 日志/trace 写入 ClickHouse 场景

九、边界

不承诺

  • 替代 ClickHouse 官方文档
  • Cloud 托管版(ClickHouse Cloud)内部实现
  • Spark/Flink 批流框架全文
  • 实时数仓业务建模

十、写作顺序

  1. index.md
  2. 第 1、2、3 章(格式基础)
  3. 第 4、5 章(读路径)
  4. 第 6、7 章(merge 与索引)
  5. 第 14、15、16 章(运维,可与 8–10 交错)
  6. 第 8、9、10 章(分布式)
  7. DuckDB 11–13

十一、待确认问题

  1. ClickHouse 版本锚定:24 LTS?
  2. Keeper 替代 ZooKeeper 是否作为默认写法?
  3. DuckDB 3 篇是否并入主 index 还是子目录 duckdb/
  4. 是否增加 MergeTree 以外引擎(如 S3Queue)专章?

规划版本:v1,2026-06-18 目录建议:post/db/columnar-engine/

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-18 · database / storage

【列存引擎内核】ClickHouse 与 DuckDB 源码级拆解

主选 ClickHouse 拆解 MergeTree 存储格式、向量化执行与分布式协调;DuckDB 作为嵌入式 OLAP 对照。覆盖列存文件布局、merge 机制、跳数索引与生产故障模式,面向数据平台工程师与从 PG/MySQL 转 OLAP 的 DBA。