读数据工程之道:设计和构建健壮的数据系统17存储的原材料
1. 存储
1.1. 存储是数据工程生命周期的基石
-
1.1.1. 是数据获取、转换和服务主要阶段的基础
-
1.1.1.1. 当构建数据管道时,随着数据经过获取、转换和服务阶段,工程师会选择适当的抽象来存储他们的数据
-
1.1.2. 当数据在生命周期中移动时,它会被多次存储
-
1.1.2.1. 必须在存储中持续存在,直到系统准备好消费它以进一步处理和传输
1.2. 了解数据的使用情况和你将来检索它的方式是为你的数据架构选择合适的存储解决方案的第一步
1.3. 源系统通常不是由数据工程师维护或控制的
1.4. 数据工程师直接处理的存储
-
1.4.1. 包含了数据工程生命周期的各个阶段,包括从源系统中提取数据,到为数据提供分析、数据科学研究等价值
-
1.4.2. 许多形式的存储以某种方式贯穿了整个数据工程生命周期
1.5. 构成存储系统的原材料,包括硬盘、固态硬盘和系统内存
-
1.5.1. 序列化和压缩,这是实用存储的关键软件元素
-
1.5.2. 缓存对存储系统的组装至关重要
1.6. 了解物理存储技术的基本特征,对于评估任何存储架构中内在的权衡是至关重要的
1.7. 在实践中,我们并不直接访问系统内存或硬盘
-
1.7.1. 物理存储组件存在于服务器和集群内,这些服务器和集群可以使用各种访问模式获取和检索数据
-
1.7.2. 存储系统被组装成一个云数据仓库,一个数据湖等
2. 数据存储的原材料
2.1. 在大多数数据架构中,数据在通过数据管道的各个处理阶段时,经常会经过磁性存储、SSD和内存
- 2.1.1. 管理服务有可能将数据工程师从管理服务器的复杂性中解放出来,但数据工程师仍然需要了解底层组件的基本特征、性能考量、耐久性和成本
2.2. 磁盘驱动器
-
2.2.1. 磁盘是涂有铁磁薄膜的旋转盘片
-
2.2.1.1. 薄膜在写操作中被读/写头磁化,对二进制数据进行物理编码
-
2.2.1.2. 读/写头在读操作中检测磁场并输出比特流
-
2.2.1.3. 热助磁记录(Heat-Assisted Magnetic Recording,HAMR)、叠瓦式磁记录(Shingled Magnetic Recording,SMR)和充氦磁盘存储器等方法被用来实现越来越大的存储密度
> 2.2.1.3.1. 硬盘性能的其他方面却受到了物理学的阻碍
-
2.2.2. 磁盘驱动器已经存在了很长时间
-
2.2.2.1. 仍然是大容量数据存储系统的骨干
-
2.2.2.2. 磁盘在性能、存储密度和成本方面已经有了非凡的改进
-
2.2.3. 它们每千兆字节的存储数据的成本远低于固态硬盘
-
2.2.3.1. 固态硬盘在各种指标上都大大超过了磁盘
-
2.2.3.2. 商用磁盘驱动器的成本约为每千兆字节3美分
-
2.2.4. 主要限制
-
2.2.4.1. 磁盘传输速度,即数据的读写速度,与磁盘容量不成正比
> 2.2.4.1.1. 磁盘容量与面积密度(每平方英寸1:存储的千兆位)成比例,而传输速度与线性密度(每英寸的比特数)成比例
> 2.2.4.1.2. 如果磁盘容量增加4倍,传输速度只增加2倍
> 2.2.4.1.3. 假设传输速度为300MB/s,读取一个30TB的磁盘的全部内容需要20多个小时
- 2.2.4.2. 检索时间
> 2.2.4.2.1. 了访问数据,硬盘必须将读/写头物理性地重新定位到磁盘上的适当轨道
- 2.2.4.3. 旋转延迟
> 2.2.4.3.1. 为了在磁盘上找到一个特定的数据,磁盘控制器必须等待该数据在读/写头下旋转
- 2.2.4.4. 每秒输入/输出操作(Input/Output Operations Per Second,IOPS)
> 2.2.4.4.1. 对交易型数据库至关重
> 2.2.4.4.2. 一个磁驱动器的IOPS在50~500之间
-
2.2.5. 各种技巧可以改善延迟和提升传输速度
-
2.2.5.1. 使用更高的旋转速度可以提高传输速度,减少旋转延迟
-
2.2.5.2. 限制磁盘盘面的半径或只将数据写入磁盘上的一个窄带,可以减少检索时间
-
2.2.5.3. 磁驱动器可以通过并行方式维持极高的传输速度
-
2.2.5.4. 都不能使磁驱动器在随机访问查询方面与固态硬盘有竞争力
-
2.2.6. 磁盘因其低数据存储成本而在数据中心中仍然受到重视
-
2.2.6.1. 磁盘上的对象存储已经成为数据湖和云数据仓库中大规模数据存储的主要选择
-
2.2.7. 云对象存储背后的关键理念:数据可以分布在集群中的数千个磁盘上
-
2.2.7.1. 通过同时从众多磁盘中读取数据,数据传输率大幅提高,这时读取速度主要受限于网络性能而不是磁盘传输率
2.3. 固态硬盘
-
2.3.1. 固态硬盘将数据作为电荷存储在闪存单元中
-
2.3.1.1. 固态硬盘不需要磁盘的机械部件,数据是通过纯粹的电子手段读取的
-
2.3.1.2. 固态硬盘可以在不到0.1毫秒(100微秒)的时间内查询到随机数据
-
2.3.2. 固态硬盘可以通过将存储切成具有众多并行运行的存储控制器的分区来扩展数据传输速度和IOPS
-
2.3.2.1. 商用固态硬盘可以支持每秒数千兆字节的传输速度和数以万计的IOPS
-
2.3.3. 固态硬盘可以以更低的延迟、更高的IOPS和更高的传输速度提供数据,部分原因是固态硬盘没有物理旋转的磁盘或磁头需要等待
-
2.3.4. 固态硬盘已经彻底改变了事务数据库,成为OLTP系统商业部署的公认标准
-
2.3.4.1. 固态硬盘支持关系数据库(如PostgreSQL、MySQL和SQL Server)每秒处理成千上万的交易
-
2.3.5. 固态硬盘目前并不是大规模分析数据存储的默认选项
-
2.3.5.1. 商用固态硬盘每千兆字节容量的成本通常为20~30美分(USD),几乎是磁盘每容量成本的10倍
-
2.3.6. SSD在OLAP系统中仍然发挥着重要作用
-
2.3.6.1. OLAP数据库利用SSD缓存来支持对频繁访问数据的高性能查询
2.4. 随机存取存储器
-
2.4.1. 随机存取存储器(Random Access Memory,RAM)
-
2.4.1.1. 附属于CPU,并映射到CPU的地址空间
-
2.4.1.2. 存储CPU执行的代码和该代码直接处理的数据
-
2.4.1.3. 是易失性存储器,而磁盘和SSD是非易失性存储器
-
2.4.1.4. 传输速度和检索时间明显优于SSD存储
> 2.4.1.4.1. DDR5内存提供了100ns的数据检索延迟,大约比SSD快1000倍
> 2.4.1.4.2. 一个典型的CPU可以支持100GB/s的带宽到附加内存和数百万的IOPS
-
2.4.1.5. 比固态硬盘存储贵得多,大约为10美元/GB
-
2.4.1.6. 接到单个CPU和内存控制器的RAM数量上是有限的
> 2.4.1.6.1. 高内存服务器通常在一块板上使用许多相互连接的CPU,每个CPU都有一个连接的RAM块
-
2.4.1.7. 仍然比CPU缓存慢得多,CPU缓存是一种直接位于CPU芯片上或同一封装中的存储器
-
2.4.2. 动态RAM,一种高密度、低成本的内存形式
-
2.4.2.1. 动态RAM将数据作为电荷储存在电容器中
-
2.4.3. 硬件内存控制器处理这些技术细节,而数据工程师只需要担心带宽和检索延迟的特性
-
2.4.4. CPU几乎都是采用冯·诺依曼体系结构,代码和数据存储在同一个内存空间
-
2.4.4.1. CPU通常也可以设定禁止在特定内存页中执行代码,以增强安全性
-
2.4.5. RAM被用于各种存储和处理系统,可以用于缓存、数据处理或索引
-
2.4.5.1. 一些数据库将RAM作为主要存储层,允许超快的读写性能
-
2.4.5.2. 始终牢记RAM的易失性
> 2.4.5.2.1. 即使存储在内存中的数据是在集群中复制的,导致几个节点瘫痪的停电也会导致数据丢失
> 2.4.5.2.2. 想要持久存储数据的架构可能需要电池备份,并在停电时自动将所有数据转储到磁盘
2.5. 网络和CPU
-
2.5.1. 网络和CPU也是存储系统的关键原材料
-
2.5.2. 越来越多的存储系统为了提高性能、耐久性和可用性采用分布式
-
2.5.2.1. 单个磁性磁盘提供了相对较低的传输性能,但一个磁盘集群可以并行读取,可以实现显著的性能扩展
-
2.5.2.2. 独立磁盘冗余阵列(Redundant Arrays of Independent Disk,RAID)等存储标准在单个服务器上实现了并行化,但云对象存储集群的运行规模要大得多,磁盘分布在一个网络甚至多个数据中心和可用区
-
2.5.3. 可用区是一种标准的云结构,由具有独立电力、水和其他资源的计算环境组成
-
2.5.3.1. 多区存储增强了数据的可用性和耐久性
-
2.5.4. 存储成为一个具有API、后端服务组件和负载平衡的网络应用
-
2.5.5. CPU处理服务请求、聚合读取和分配写入的细节
-
2.5.6. 网络设备性能和网络拓扑结构是实现高性能的关键因素
-
2.5.6.1. 通过在地理上分散数据实现的耐用性和可用性
-
2.5.6.2. 将存储保持在一个小的地理区域和靠近数据消费者或写入者的性能和成本优势
2.6. 序列化
-
2.6.1. 序列化是另一个原材料,也是数据库设计的一个关键因素
-
2.6.2. 过软件存储在系统内存中的数据通常不是适合存储在磁盘或通过网络传输的格式
-
2.6.3. 序列化是将数据扁平化并打包成一个读取者能够解码的标准格式的过程
-
2.6.3.1. 序列化格式提供了一个数据交换的标准
-
2.6.3.2. 会以基于行的方式将数据编码为XML、JSON或CSV文件,然后将其传递给另一个用户,后者可以使用一个标准对其进行解码
-
2.6.4. 一个序列化算法有处理类型的逻辑,对数据结构施加规则,并允许数据在编程语言和CPU之间流通
-
2.6.4.1. 序列化算法也有处理异常的规则
-
2.6.5. 低级别的数据库存储也是一种序列化的形式
-
2.6.5.1. 面向行的关系数据库将数据组织成磁盘上的行,以支持快速查找和就地更新
-
2.6.5.2. 列式数据库将数据组织成列文件,以优化高效压缩并支持对大数据量的快速扫描
-
2.6.6. 当前最流行的格式(如Apache Parquet)、混合序列化(如Apache Hudi)和内存序列化(如Apache Arrow)
2.7. 压缩
-
2.7.1. 压缩是存储工程的另一个重要组成部分
-
2.7.1.1. 压缩使数据变小,另外压缩算法也与存储系统的其他细节复杂地相互影响
-
2.7.2. 高效的压缩在存储系统中有三个主要优势
-
2.7.2.1. 数据更小,因此在磁盘上占用的空间更少
-
2.7.2.2. 压缩增加了每个磁盘的实际扫描速度
> 2.7.2.2.1. 在10:1的压缩比下,我们从每块磁盘200MB/s的扫描速度变成了每块磁盘2GB/s的高效扫描速度
-
2.7.2.3. 在网络性能方面,鉴于亚马逊EC2实例和S3之间的网络连接提供10GB/s的带宽,10:1的压缩比将有效的网络带宽增加到100GB/s
-
2.7.3. 缺点
-
2.7.3.1. 压缩和解压缩数据需要额外的时间和资源消耗来读取或写入数据
2.8. 缓存
-
2.8.1. 缓存的核心思想是将经常或最近访问的数据存储在一个快速访问层
-
2.8.2. 缓存的速度越快,成本越高,可用的存储空间越少
-
2.8.2.1. 不太频繁访问的数据则存储在更便宜、更慢的存储中
-
2.8.2.2. 由具有不同性能特征的存储所组成
-
2.8.3. 缓存对于数据服务、处理和转换至关重要
-
2.8.4. 归档存储看作是一种反向的缓存
-
2.8.4.1. 归档存储以较低的成本提供了较差的访问特性
-
2.8.4.2. 归档存储一般用于数据备份和满足数据保留的合规性要求
-
2.8.4.3. 数据只有在紧急情况下才会被访问