本文档在 System Design 101 仓库中全面概述了数据库和存储系统。它涵盖了与数据持久化、存储解决方案和消息系统相关的基本概念、架构、模式和技术。有关补充数据库系统的缓存和性能优化策略的信息,请参阅缓存和性能优化。
数据库和存储系统构成了现代应用程序的支柱,作为维护数据完整性和可用性的持久层。这些系统管理数据如何在应用程序的不同组件之间存储、检索、组织和传输。
来源:README.md:120-167
数据库系统可以根据其数据模型进行分类,数据模型定义了数据的组织、存储和访问方式。
关系数据库将数据组织到具有预定义模式的表中,并使用 SQL(结构化查询语言)进行数据查询和操作。它们通过 ACID 属性在维护数据完整性方面表现出色。
流行的关系数据库包括
| 数据库 | 主要功能 | 常见用例 |
|---|---|---|
| PostgreSQL | 高级功能、可扩展性、JSON 支持 | 复杂应用程序、GIS、分析 |
| MySQL | 高性能、可靠性、易用性 | Web 应用程序、OLTP |
| Oracle | 企业级功能、可伸缩性、安全性 | 大型企业系统、银行 |
| SQL Server | 与 Microsoft 堆栈、BI 工具集成 | 以 Windows 为中心的企业应用程序 |
来源:README.md:147-149, README.md:151-154
NoSQL 数据库提供灵活的模式、水平可伸缩性和传统基于表的键值模型以外的专用数据模型。
文档数据库:将半结构化数据存储为文档(通常是 JSON 或 BSON)
键值存储:将数据存储为键值对,结构简单但性能高
列族存储:将数据存储在列族中,针对大型数据集的查询进行了优化
图数据库:优化高度连接数据的存储和查询
来源:README.md:140-142, README.md:160-162
专用数据库是为具有独特需求的特定用例而设计的
时间序列数据库 (TSDB):针对带时间戳或时间序列数据进行了优化
搜索引擎:专为全文搜索和复杂查询而设计
空间数据库:针对地理和空间数据进行了优化
分类账数据库:具有内置审计跟踪的不可变、仅追加数据库
来源:README.md:131-132, README.md:146-147
数据库使用特定的数据结构来组织数据,以实现高效的存储和检索。
B-Tree 与 LSM-Tree 对比:
| 特征 | B-Tree | LSM-Tree |
|---|---|---|
| 写入模式 | 原地更新 | 仅追加,带压缩 |
| 读取性能 | 点查找速度快 | 可能需要多次磁盘读取 |
| 写入性能 | 较慢(随机 I/O) | 较快(顺序写入) |
| 空间效率 | 效率较低(碎片化) | 效率较高(压缩) |
| 用例 | OLTP,读写平衡 | 写入密集型工作负载 |
来源:README.md:140-141, README.md:154-155
ACID(原子性、一致性、隔离性、持久性)属性可确保数据库中可靠的事务处理
来源:README.md:164-165
隔离级别控制事务如何相互交互
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 |
|---|---|---|---|---|
| Read Uncommitted(读未提交) | 可能 | 可能 | 可能 | 最高 |
| Read Committed(读已提交) | 避免 | 可能 | 可能 | 高 |
| Repeatable Read(可重复读) | 避免 | 避免 | 可能 | 中等 |
| 可序列化 | 避免 | 避免 | 避免 | 最低 |
来源:README.md:127-128, README.md:162-163
锁是用于控制对数据并发访问的机制
来源:README.md:121-122, README.md:162-163
垂直扩展涉及升级服务器硬件(CPU、RAM、存储)以处理增加的负载。虽然实现起来更简单,但它有固有的限制,并且可能成本高昂。
水平扩展将数据分布到多个服务器或实例,从而实现几乎无限的扩展,但增加了架构的复杂性。
来源:README.md:166-167
分片根据特定策略将数据分布到多个数据库实例中
分片注意事项:
来源:README.md:145-146, README.md:156-157, README.md:161-162
读副本是主数据库的副本,负责处理读取操作,分摊查询负载并提高读取性能。
实现挑战:
来源:README.md:121-122, README.md:155-156
一致性哈希提供了一种分发机制,可在节点数量变化时最大程度地减少重新分发。
一致性哈希的好处:
来源:README.md:159-160
| 存储类型 | 访问时间 | 容量 | 持久化 | 成本 |
|---|---|---|---|---|
| CPU 寄存器 | <1ns | KB | 易失性 | 最高 |
| 缓存(L1-L3) | 1-100ns | MB | 易失性 | 非常高 |
| 内存 | 100ns | GB | 易失性 | 高 |
| SSD | 10-100μs | TB | 持久性 | 中等 |
| HDD | 1-10ms | TB | 持久性 | 低 |
| 磁带 | 秒 | PB | 持久性 | 最低 |
来源:README.md:143-144, README.md:166-167
Amazon S3 等对象存储解决方案旨在大规模存储非结构化数据。
对象存储的关键用例:
来源:README.md:123-124, README.md:137-139
消息队列支持系统组件之间的异步通信,提供解耦、缓冲和可靠性。
来源:README.md:124-126, README.md:128-130, README.md:157-158
Apache Kafka 是一个分布式流处理平台,提供高吞吐量、容错的消息传递。
Kafka 关键概念:
来源:README.md:126-127, README.md:129-130, README.md:136-137, README.md:165-166
事件溯源将应用程序状态的所有更改存储为事件序列,可以重放这些事件来重建状态。
变更数据捕获 (CDC) 将数据库更改捕获并作为事件流式传输,从而实现实时数据集成。
来源:README.md:132-133, README.md:135-136
分布式系统中的消息传递保证
| 语义 | 描述 | 典型实现 | 用例 |
|---|---|---|---|
| 最多一次 | 消息可能会丢失,但不会重复 | 即发即弃 | 指标、日志(可以容忍部分丢失) |
| 至少一次 | 消息不会丢失,但可能会重复 | 带重试的确认 | 大多数业务交易 |
| 精确一次 | 消息仅处理一次 | 幂等性 + 去重 | 支付处理、关键业务逻辑 |
来源:README.md:134-135
CAP 定理指出,分布式系统一次只能提供三个保证中的两个:一致性 (Consistency)、可用性 (Availability) 和分区容错性 (Partition tolerance)。
最终一致性模式:
来源:README.md:158-159, README.md:139-140
选择正确的数据库取决于各种因素
决策框架:
来源:README.md:140-142, README.md:152-154