Skip to content

元数据卡

维度
难度(进阶)
前置全卷内容综合
关键词OLTP、OLAP、HTAP、技术选型、Lambda 架构、Kappa 架构、Data Lakehouse
代码语言无(纯架构分析)

你的进度

你站在数据堡垒最高的城墙上。下面是你走过的路:关系型仓库(PostgreSQL)、KV 储物间(Redis)、文档作坊(MongoDB)、宽列厂房(Cassandra)、分析大厅(ClickHouse)、分仓网络(CockroachDB)、传送带系统(Kafka)——所有你能想到的存数据的方式,尽收眼底。

老陈站在你旁边,递给你一张大大的地图——上面画着每座建筑的定位、强项、弱点。这就是最后一章:站在高处,俯瞰整个数据领域,知道什么场景用什么系统。

你的任务

这一章帮你完成三件事:

  1. 理解 OLTP、OLAP、HTAP 的完整图景
  2. 掌握技术选型的决策逻辑和铁律
  3. 回顾全书脉络——从 SQL 到分布式——你走过的路用全景图连接起来

破局 · 溯源

1. OLTP vs OLAP vs HTAP 全景

场景一:每秒 10000 件宝物入库

你·负责数据堡垒的仓库系统。不是挂名——是真·仓库总管。每天几万件宝物的进出都从你眼皮底下过。

守卫在登记宝物、归档属性、分配库位、更新库存。每次只处理几十行数据——但每秒几百次。高频、短小、不断。这就是 OLTP。

这就是 OLTP(Online Transaction Processing,在线事务处理)

  • 每次操作处理几十行到几百行数据
  • 关心的是"这件宝物能不能入库成功"
  • 指标是 TPS——每秒事务数
  • 典型系统:PostgreSQL、MySQL、SQL Server

场景二:统计上个月的宝物入库总量

一天守卫主管老李走过来:"铁壁,帮我拉一下——上个月每类宝物的入库量,跟去年同期比怎么样?"

你不可能一件宝物一条记录地查。你要扫几百万行,然后算出汇总。

这就是 OLAP(Online Analytical Processing,在线分析处理)

  • 每次查询扫描数百万到数十亿行
  • 关心的是"This quarter's YoY growth"
  • 指标是查询响应时间
  • 典型系统:ClickHouse、Snowflake、Redshift、DuckDB

场景三:实时宝物追踪,做库存报表

你负责堡垒的核心库房。守卫在终端上点"调阅宝物"——OLTP 系统瞬间创建一条调阅记录。安全法阵(异常检测)需要实时读取流数据做判断——今天的调阅流水、昨天的库存变化、上个月的高频访问记录。管理团队也要在同一块屏上查"过去 1 小时高风险宝物调阅次数"的实时报表。

单一 OLTP 或 OLAP 都无法满足这种 "写入即分析" 的需求。这就是 HTAP(Hybrid Transactional/Analytical Processing,混合事务/分析处理)

HTAP 的最大挑战:OLTP 用行存(B+树/LSM-Tree)优化点查和短事务,OLAP 用列存优化大扫描和聚合。同一套数据,服务两种 workload——需要一套引擎支持两种存储格式。

维度OLTPOLAPHTAP
操作特征短、高频、小范围(铁匠铺)长、低频、大范围(季度盘库)混合
操作类型SELECT/INSERT/UPDATE 少量行扫描+聚合+GROUP BY
数据量/次KB-MBGB-TB混合
每秒操作数千-十万级几十-几百混合
延迟要求毫秒级秒-分级两者兼顾
存储格式行存(B+树/LSM-Tree)列存双格式或统一格式
索引B+树、Hash、全文稀疏索引、ZoneMap、Bloom Filter两者
典型系统PostgreSQL MySQLClickHouse DuckDBTiDB SingleStore Aurora DSQL
副本配置主从、Paxos/Raft列存副本行存主本 + 列存副本

2. 技术选型决策树

往下走到具体的技术选型时,决策框架长这样:

你的场景 
 
 需要 ACID 事务? 不需要或部分需要
 

 
 文档 缓存/简单KV
 (MongoDB) (Redis)
 单机足以 分片或分布式 数据必须有序
 (时间序列)
 PostgreSQL 
 MySQL Cassandra
 TiDB 跨Region TimescaleDB
 Cockroach 
 
 高可用+强一致
 需要 SQL
 
 CockroachDB
 YugabyteDB

选型的铁律

  1. 选最简单的方案,直到它撑不住。PostgreSQL 能解决 80% 的问题。不要为"未来可能的需要"引入 Redis,不要为"有一天数据量大"上 Cassandra。用 PostgreSQL → 分库分表 → CockroachDB。每次换方案的前提是:当前方案确实成了瓶颈,且你测量过瓶颈在哪。

  2. 不要混合 workload。同一个 PostgreSQL 实例又是 OLTP 又是 OLAP——大查询吃死 CPU,小事务响应时间从 5ms 飙到 500ms。把 OLTP 和 OLAP 分到不同的实例(甚至是不同的系统)。PostgreSQL 做 OLTP,ClickHouse 做 OLAP。中间用 ETL Pipe 连接。

  3. 缓存是最后的手段,不是第一选择。先用 PostgreSQL 做慢查询的索引优化,用分区表,用物化视图。这些都试过了还不满足性能,再考虑 Redis 缓存。过早缓存引入了一致性问题和运维开销。

  4. Kafka/Pulsar 不是"微服务默认组件"。消息队列引入的复杂度(消息丢失/重复、死信、延迟监控、重试策略)是有成本的。如果你只有两个服务 A→B 的通信,且流量不高——直接 HTTP 或 gRPC 调用。消息队列是为解耦削峰服务的,不是通用通信方案。

3. 数据库全览表

关系型数据库

系统定位存储引擎复制强项弱项
PostgreSQL最全面的开源关系型数据库堆存储 + MVCC流复制、逻辑复制扩展丰富(JSONB/PostGIS/搜索)、ACID 全、查询优化器强原生无分布式、水平扩展需插件(Citus)
MySQL最流行的 Web 关系型数据库InnoDB(B+树)主从异步/半同步生态最大、运维成熟度最高、InnoDB 性能稳定复制延迟、插件生态(/如 JSON)不如 PG
SQLite嵌入式零配置数据库B+树零配置、单文件、嵌入式首选有限并发、无网络协议

NoSQL 数据库

系统定位存储模型强项弱项
MongoDB文档数据库BSON + WiredTigerSchema-free、内嵌文档减少 JOIN、自动分片复杂 JOIN 性能差、多文档事务有折损
Redis内存 KV 存储哈希表 + 数据结构微秒级速度、数据结构丰富、极简操作数据持久化弱、内存贵
Cassandra宽列存储LSM-Tree极致写入扩展、无单点、一致性哈希自动分片查询模式受限、冷读性能差、运维复杂
Neo4j图数据库原生图存储关系遍历速度远快于 RDBMS、直观关系建模分析能力弱、生态较小

分析型数据库

系统定位存储格式强项弱项
ClickHouse实时 OLAPMergeTree + 列存极快聚合查询、SQL 兼容好、单机吞吐高不擅长点查、并发不高、JOIN 弱
DuckDB嵌入式 OLAP列存 + 向量化零配置嵌入式分析、比 Pandas 快 10x+、SVL 强非分布式、不服务高并发
Snowflake云原生 OLAP列存 + 云存储分离零运维、弹性伸缩、SQL 兼容完美贵、依赖特定云
Apache Druid时序 OLAP列存 + 倒排索引时间序列预聚合、实时摄入、亚秒级即席查询数据修改成本高、SQL 兼容有限

流处理与消息系统

系统定位核心设计强项弱项
Kafka分布式消息 + 流处理日志结构 + Partition高吞吐、堆积能力强、流处理生态复杂路由差、需运维 ZooKeeper/KRaft
Apache Spark分布式计算框架RDD + DAG批流一体、统一编程模型(SQL/ML/Streaming)流延迟不如 Flink、内存消耗大
Apache Flink实时流处理Dataflow + Stateful真正毫秒级实时、Exactly Once、Checkpoint学习曲线陡、批处理不如 Spark

4. 典型架构模式

Lambda Architecture

根本思路:批处理和流处理并行处理同一份数据,最后合并结果。

数据源 → 流处理层(Speed Layer) → 实时视图
 → 批处理层(Batch Layer) → 批视图
 
 → 合并 → 最终查询响应

优点:实时视图用低延迟保证"新鲜度",批视图用高精度保证"正确性"。两套互相兜底。 缺点:两套代码逻辑维护两倍工作。实时和批处理的"合并"环节复杂。如果实时算了推荐分数,批处理重新算了一遍——同一份逻辑两个实现,Bug 可能不一致。

典型实现:Kafka(数据管道)+ Spark Streaming / Storm(实时)+ Hadoop MapReduce / Spark Batch(批)→ 合并查询。

Kappa Architecture

Jay Kreps(Kafka 作者)在 2014 年提出:只用一套流处理引擎处理所有数据,把批处理视为流处理的特殊形式(重放历史数据)。

数据源 → 消息队列(Kafka)→ 流处理 → 查询层

 重放历史数据(就当批处理)

优点:只维护一套代码。实时和"批处理"(历史重放)共享同一套逻辑。 缺点:某些计算(开窗汇总、复杂 ETL)在流处理中实现困难。Kappa 依赖消息队列的"重放能力"——Kafka 能保留数据几天到几周,但几个月甚至几年的历史数据需要额外的存储策略。

典型实现:Kafka(统一数据湖)+ Kafka Streams / Flink(流处理)→ 状态存储 / 查询数据库。

Data Lakehouse

最新的架构趋势:把数据湖(Data Lake)的弹性和开放性 + 数据仓库(Data Warehouse)的 ACID 和管理能力结合起来。

 
 Data Lakehouse 
 
 开放表格式(Delta Lake / 
 Apache Iceberg / Hudi) 
 
 数据湖存储(S3 / ADLS / HDFS) 
 
 
 ↕ ↕
 Spark DuckDB/Trino
 (ETL/ML) (SQL 查询/分析)

为什么要 Lakehouse

传统架构把你的数据分开存在两个地方:

  • 数据湖(S3/HDFS + Parquet/ORC):便宜、开放、存一切。但写入时没有 ACID,数据被覆盖了也不知道。
  • 数据仓库(Snowflake/Redshift):查询性能好、ACID 保证、但贵、数据格式不开放(只有这个仓库能读)。

Lakehouse 在数据湖之上加了一层开放表格式

  • Delta Lake(Databricks):提供 ACID 事务 + Schema 演变 + Time Travel
  • Apache Iceberg(Netflix):突出的分区管理和隐藏分区功能
  • Apache Hudi(Uber):突出的写入性能和 UPSERT 能力

这一层让数据湖"仓库化"——支持 ACID、Time Travel、并发写入——保持数据格式开放,Spark、Presto/Trino、DuckDB、Flink 都能用同一份数据。

现实中的组合

开发者 → DuckDB(本地探索)→ Iceberg 表(S3)→ Trino(Ad-hoc 查询)
 → Spark(夜间 ETL)
 → Flink(实时导入)

所有这些引擎读同一份数据,不需要 ETL 搬运。


深入冒险:一份数据,多个引擎

Lakehouse 的最大价值不在技术,在团队协作

没有 Lakehouse 时的图景:

  • 数据工程师:Hive(HDFS)→ ETL 产出宽表 → 写入 Redshift
  • 数据科学家:把 Redshift 数据从 S3 拉到 Notebook → Pandas 加工 → 提交模型
  • 分析师:Redshift 查询慢 → 自己从 S3 拉 Parquet 到本地 → 用本机 PostgreSQL 分析
  • 报表:从 Redshift 读
  • 实时管道:从 Kafka 写 Flink → 写入 Elasticsearch

同一份"用户行为数据"在 5 个地方有不同副本,每个副本之间有数据不一致。

Lakehouse 试图做到:所有团队用同一份数据

S3 (Parquet + Iceberg) Trino (分析师 SQL)
 Spark (数据工程师 ETL)
 DuckDB (数据科学家本地探索)
 Flink (实时管道写入)
 ML Pipeline (训练数据读取)

这还不是完美的解决方案——实时处理和离线处理的延迟要求差异仍然存在——但它在数据一致性和管理成本上已是大进步。


常见陷阱

  1. "HTAP 是万能方案":HTAP 处理事务和分析 workload,但你的写入和查询压力在共享资源上竞争。TiDB 用行存(TiKV)+ 列存(TiFlash)两套引擎,行存和列存之间有复制延迟。HTAP 不是银弹——如果 OLTP 和 OLAP 的负载严重不对等,拆开仍然更好。

  2. "用 Redis 做持久化数据库":Redis 是缓存/内存数据存储,不是持久化数据库。即使开启 AOF + RDB,数据也可能丢失(异步刷盘、AOF 追加不是 WAL)。如果是"丢了就完了"的数据——走 PostgreSQL/MongoDB。

  3. "开箱即用的系统不用理解原理":你可以不看源码用 Redis,但不知道 Redis 单线程模型你就不知道为什么某些命令(KEYS*)会阻塞所有操作。你可以不看源码用 MongoDB,但不知道它的 WiredTiger 缓存是什么你就不知道为什么内存占用越来越高。运维一个你不理解的数据库——等于开着一辆你拆不掉刹车的车。

  4. "技术选型看流行度就够了":流行度意味着生态丰富(文档、社区、招聘),但不一定适合你的场景。2018-2020 年很多人因为"大家都在用"选择了 MongoDB,发现自己的业务全是强实体关系——最后灰头土脸地迁回 PostgreSQL。流行度是选型的加分项,不是决策项。

  5. "Lambda 架构是最好的实时架构":Lambda 架构的两套代码维护难度大。如果没有严格的"批处理永远正确 + 流处理永远实时"的需求,Kappa 更简单。大部分现代团队会走 Kappa + 离线重放来满足"实时 + 正确"的要求。


通关挑战

  • ** 热身(5 分钟)**:在 OLTP、OLAP、HTAP、KV、文档、图、宽列、消息队列这几个标签里,给以下系统各贴 1-2 个标签:PostgreSQL、ClickHouse、Redis、MongoDB、Neo4j、Cassandra、Kafka。
  • ** 挑战(30 分钟)**:画一个完整的数据流图——冒险者在堡垒里登记了一件宝物。这件宝物的信息从登记到持久化的完整路径是什么?经过哪些系统?每个系统承担什么角色?画完以后标注"如果这个系统挂了,会怎样?"
  • ** 排障**:你的 PostgreSQL 实例在 OLTP 和 OLAP 请求混跑时,OLTP 响应时间从 5ms 飙升到 500ms。怎么定位和解决?

验收标准

读完后你能:

  • 准确区分 OLTP/OLAP/HTAP,并知道它们的典型系统
  • 在给定的业务场景中做出合理选型
  • 对照数据库全览表认全主流数据系统
  • 解释 Lambda、Kappa、Lakehouse 三种架构的核心差异
  • 在使用一个数据系统前,知道需要了解它的哪些底层原理

常见卡点

  • OLTP 和 OLAP 的严格边界:现实中没有严格的边界。PostgreSQL 可以做一些分析工作,ClickHouse 也能做点查。关键判断是"哪个是主 workload"——如果你主要做点查和事务,用 OLTP 系统。如果主要做大范围聚合,用 OLAP 系统。
  • "为什么不用同一套系统做所有事":因为底层优化方向相反。行存优化点查,列存优化聚合。一个引擎无法把两件事做到最优。折中方案(HTAP)付出了性能折中的代价。
  • Lakehouse 是替代数据仓库的吗:不是替代,是进化。数据仓库的 ACID、性能优化、管理能力保留——把存储层移到兼容对象存储的开放格式上,保持这些能力。Lakehouse + 数据仓库的混合部署也很常见。

现在不需要理解

  • ClickHouse 的 MergeTree 引擎内部细节
  • Delta Lake / Iceberg / Hudi 的深入对比
  • Flink Checkpoint 的完整实现
  • 数据湖的 Iceberg/Hive 分区膨胀问题

旅人笔记

技术选型的核心不是"最好的工具",而是"最合适的工具"。OLTP/OLAP/HTAP 帮你看清 workload,数据库全览帮你知道有什么枪,Lambda/Kappa/Lakehouse 帮你搭出完整的架构。但最重要的能力是——在每次选型前先测量,在每次引入新系统前先质疑。

下一站预告


全卷收尾:从 SQL 到分布式的一条链

你站在数据堡垒的城墙上,俯瞰整个数据领域。晚风从龙鳞河的方向吹过来,远处星辉城的灯塔刚点亮。你从最高的垛口往下看——每一座建筑你都进去过,每一个系统的脾气你都摸过。

你回想这一路:

Part 1,你从文件方案不够用的痛点出发,学了 SQL、关系代数、ER 图——明白了数据不是随便一放就行的,它有数学基础。

Part 2,你用 B+树理解 MySQL InnoDB,用 LSM-Tree 理解 LevelDB/Cassandra,用列存理解 Parquet/ORC,用哈希索引理解内存数据库。你发现——数据库"快"的秘密,藏在存储格式里。

Part 3,你从查询优化器走到向量化执行。你理解了"SELECT * FROM adventurers WHERE adventurer_id = 1"这行语句在数据库里走了多少路——解析、优化、执行。你还看到了 ClickHouse 和 DuckDB 怎么用 SIMD 在一条 CPU 指令里处理 8 个数字。

Part 4,你从 ACID 出发,理解了 MVCC、2PL、OCC、封锁协议。你看清了数据库的"事务"不是魔法——是用锁、版本号、日志一步一步堆出来的严谨机制。

Part 5,你看到了数据系统在规模压力下如何演化。NoSQL 四大家族、分布式数据库的共识和分片、消息队列的异步解耦——最后一张全景图把所有的工具放到一张桌上,让你自己选。


你把所有这些连接在一起,会看到一个清晰的链条:

业务增长 → 数据变多 → 关系型数据库太慢 → NoSQL/分布式数据库
 → 需要异步通信 → 消息队列
 → 需要分析 → 数据仓库/OLAP
 → 需要实时分析 → 流处理 + 批处理
 → 需要统一 → Lakehouse

这不是一条单向的道路。它是循环的、嵌套的、不断演化的。你今天学的东西,五年后可能有一半会被新的技术替代——但你学会的思维方式不会:看到什么工具,先问它解决什么问题、在什么场景下最强、在什么场景下坑最多。

你过去 18 章学会的不是十八个孤立的知识点,而是一套"数据生态世界观"

  • 看到一条查询,你知道它经过了优化器→执行器→存储引擎
  • 看到一个事务,你知道它经过了锁→日志→MVCC
  • 看到一个分布式数据库,你知道它在分片和共识之间做权衡
  • 看到一个数据架构图,你知道它用 Lambda/Kappa/Lakehouse 中的哪种方式工作

数据堡垒的城墙,你已经站上去了。

但这只是第一块地图。

在 Vol 6(软件工程),你会在工匠之都学到如何制造一流的数据管道工具。在 Vol 12(数据处理与数据科学),你会回到这里——用你已经理解的数据系统,支撑起大规模的数据处理和 ML 流水线。在 Vol 13(AI/ML),数据堡垒会成为你训练模型的原料仓库。

路还很长。但你手里的十八根铁链,已经足够让你在数据堡垒里站稳脚跟——再复杂的系统拆开来看,无非就是这几张牌的不同组合。

数据堡垒之旅,到此暂告一段落。下一站:工匠之都。


感谢你阅读到这一句。

整卷五部分、18 章、约 15 万字——从关系代数到分布式一致性——是一次深入数据系统内核的远征。

如果你只从这一卷带走一句话,希望它是:

理解一个数据系统,不从 SQL 语法开始,也不从存储格式开始——从"它解决了什么问题"开始。

——数据堡垒向导

Built with VitePress | Software Systems Atlas