数据系统
一、数据系统的三种基本形态(系统形态层)
从系统如何与时间和请求交互这一第一性原理出发,数据系统可以被划分为三种稳定形态:
1. 在线系统(Online / OLTP)
- 系统以**请求—响应**为基本交互模式
- 核心目标:低延迟、确定性响应
- 典型约束:并发控制、一致性、尾延迟
本质特征:
系统必须在“现在”对“单个请求”做出回应。
2. 批处理系统(Batch Processing)
- 系统面对的是**有限但规模巨大的历史数据**
- 以作业(Job)为执行单元
- 不要求即时反馈
本质特征:
系统关注的是“整体正确性”,而非“即时性”。
3. 流处理系统(Stream Processing)
- 数据以事件流形式持续到达
- 系统在事件发生后不久进行处理
- 介于在线与批处理之间
本质特征:
系统试图缩短“事件发生”与“被计算”之间的时间距离。
二、数据系统的核心质量属性(系统基石层)
无论系统形态如何变化,所有数据系统都必须在以下几个稳定维度上做权衡。
1. 可靠性(Reliability)
- **故障(Fault)**:系统偏离正常状态
- **失效(Failure)**:系统无法对外提供服务
可靠系统不是“不会出错”,而是:
在预期故障存在的前提下,系统仍能持续提供可接受的服务能力。
这要求系统具备:
- 故障检测能力
- 故障隔离能力
- 故障恢复能力
2. 可伸缩性(Scalability)
可伸缩性描述的是:
系统在负载增长时,维持性能的能力。
负载参数(Load Parameters)
负载必须被显式建模,例如:
- 请求速率
- 读写比例
- 数据规模增长速率
延迟的分布视角
- 平均值无法代表真实用户体验
- 中位数(p50)描述“典型体验”
- p95 / p99 描述系统在压力下的稳定性
关键认知:
可伸缩性并不存在银弹,它永远建立在一组被接受的系统假设之上。
3. 可维护性(Maintainability)
可维护性决定了系统的长期演化成本,包括:
- 可操作性:运维复杂度是否可控
- 简单性:系统是否能被人类理解
- 可演化性:系统是否允许渐进式修改
核心结论:
简单性不是功能少,而是抽象正确。
三、数据模型:现实世界的抽象方式(建模层)
数据模型的本质是:
应用如何理解和组织现实世界中的信息。
1. 多层抽象视角
- 应用层:领域概念
- 逻辑存储层:关系、文档、图等模型
- 物理层:字节、内存、电信号
2. 关系模型与文档模型的张力
关系模型:
- 擅长多对多关系
- 强一致性、明确结构
文档模型:
- 强调局部性与结构灵活性
- 一对多友好,多对多困难
历史视角:
文档模型在结构上,与 1970 年代的层次模型高度相似。
3. 阻抗不匹配(Impedance Mismatch)
- 应用使用对象与引用
- 数据库存储表与行
二者之间的张力,是架构复杂度的重要来源。
四、查询模型与执行模型(计算层)
1. 命令式 vs 声明式
- 命令式:描述“如何计算”
- 声明式:描述“要什么结果”
核心差异:
声明式语言将执行策略的选择权交给系统,从而释放并行优化空间。
2. 并行计算的抽象光谱
- SQL / CSS 选择器:高度声明式
- MapReduce / 函数式:中间形态
图查询语言(Cypher / SPARQL)本质上是对关系遍历的高层声明。
五、存储结构:写入、读取与时间(存储层)
1. 日志结构存储的本质
- 仅追加(append-only)
- 写入性能极高
- 读取依赖索引
压缩与合并(Compaction)
- 通过段合并消除冗余
- 通过墓碑记录(tombstone)表达删除
关键权衡:
写优化必然带来读复杂性。
2. 索引的角色
索引的本质是:
用额外空间换取读取时间。
六、事务处理与分析处理的分离(分析层)
1. OLTP 与 OLAP 的结构性冲突
- OLTP:短事务、高并发
- OLAP:扫描、聚合、低并发
解决方式:
通过数据复制与 ETL 实现职责隔离。
2. 列式存储与压缩
- 列存减少无关数据读取
- 高重复性带来高压缩率
3. 分布式分析系统(以 Dremel 为代表)
- 行列混合存储
- 查询执行树
- 掉队者(Straggler)处理
- 近似结果换取低延迟
七、数据编码与系统演化(演化层)
1. 数据跨越时间
数据不仅在系统间流动,也在过去与未来之间流动。
2. 兼容性原则
- 向后兼容:新代码读旧数据
- 向前兼容:旧代码读新数据
字段必须具备:
- 唯一标识
- 可选性或默认值
3. 读模式与写模式
通过分离作者模式与读者模式,系统得以在演化中保持运行。
4. 数据丢失的本质风险
旧代码覆盖式写回,是前向兼容失败的根源。
八、数据流动模式(系统边界层)
- 基于数据库:数据跨时间
- 基于服务:RPC 的兼容性约束
- 基于消息流:异步与解耦
九、数据系统的演进路径(系统演化模型)
一个典型数据系统的演进:
- 单体 OLTP
- OLTP + 离线分析
- 引入流处理
- 数据仓库 / 数据湖
- 统一数据平台
核心原则:
每一次演进,都是为了解决上一个阶段的主要瓶颈,同时引入新的复杂性。
关联内容(自动生成)
- [/中间件/数据库/数据库优化.html](/中间件/数据库/数据库优化.html) 涉及数据模型优化、存储结构治理、OLTP与OLAP融合等与数据系统架构密切相关的内容
- [/中间件/数据库/分布式数据库.html](/中间件/数据库/分布式数据库.html) 涉及OLTP/HTAP数据系统设计、水平扩展、分布式事务等高级数据系统架构内容
- [/数据技术/流处理.html](/数据技术/流处理.html) 涉及流处理系统设计、事件时间与处理时间、精确一次性语义等与数据系统三种基本形态中的流处理相关内容
- [/数据技术/数据处理.html](/数据技术/数据处理.html) 涉及批处理与流处理模型、计算架构等与数据系统形态层相关内容
- [/中间件/数据库/文档数据库.html](/中间件/数据库/文档数据库.html) 涉及数据模型设计、分布式架构、OLTP系统设计等与数据系统数据模型层相关内容
- [/数据技术/大数据.html](/数据技术/大数据.html) 涉及大数据系统架构、批处理与流处理、分布式数据系统设计等与数据系统架构相关内容
- [/中间件/数据库/数据库.html](/中间件/数据库/数据库.html) 涉及数据模型、查询优化、数据库架构等与数据系统建模层相关内容
- [/数据技术/数据架构.html](/数据技术/数据架构.html) 涉及数据系统架构设计、批处理vs流处理等与数据系统架构相关内容
- [/中间件/消息队列/Kafka/Kafka.html](/中间件/消息队列/Kafka/Kafka.html) 涉及流处理架构、分布式消息系统等与数据系统数据流动相关内容
- [/软件工程/架构/系统设计/分布式/分布式事务.html](/软件工程/架构/系统设计/分布式/分布式事务.html) 涉及分布式数据系统中的事务处理,与数据系统可靠性相关内容
- [/数据技术/数据集成.html](/数据技术/数据集成.html) 涉及数据系统中的数据流动、批处理与流处理集成等内容
- [/中间件/数据库/redis/Redis.html](/中间件/数据库/redis/Redis.html) 涉及数据模型设计、内存存储结构等与数据系统存储层相关内容
- [/数据技术/数据建模.html](/数据技术/数据建模.html) 涉及数据模型设计、OLTP系统建模等与数据系统建模层相关内容
- [/数据技术/Hadoop.html](/数据技术/Hadoop.html) 涉及批处理计算范式、分布式数据系统基础架构等内容
- [/数据技术/数据仓库.html](/数据技术/数据仓库.html) 涉及OLTP与OLAP系统隔离、数据系统演进等与数据系统分析层相关内容