本文概述了 Amazon S3 如何提供令人难以置信的持久性。如果您想了解更多信息,请滚动到底部并找到参考资料。
一位名叫 Julia 的年轻软件工程师在一家制药初创公司工作。
他们每天都会创建许多日志文件。
耐用性对他们的商业模式很重要。
然而,他们将数据存储在内部的小型服务器机房中。
生活很美好。
季节过去了。
但有一天。
他们的主数据服务器的硬盘崩溃了。
然后毁了这一切。
Julia 注意到找不到主要客户的日志文件。
所以她很伤心。
幸运的是,他们有一个备份服务器。
但她知道他们是在寻找当前设置的麻烦。
因此,她在互联网上搜索一种便宜且耐用的存储解决方案。
并阅读有关 Amazon S3 的信息。
她的耐久度数字让她眼花缭乱。
Amazon Simple Storage Service (S3) 是一种对象存储。
它存储没有层次结构的非结构化数据。
Amazon S3 持久性
Amazon S3 提供 11 个 9 的持久性 – 99.9999999999%。
换句话说,10000 个对象中的一个数据对象可能会在1000 万年内丢失。
持久性是关于防止数据丢失的。
以下是 Amazon S3 如何提供极高的持久性:
1. 数据冗余
机械硬盘以较低的成本提供大量存储空间。
因此,它们仍然在云中广泛使用。
然而,他们经常失败。
这可能是由于物理冲击或电气故障而发生的。
大规模硬盘故障
一种解决方案是 跨多个硬盘复制数据。
因此, 如果发生故障,可以从另一个磁盘恢复数据。
换句话说,复制可以提高持久性。
但是,如果存储特定数据对象的所有硬盘都出现故障,则仍然存在数据丢失的风险。
使用纠删码将数据拆分为块
因此,他们使用纠删码来降低数据丢失的可能性 。
这是一种复制 技术。
纠删码将数据对象拆分为称为数据分片的块。
并创建称为奇偶校验分片的额外块。
而原始数据对象可以从 分片的子集重新创建。
在多个磁盘上存储分片以实现数据冗余
它们将纠删编码的分片存储在许多硬盘 上。
从而降低 数据丢失的可能性。
换句话说,许多级别的灵活复制可以提高持久性。
在上图中,分片以不同的颜色显示。
大规模重新复制故障硬盘的分片
它们运行后台进程来监控存储设备的运行状况。
并快速更换故障设备以重新复制其数据。
此外,他们不保留空的存储设备。
而是在每个存储设备中留出一些可用空间。
因此,许多存储设备可以参与恢复。
并通过并行化提供高恢复吞吐量。
2. 数据完整性
它们 通过许多服务从用户发送数据,然后再将其存储在 S3 中。
然而,由于网络设备中的位翻转,存在数据损坏的风险。
位翻转是从 0 到 1 的不需要的位变化,反之亦然。
这可能是由于 通信通道中的噪音或硬件故障而发生的。
此外,TCP不检测位翻转,因为它是更高级别的协议。
客户端 SDK 添加校验和以检测数据损坏
因此,他们 使用 Amazon 客户端 SDK 向数据添加校验和。
它可以帮助他们在数据到达 S3 时检测损坏的数据。
换句话说,他们使用校验和执行数据完整性检查。
将校验和想象成数据对象的指纹。
因此,两个不同的数据对象不会具有相同的校验和。
它们使用 CRC32C 和 SHA-1 等校验和算法来提高性能。
此外,它们使用 HTTP 尾部发送校验和。
因为它允许在分块数据的末尾发送额外的数据。
因此 ,无需扫描数据两次并大规模检查数据完整性。
在将纠删编码数据存储到 S3 中之前向数据添加校验和
他们在将数据存储在 S3 中之前擦除数据。
并向纠删码分片添加额外的校验和。
因为它允许在读取期间进行数据完整性检查。
而 S3 每秒计算大约 40 亿个校验和。
使用包围曝光反转数据转换
此外,他们在向用户返回成功的响应之前会进行括号处理。
包围是反转数据的整个转换集的过程。
它确保 可以从 单个分片重新创建数据对象。
换句话说,它根据上传的数据验证存储的数据。
3. 数据审计
应快速更换故障硬盘。
此外,必须重新复制数据以实现持久性。
因此,它们 将 硬盘的修复率与其故障率相匹配。
然而,失败率 并不总是可预测的。因为它可能会受到天气或停电的影响。
因此,他们运行单独的服务来检测硬盘故障。
并相应地扩展维修服务。
基于故障的扩展修复服务
硬盘 上也会发生位翻转。
并且可能会损坏特定的数据扇区。
换句话说,存储设备可能正常工作,但特定数据扇区不可读。
对存储数据进行定期持久性审计
因此,他们会定期扫描存储设备以检查数据完整性。
使用 与纠删码分片一起存储的校验和来审计数据。
此外 ,如果发现坏扇区,他们会重新复制数据。
4. 数据隔离
它们在 S3 中分别存储元数据和文件内容。
Amazon S3 架构
元数据存储在数据库中。
而文件内容则以块的形式存储在大量硬盘阵列中。
此外,它们在 可用区内运行物理上分离的数据中心。
换句话说,可用区是一组隔离的数据中心。
可用区设计每个可用区都有单独的网络基础设施和电源。
从而降低 同时发生故障的风险并提高 耐用性。
然而,由于用户错误存在数据丢失的风险。
例如,用户可能会意外删除或覆盖数据对象。
因此,他们更好地设计软件以避免此类情况。
Amazon S3 版本控制它们在 S3 中提供版本控制以跟踪数据对象更改。
对对象的每次更改都将获得一个版本 ID。
此外,删除标记用于删除版本。
因为它会延迟实际的删除。
从而避免意外覆盖或删除数据对象。
此外,它们还支持 S3 中的对象锁定以避免用户错误。
它可以防止在指定时间段内永久删除对象。
此外,它们还提供时间点备份以提高持久性。
5. 工程文化
他们 仅在持续性审查后部署更改。
因为它迫使他们考虑可能的情况并简化设计决策。
换句话说,持久性审查可以帮助他们了解软件设计中的风险。
耐久性审查他们保留一份书面文件以供耐用性审查。
此外,还有一个威胁模型,其中包含可能出错的事情列表。
从而创造一种 不断考虑耐用性的工程文化。
此外,他们使用经过验证的数学模型来计算耐用性。
他们使耐用性成为架构和工程文化的一部分。
此外,他们非常关注耐用性的基本原理。
并将耐用性视为一个持续的过程。