增加存储密度是一种奇特的说法,我们正在用另一个更大容量的驱动器替换一个驱动器;例如,将 4TB 驱动器替换为 16TB 驱动器 - 相同的空间,4 倍的存储空间。多年来,您可能已经复制或克隆了一两个驱动器,因此您了解了一般过程。现在想象一下,在未来几年内,有 270,000 个驱动器需要更换或迁移,这是常用的术语。这是很多工作。当你完成时——实际上你永远不会完成,因为只要你从事云存储业务,这个过程就是连续的。那么,Backblaze 是如何管理这个 ABC(Always Be Copying)流程的呢?让我向您介绍CVT Copy或简称CVT。
CVT Copy 是我们内部专用的应用程序,用于大规模执行驱动器迁移。CVT代表Cluster,Vault,Tome,这是工程术语,被仁慈地缩写为CVT。
在我们开始之前,让我们花一点时间在我们如何组织存储的上下文中定义几个术语。
驱动器:在我们的案例中,存储的基本单位大小从 4 到 22TB 不等。
存储服务器:单个服务器中的驱动器集合。我们有 26、45 和 60 个驱动器的服务器。存储服务器中的所有驱动器的逻辑大小相同。
Backblaze Vault:20 个存储 Pod 或服务器的逻辑集合。Vault 中的每个存储服务器将具有相同数量的驱动器。
Tome:Tome 是 20 个驱动器的逻辑集合,每个驱动器位于给定 Vault 的 20 个存储服务器之一中。如果 Vault 中的存储服务器每个有 60 个驱动器,则该 Vault 中将有 60 个唯一的卷。
群集:保管库的逻辑集合,组合在一起以共享其他资源,例如网络设备和实用程序服务器。
基于此,由 20 个驱动器、60 个驱动器的存储服务器组成的 Vault 将具有 1,200 个驱动器,具有 45 个驱动器存储服务器的 Vault 将具有 900 个驱动器,具有 26 个驱动器服务器的 Vault 将具有 520 个驱动器。集群可以具有 Vault 大小的任意组合。
快速回顾 Backblaze 如何存储数据
数据将上传到一个目录内的 20 个驱动器之一。然后将数据分成多个部分,称为数据分片。此时,我们使用自己的 Reed-Solomon 擦除编码算法来计算该数据的奇偶校验分片。数据分片数加上奇偶校验分片数将等于 20,即一本书中的驱动器数。数据分片和奇偶校验分片将写入其分配的驱动器,每个驱动器一个分片。我们目前使用的数据分片与奇偶校验分片的比率为 17/3、16/4 和 15/5,主要取决于用于存储数据的驱动器的大小——驱动器越大,奇偶校验越高。
使用奇偶校验允许我们使用少于 20 个驱动器恢复(即读取)文件。例如,当一本书是 17/3(数据/奇偶校验)时,我们只需要来自该书中 20 个驱动器中任何 17 个驱动器的数据来恢复文件。这大大提高了存储文件的持久性。
CVT概览
对于 CVT,迁移的基本单元是一本书,源 Vault 中的所有书籍同时复制到新的目标 Vault(通常是新硬件)。对于每个卷,数据以文件的形式逐个文件从源卷复制到目标卷。
CVT工艺
以下是CVT流程的概述,然后对每项任务进行了说明。
选择
选择要迁移的 Vault 需要考虑多个因素。我们首先回顾当前的驱动器故障率和预测的驱动器故障率。我们还计算并考虑了保险库的整体耐久性;也就是说,我们保护数据免遭丢失的能力。此外,我们还需要考虑运营需求。例如,我们仍然有使用 45 个驱动器的存储容器的 Vault。将这些服务器升级到 60 个驱动器的存储服务器可增加相同机架空间中的驱动器密度。这些因素共同决定了要迁移的下一个 Vault。
目前,我们正在迁移具有 4TB 驱动器的系统,这意味着我们为 900 个驱动器的保险库迁移多达 3.6PB 的数据,为 1,200 个驱动器的保险库迁移高达 4.8PB 的数据。实际上,源系统驱动器的大小没有限制,因此可以使用 CVT 迁移具有 6、8TB 和更大尺寸驱动器的 Vault,只需最少的设置和配置更改。
确定要迁移的源 Vault 后,我们需要确定目标或目标系统。目前,我们使用的是包含 16TB 驱动器的目标保管库。目标保管库的驱动器大小没有限制,只要它们至少与源保管库中的驱动器一样大即可。您可以将数据从任何大小的源 Vault 迁移到任何大小的目标 Vault,只要目标 Vault 上有足够的空间即可。
设置
选择源 Vault 和目标 Vault 后,各个技术运营和数据中心人员就开始进行设置。如果我们不使用现有的目标文件库,则会置备新的目标文件库。这带来了 CVT 的一个功能:迁移可以是新的干净的 Vault 或现有的 Vault;也就是说,它上面有来自以前迁移的数据。在后一种情况下,只是添加新数据,不会替换任何现有数据。下图示例显示了从一个或多个源 Vault 填充目标 Vault 的不同方式。
在任何这些方案中,可用空间都可用于另一个迁移目标或可以写入新客户数据的 Vault。
开球
确定并设置源库和目标库后,我们现在就可以启动 CVT 流程了。第一步是将源 Vault 置于只读状态,并禁用源 Vault 和目标 Vault 上的文件删除。一些较旧的源保管库可能已置于只读状态,以减少其工作量。处于只读状态的保险柜会继续执行其他操作,例如运行分片完整性检查、报告驱动器统计信息统计信息等。
CVT 和驱动统计数据
我们会在源保险柜中记录驱动器中的驱动器统计信息数据,直到迁移完成并经过验证。此时,我们开始记录目标保险柜中驱动器的驱动器统计信息数据,并停止记录源保险柜中驱动器的驱动器统计信息数据。源保管库中的驱动器未标记为故障。
构建文件列表
此步骤和接下来的三个步骤(读取文件、写入文件和验证)是作为源 Vault 中每个卷的一组连续步骤完成的。出于我们的目的,我们将这组步骤称为 tome 迁移过程,尽管它们在内部文档中实际上没有这样的名称。大部头的迁移过程是针对单个大部头的,但一般来说,保管库中的所有大部头都是同时迁移的,尽管由于其独特的内容,它们很可能在不同的时间完成。
对于每个卷,源文件列表将复制到文件传输数据库,并且每个条目都映射到其在目标卷中的新位置。此过程允许我们在复制数据时保持与客户最初上传数据时相同的上传路径。这确保了从客户的角度来看,即使我们已将文件从一个保险柜迁移到另一个保险柜,他们处理文件的方式也不会有任何变化。
阅读 f伊尔斯
对于每部巨著,我们使用文件位置数据库来读取文件。一次一个文件。在此过程中,我们使用的代码与用户从 Backblaze B2 Storage Cloud 请求数据时使用的代码相同。如前所述,使用预设数据/奇偶校验方案(例如 17/3)在多个驱动器之间对数据进行分片。这意味着,在这种情况下,我们只需要来自 17 个驱动器的数据即可读取文件。
当我们读取文件时,使用标准读取过程获得的一个优势是要迁移的文件的原始副本。虽然我们会定期对存储的数据进行分片完整性检查,以确保给定的数据分片是好的,但介质退化、宇宙射线等都会影响硬盘上的数据。通过使用标准读取过程,我们获得了要迁移的每个文件的完全干净的版本。
写入文件
还原的文件将发送到目标库,文件所在的中间位置没有中间位置。传输通常通过加密网络连接完成,通常在同一数据中心内,最好在同一网段上。如果传输是在数据中心之间完成的,则通过加密的暗光纤连接完成。
然后,将文件写入目标目录。写入过程与我们的客户上传文件时使用的写入过程相同,鉴于该过程已成功写入数千亿个文件,我们不需要发明任何新内容。
在这一点上,您可能会认为逐个复制每个文件需要做很多工作。例如,为什么不逐块复制和传输呢?答案在于我们通过使用基于文件的标准读取和写入过程获得的灵活性。
我们可以更改书籍的数量。假设我们在源 Vault 中有 45 个大部头,在目标 Vault 中有 60 个大部头。如果我们复制了数据块,目标 Vault 将有 15 个空书。当该目标 Vault 在以后打开新数据写入时,这会产生负载平衡和其他各种性能问题。通过对每个文件使用标准的读写调用,目标 Vault 的所有 60 个文件都可以均匀地填满,就像我们接收客户数据时一样。
我们可以更改数据的奇偶校验。源 4TB 驱动器保管库的数据/奇偶校验比为 17/3。通过使用我们的标准流程来写入文件,可以将数据/奇偶校验比率设置为目标 Vault 所需的任何比率。目前,16TB 目标保管库的数据/奇偶校验比率设置为 15/5。此比率可确保将数据迁移到更大的驱动器后,目标 Vault 的持久性以及其中文件的可恢复性得以保持。
我们可以最大限度地提高平价经济学。将一本书中的奇偶校验驱动器数从 3 个增加到 5 个会减少该书中的数据驱动器数。这似乎会增加存储成本,但在这种情况下,情况恰恰相反。方法如下:
使用 4TB 驱动器存储 16TB 数据
我们 4TB 硬盘的平均成本为 120 美元或 0.03 美元/GB。
使用 4TB 驱动器的 16TB 存储成本为 480 美元(4 x 120 美元)。
使用 17/3 数据/奇偶校验方案意味着:
存储:我们有 13.6TB 的存储空间,价格为 0.03 美元/GB(30 美元/TB),成本为 408 美元。
奇偶校验存储:我们有 2.4TB 的奇偶校验存储,价格为 0.03 美元/GB(30 美元/TB),成本为 72 美元.
使用 16TB 驱动器存储 16TB 数据
我们 16TB 驱动器的平均成本为 232 美元或 0.0145 美元/GB。
我们的 16TB 存储成本为 232 美元。
使用 15/5 数据/奇偶校验方案意味着:
存储:我们有 12.0TB 的数据存储,价格为 0.0145 美元/GB(14.5 美元/TB),成本为 174 美元。
数据奇偶校验:我们有 4.0TB 的奇偶校验存储,价格为 0.0145 美元/GB(14.5 美元/TB),成本为 58 美元。
总之,将 16TB 驱动器的数据/奇偶校验比率提高到 15/5 比使用我们的 4TB 驱动器(72 美元)提供相同 16TB 存储时的奇偶校验成本便宜(58 美元)。16TB 驱动器的每 TB 成本较低,使我们能够增加一本书中的奇偶校验驱动器数量。因此,增加目标书的奇偶校验的成本不仅提高了数据的持久性,而且在经济上是合理的。
显然,由于格式化和开销,16TB 驱动器实际上保存的数据更少,而 4x4TB 驱动器保存的数据更少。换句话说,即使有格式化等,数学仍然有利于使用16TB驱动器。
验证书目
迁移目录的最后一步是验证目标目录与源目录是否相同。这是在完成复制过程时为每部书完成的。如果源目录和目标目录不一致,则可以查看分片完整性检查数据以确定任何错误,并且系统可以重新传输单个文件,包括整个目录。
重定向读取
一旦 Vault 中的所有书籍都完成了各自的迁移并通过了验证检查,我们就可以将客户读取(下载请求)重定向到目标 Vault。此过程对客户完全不可见,因为他们将使用与以前相同的文件句柄。此重定向或交换过程可以逐部完成,但通常在整个目标 Vault 准备就绪后完成。
监控
此时,所有下载请求都由目标 Vault 处理。我们监控 Vault 的运行状态,以及任何失败的下载请求。我们还会审查来自客户支持和销售支持的输入,以查看是否存在任何与客户相关的问题。
一旦我们对目标 Vault 正在处理客户请求感到满意,我们将在逻辑上停用源 Vault。基本上,这意味着当源 Vault 继续运行时,它不再可从外部访问。如果新目标 Vault 出现重大问题,我们可以在源 Vault 中交换。此时,两个保管库都是只读的,因此交换将很简单。在我们的生产环境中,我们不必这样做。
全功能
一旦我们确信目标 Vault 没有问题,我们就可以继续 1 或 2 种方式。
另一个迁移:我们可以准备将另一个源 Vault 迁移到此目标 Vault。如果是这种情况,我们将返回到 CVT 流程的“选择”步骤,并再次将 Vault 指定为目标 Vault。
允许新数据:我们允许目标保险柜接受来自客户的新数据。通常,在执行此操作之前,多个源 Vault 的内容已迁移到目标 Vault。一旦允许在目标 Vault 上执行新的客户写入操作,我们将不再将其用作目标 Vault。
退役
3 个月后,源 Vault 有资格实际停用。也就是说,我们将其关闭,断开电源和网络连接,并安排将其拆卸。这包括擦拭驱动器并在内部或外部回收剩余部件。在实践中,我们将等待同时停用至少两个避难所,因为与我们的回收合作伙伴打交道更经济。
自动化
您可能想知道此过程有多少是自动化的,或者使用某种类型的编排来调整和完成任务。我们目前有监控工具、仪表板、脚本等,但人类,而不是人工智能生成的真实人类,在控制之中。也就是说,我们正在努力编排设置和配置过程,并提升 tome 迁移过程中的自动化程度。随着时间的流逝,我们希望整个迁移过程能够实现自动化,但前提是我们确定它有效——在处理客户数据时,“快速运行,破坏事物”的方法并不合适。
不适合胆小的人
将驱动器的内容复制到另一个更大的驱动器的基本思想很简单,并且很好理解。随着此过程的扩展,复杂性随之而来,因为您必须考虑如何组织和存储数据,同时确保数据安全并可供最终用户使用。
如果您的组织在内部管理您的数据,那么同时迁移数百个或数千个驱动器的永无止境的任务就落在了您身上,或者如果您缺乏经验或人员配备,则可能由您雇用的承包商来执行该任务。而这只是您在操作、维护和升级自己的存储基础架构时面临的任务之一。
除了管理存储基础设施之外,数据存储的环境问题也日益严重。每年生成和存储的数据量持续飙升,CVT 等工具使我们能够以经济高效且对环境敏感的方式扩展和优化我们的资源。
为此,我们从数据持久性开始。使用我们的驱动器统计数据和其他信息,我们优化了 Vault 在需要更换驱动器之前(即驱动器故障率影响耐用性之前)应运行的时间长度。然后,我们考虑数据密度,即我们可以将多少数据打包到给定空间中。例如,将数据从 4TB 驱动器迁移到 16TB 驱动器不仅可以提高数据密度,还可以减少每存储 TB 数据的耗电量,并减少浪费量,例如,如果我们继续购买和使用 4TB 驱动器而不是升级到 16TB 驱动器。
总而言之,CVT 不仅仅是一个花哨的数据迁移工具:它是我们整体基础设施管理计划的一部分,旨在解决我们每天需要存储和保护的不断增长的数据量所面临的可扩展性、持久性和环境挑战。