菜单

数据库与存储系统

相关源文件

目的与范围

本文档在 System Design 101 仓库中全面概述了数据库和存储系统。它涵盖了与数据持久化、存储解决方案和消息系统相关的基本概念、架构、模式和技术。有关补充数据库系统的缓存和性能优化策略的信息,请参阅缓存和性能优化

数据库和存储系统概述

数据库和存储系统构成了现代应用程序的支柱,作为维护数据完整性和可用性的持久层。这些系统管理数据如何在应用程序的不同组件之间存储、检索、组织和传输。

来源:README.md:120-167

数据库模型和类型

数据库系统可以根据其数据模型进行分类,数据模型定义了数据的组织、存储和访问方式。

关系数据库(SQL)

关系数据库将数据组织到具有预定义模式的表中,并使用 SQL(结构化查询语言)进行数据查询和操作。它们通过 ACID 属性在维护数据完整性方面表现出色。

流行的关系数据库包括

数据库主要功能常见用例
PostgreSQL高级功能、可扩展性、JSON 支持复杂应用程序、GIS、分析
MySQL高性能、可靠性、易用性Web 应用程序、OLTP
Oracle企业级功能、可伸缩性、安全性大型企业系统、银行
SQL Server与 Microsoft 堆栈、BI 工具集成以 Windows 为中心的企业应用程序

来源:README.md:147-149, README.md:151-154

NoSQL 数据库

NoSQL 数据库提供灵活的模式、水平可伸缩性和传统基于表的键值模型以外的专用数据模型。

NoSQL 数据库类型

  1. 文档数据库:将半结构化数据存储为文档(通常是 JSON 或 BSON)

    • 示例:MongoDB、CouchDB
  2. 键值存储:将数据存储为键值对,结构简单但性能高

    • 示例:Redis、DynamoDB、etcd
  3. 列族存储:将数据存储在列族中,针对大型数据集的查询进行了优化

    • 示例:Cassandra、HBase
  4. 图数据库:优化高度连接数据的存储和查询

    • 示例:Neo4j、Amazon Neptune

来源:README.md:140-142, README.md:160-162

专用数据库

专用数据库是为具有独特需求的特定用例而设计的

  • 时间序列数据库 (TSDB):针对带时间戳或时间序列数据进行了优化

    • 示例:InfluxDB、TimescaleDB、Prometheus
  • 搜索引擎:专为全文搜索和复杂查询而设计

    • 示例:Elasticsearch、Solr
  • 空间数据库:针对地理和空间数据进行了优化

    • 示例:PostGIS(PostgreSQL 扩展)
  • 分类账数据库:具有内置审计跟踪的不可变、仅追加数据库

    • 示例:Amazon QLDB

来源:README.md:131-132, README.md:146-147

数据库基础知识

数据库中的数据结构

数据库使用特定的数据结构来组织数据,以实现高效的存储和检索。

B-Tree 与 LSM-Tree 对比:

特征B-TreeLSM-Tree
写入模式原地更新仅追加,带压缩
读取性能点查找速度快可能需要多次磁盘读取
写入性能较慢(随机 I/O)较快(顺序写入)
空间效率效率较低(碎片化)效率较高(压缩)
用例OLTP,读写平衡写入密集型工作负载

来源:README.md:140-141, README.md:154-155

ACID 特性

ACID(原子性、一致性、隔离性、持久性)属性可确保数据库中可靠的事务处理

  • 原子性(Atomicity):事务要么全部成功,要么全部失败
  • 一致性(Consistency):事务使数据库从一个有效状态转换到另一个有效状态
  • 隔离性(Isolation):并发事务互不干扰
  • 持久性:已提交的事务在系统故障后仍然存在

来源: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

读副本模式

读副本是主数据库的副本,负责处理读取操作,分摊查询负载并提高读取性能。

实现挑战:

  • 复制延迟
  • 一致性模型(最终一致性 vs. 强一致性)
  • 读后写一致性
  • 故障转移机制

来源:README.md:121-122, README.md:155-156

一致性哈希

一致性哈希提供了一种分发机制,可在节点数量变化时最大程度地减少重新分发。

一致性哈希的好处:

  • 添加/删除节点时最大程度地减少数据移动
  • 均匀分配负载
  • 有效进行水平扩展
  • 支持面向位置的数据放置

来源:README.md:159-160

存储技术

内存层次结构和存储类型

存储类型访问时间容量持久化成本
CPU 寄存器<1nsKB易失性最高
缓存(L1-L3)1-100nsMB易失性非常高
内存100nsGB易失性
SSD10-100μsTB持久性中等
HDD1-10msTB持久性
磁带PB持久性最低

来源:README.md:143-144, README.md:166-167

对象存储

Amazon S3 等对象存储解决方案旨在大规模存储非结构化数据。

对象存储的关键用例:

  • 静态内容托管
  • 备份和归档
  • 数据湖
  • 媒体存储
  • 应用程序数据存储
  • 日志和指标存储

来源:README.md:123-124, README.md:137-139

消息队列和事件处理

消息队列支持系统组件之间的异步通信,提供解耦、缓冲和可靠性。

消息队列类型

  1. 点对点队列:每条消息都只传递给一个消费者
  2. 发布-订阅:消息广播给所有订阅者
  3. 优先级队列:消息根据优先级级别进行处理
  4. 死信队列:存储无法处理的消息

来源:README.md:124-126, README.md:128-130, README.md:157-158

Kafka 架构

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 定理与一致性模型

CAP 定理指出,分布式系统一次只能提供三个保证中的两个:一致性 (Consistency)、可用性 (Availability) 和分区容错性 (Partition tolerance)。

最终一致性模式:

  • 读我所读(Read-your-writes)一致性
  • 会话一致性
  • 单调读
  • 单调写
  • 因果一致性

来源:README.md:158-159, README.md:139-140

数据库选择指南

选择正确的数据库取决于各种因素

决策框架:

  1. 确定数据结构和关系
  2. 确定查询模式和访问模式
  3. 评估规模和性能要求
  4. 考虑运营能力和限制
  5. 评估一致性和可用性需求

来源:README.md:140-142, README.md:152-154