元数据卡
维度 值 难度 (进阶) 前置 全卷内容综合 关键词 OLTP、OLAP、HTAP、技术选型、Lambda 架构、Kappa 架构、Data Lakehouse 代码语言 无(纯架构分析)
你的进度
你站在数据堡垒最高的城墙上。下面是你走过的路:关系型仓库(PostgreSQL)、KV 储物间(Redis)、文档作坊(MongoDB)、宽列厂房(Cassandra)、分析大厅(ClickHouse)、分仓网络(CockroachDB)、传送带系统(Kafka)——所有你能想到的存数据的方式,尽收眼底。
老陈站在你旁边,递给你一张大大的地图——上面画着每座建筑的定位、强项、弱点。这就是最后一章:站在高处,俯瞰整个数据领域,知道什么场景用什么系统。
你的任务
这一章帮你完成三件事:
- 理解 OLTP、OLAP、HTAP 的完整图景
- 掌握技术选型的决策逻辑和铁律
- 回顾全书脉络——从 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——需要一套引擎支持两种存储格式。
| 维度 | OLTP | OLAP | HTAP |
|---|---|---|---|
| 操作特征 | 短、高频、小范围(铁匠铺) | 长、低频、大范围(季度盘库) | 混合 |
| 操作类型 | SELECT/INSERT/UPDATE 少量行 | 扫描+聚合+GROUP BY | |
| 数据量/次 | KB-MB | GB-TB | 混合 |
| 每秒操作数 | 千-十万级 | 几十-几百 | 混合 |
| 延迟要求 | 毫秒级 | 秒-分级 | 两者兼顾 |
| 存储格式 | 行存(B+树/LSM-Tree) | 列存 | 双格式或统一格式 |
| 索引 | B+树、Hash、全文 | 稀疏索引、ZoneMap、Bloom Filter | 两者 |
| 典型系统 | PostgreSQL MySQL | ClickHouse DuckDB | TiDB SingleStore Aurora DSQL |
| 副本配置 | 主从、Paxos/Raft | 列存副本 | 行存主本 + 列存副本 |
2. 技术选型决策树
往下走到具体的技术选型时,决策框架长这样:
你的场景
需要 ACID 事务? 不需要或部分需要
是
文档 缓存/简单KV
(MongoDB) (Redis)
单机足以 分片或分布式 数据必须有序
(时间序列)
PostgreSQL
MySQL Cassandra
TiDB 跨Region TimescaleDB
Cockroach
高可用+强一致
需要 SQL
CockroachDB
YugabyteDB选型的铁律:
选最简单的方案,直到它撑不住。PostgreSQL 能解决 80% 的问题。不要为"未来可能的需要"引入 Redis,不要为"有一天数据量大"上 Cassandra。用 PostgreSQL → 分库分表 → CockroachDB。每次换方案的前提是:当前方案确实成了瓶颈,且你测量过瓶颈在哪。
不要混合 workload。同一个 PostgreSQL 实例又是 OLTP 又是 OLAP——大查询吃死 CPU,小事务响应时间从 5ms 飙到 500ms。把 OLTP 和 OLAP 分到不同的实例(甚至是不同的系统)。PostgreSQL 做 OLTP,ClickHouse 做 OLAP。中间用 ETL Pipe 连接。
缓存是最后的手段,不是第一选择。先用 PostgreSQL 做慢查询的索引优化,用分区表,用物化视图。这些都试过了还不满足性能,再考虑 Redis 缓存。过早缓存引入了一致性问题和运维开销。
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 + WiredTiger | Schema-free、内嵌文档减少 JOIN、自动分片 | 复杂 JOIN 性能差、多文档事务有折损 |
| Redis | 内存 KV 存储 | 哈希表 + 数据结构 | 微秒级速度、数据结构丰富、极简操作 | 数据持久化弱、内存贵 |
| Cassandra | 宽列存储 | LSM-Tree | 极致写入扩展、无单点、一致性哈希自动分片 | 查询模式受限、冷读性能差、运维复杂 |
| Neo4j | 图数据库 | 原生图存储 | 关系遍历速度远快于 RDBMS、直观关系建模 | 分析能力弱、生态较小 |
分析型数据库
| 系统 | 定位 | 存储格式 | 强项 | 弱项 |
|---|---|---|---|---|
| ClickHouse | 实时 OLAP | MergeTree + 列存 | 极快聚合查询、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 (训练数据读取)这还不是完美的解决方案——实时处理和离线处理的延迟要求差异仍然存在——但它在数据一致性和管理成本上已是大进步。
常见陷阱
"HTAP 是万能方案":HTAP 处理事务和分析 workload,但你的写入和查询压力在共享资源上竞争。TiDB 用行存(TiKV)+ 列存(TiFlash)两套引擎,行存和列存之间有复制延迟。HTAP 不是银弹——如果 OLTP 和 OLAP 的负载严重不对等,拆开仍然更好。
"用 Redis 做持久化数据库":Redis 是缓存/内存数据存储,不是持久化数据库。即使开启 AOF + RDB,数据也可能丢失(异步刷盘、AOF 追加不是 WAL)。如果是"丢了就完了"的数据——走 PostgreSQL/MongoDB。
"开箱即用的系统不用理解原理":你可以不看源码用 Redis,但不知道 Redis 单线程模型你就不知道为什么某些命令(KEYS*)会阻塞所有操作。你可以不看源码用 MongoDB,但不知道它的 WiredTiger 缓存是什么你就不知道为什么内存占用越来越高。运维一个你不理解的数据库——等于开着一辆你拆不掉刹车的车。
"技术选型看流行度就够了":流行度意味着生态丰富(文档、社区、招聘),但不一定适合你的场景。2018-2020 年很多人因为"大家都在用"选择了 MongoDB,发现自己的业务全是强实体关系——最后灰头土脸地迁回 PostgreSQL。流行度是选型的加分项,不是决策项。
"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 语法开始,也不从存储格式开始——从"它解决了什么问题"开始。
——数据堡垒向导