所有文章/ 跨境传输

跨境文件回传的存储转发架构与成本模型

从每天约 3 TB 的海外文件回传出发,分析存储转发架构、多协议接入、不可变版本、租约、持久化确认与容量控制的设计依据和取舍。

每天约 3 TB 的文件从海外回传国内,一个月的传输量接近 90 TB。国内接收端已经存在,海外用户通过各自熟悉的工具上传,数据到达国内、完成校验与持久化后,中转副本便可以清理。这种持续交付的负载,存储周期短,传输量大,成本对公网出站单价十分敏感。

上传和国内交付需要有各自的完成条件。海外节点通过 SFTP、FTPS 和兼容 S3 的入口接收完整文件,国内端再通过 HTTPS 独立拉取。中转服务记录每个文件版本的交付状态,只有接收端确认落盘,才清理对应副本。线路、协议接入和交付可靠性由此形成了可以分别处理的设计问题。

持久化中转增加了磁盘读写,也带来了明确的收益。海外上传不必等待国内接收机持续在线,接收机可以自行安排并发、检查容量和恢复下载;节点与线路可以按实际回传效果选择。这种解耦依赖文件发布、任务恢复和安全清理的配合,使国内链路的暂时中断可以由接收端自行处理。

回传负载与传输窗口

日数据量需要先换算为持续吞吐。本文的数据容量采用十进制单位,每天 3 TB 即 3 × 10¹² 字节,平均每秒约 34.7 MB,对应约 278 Mbps 的净数据吞吐。这个数值已经包含全天 24 小时持续工作的假设,没有留出停机维护、突发积压和恢复后的追赶时间。

每天可用传输时间完成 3 TB 所需的平均净吞吐
24 小时约 278 Mbps
12 小时约 556 Mbps
8 小时约 833 Mbps

若另外预留相当于净数据量 10% 的协议和重传开销,全天传输的线路预算约为 306 Mbps。这是用于选型的假设,并非实测开销。把任务集中到较短窗口,会同步提高吞吐要求;8 小时窗口下再增加相同预算,已经接近 917 Mbps,对 1 Gbps 端口几乎没有追赶余量。

选型时需要区分端口速率、下载速率和完成交付的速率。下载数据进入本地缓存,并不代表校验和持久化已经完成;文件完成交付,也可能尚未释放中转空间。每天能持续交付多少完整文件、积压能否回落,比短时间测速结果更接近业务所需的容量。

恢复能力也需要单独计算。假设国内端中断 12 小时,中转新增积压约为 1.5 TB;恢复后以 500 Mbps 的净速率接收,同时继续进入每天 3 TB 的新文件,真正用于追赶积压的速率只有约 222 Mbps。清完这批积压还需要约 15 小时。该推算假定确认和清理及时完成,也说明只满足平均流入量的线路缺乏故障恢复余量。

同样的 3 TB,还可能由少量大文件或大量小文件组成。前者主要占用连续传输和磁盘读写能力,后者还会放大任务认领、文件同步和元数据更新的开销。以完整文件为交付单位,可以分别评估字节吞吐与任务处理能力;并发上限则约束同时占用连接、计算和磁盘资源的任务数量。

传输路径的选择

直接上传国内接收机,部署和资源开销最少。已有接收节点能够提供稳定公网入口,目标磁盘与海外路径也满足要求时,这是一种合理选择。困难在于上传连接覆盖了整个交付过程:国内端重启、磁盘不足或路径中断,都会直接影响海外上传。每个上传工具还需要自行处理重试、断点和重复文件。

海外节点上的实时转发可以改变接入位置及路由。数据经过中转进程后立即发往国内,不保存完整副本,额外磁盘开销较低。但是国内端接收变慢,压力仍会沿连接传回上传方。国内端离线时,有限的内存缓冲无法继续接收大批文件。这类代理解决了路径选择,故障恢复仍与两端连接绑定。

持久化中转增加一个明确的接收阶段。海外用户成功上传完整文件后可以结束连接,国内端稍后拉取;两个阶段各自维护状态和重试。一个文件的首次交付延迟会增加,因为国内下载需要等待文件完成发布,但文件是否可下载、断点属于哪个版本、何时可以删除,都有了确定依据。

托管对象存储也能提供持久化缓冲,并承担容量扩展与数据持久性管理。存储位置需要结合完整路径选择。国内存储桶与同一云、同地域的接收机之间使用内网访问,可以免除公网出站费用,跨境传输集中在海外上传阶段;海外存储桶向国内公网下载,则通常需要考虑出站费用。两种拓扑的费用不能混用。OSS 网络访问说明

传输加速适合原始跨境路径不能满足完成时限的情况。厂商接入点和骨干网络能够提供另一条路径,费用则在普通传输计费之外增加。这里需要比较加速前后的交付量、失败率与等待时间,才能确定额外成本是否值得承担。每份文件通常只回传一次,缓存重复访问的收益有限,也缺少为了内容分发而增加缓存层的理由。OSS 加速费用说明

自建持久化中转可以保留已有上传协议,自行选择节点与线路,并统一管理交付过程。上传方接入与国内端运行解耦,底层资源也可以独立调整。各层的职责因此明确:上传前端负责接收,存储层负责发布文件版本,国内端负责完成交付。

出站计费与成本结构

这一负载的资源费用可按传输量和存量拆开估算。出站费用随累计下载量增长,存储费用取决于计费存量。文件及时清理,可以降低存储占用,却不会消除已经发生的 90 TB 下载。降低出站单价与缩短文件驻留时间分别作用于不同费用项。

以下按 30 天、90 TB 数据计算,假定每份文件公网下载一次,标准存储月计费量取 750 GB,未启用传输加速。报价为正文修订时核对的官方公开价格,不对应 8 月至 9 月的实际账单。请求、税费、运维、备份及两端原有资源费用另计;750 GB 是比较假设,容量配置仍需覆盖峰值。

资源配置计价依据每月基础费用估算
OSS 香港,公网回传出站阶梯价 0.118、0.107、0.102 美元每计费 GB;标准存储另计约 8,918 美元,其中出站约 8,906 美元
OSS 新加坡,公网回传出站阶梯价 0.080、0.072、0.068 美元每计费 GB;标准存储另计约 5,990 美元,其中出站约 5,978 美元
Cloudflare R2 Standard公网出站免费,存储 0.015 美元每 GB 月,含 10 GB 月免费额度存储约 11.10 美元,另加超额请求费
欧洲独服上的自建中转AX102-1 的 1 Gbps 不限流量配置,租金 302.10 美元,IPv4 1.90 美元304 美元,另有一次性开通费 149 美元

OSS 使用二进制计费单位,90 TB 需换算为约 83,819 GiB,再分段计算免费额度与阶梯价格。香港配置的三个付费区间分别约为 1,196.52、4,382.72 和 3,327.14 美元,标准存储约为 11.79 美元。这里采用国际站按量价格,未计资源包或合同折扣。OSS 官方价格

R2 扣除免费存储额度后,费用为 740 × 0.015 = 11.10 美元。实际存储计费采用每日峰值的平均数,集中上传可能使计费量高于本文假设;分片、列举与重试也会影响请求费。表中使用 Standard 类型,不能直接替换为具有最低存储期限和读取费用的低频类型。R2 官方价格,R2 计价单位说明

独服示例提供两块 1.92 TB NVMe 和 1 Gbps 不限流量端口。按 12 个月摊销开通费,基础月费约为 316 美元。这一配置仅用于展示固定租金的成本结构,国内方向持续吞吐还需要通过目标线路验证。服务器配置,官方租金表,IPv4 价格,流量规则

若能完成每月 90 TB 的交付,304 美元基础月费相当于每 TB 约 3.38 美元。相对表中的新加坡 OSS 公网回传,差额约为每月 5,686 美元,即约 95%。这部分差异来自资源计费方式,不代表获得了相同的持久性、可用性和运维服务。固定租金的有效单位成本还取决于实际完成量:节点闲置或线路吞吐不足,单位成本都会上升。

R2 在该假设下的资源费用更低。如果上传入口可以统一为 S3,目标链路的持续吞吐也满足交付要求,托管存储有充分理由优先考虑。自建方案的价值在于兼容现有接入、选择节点与路由,并控制从发布到清理的交付流程。每天 3 TB 使部分按量出站方案的费用明显增长,但流量规模本身不足以证明自建一定更优。

多协议接入与单向交付

上传方使用的工具不同,统一要求更换客户端会增加接入改造与使用方的维护成本。保留 SFTP、FTPS 和兼容 S3 的入口,可以继续使用已有工具。三个协议最终写入相同的存储与交付模型,容量限制、账号隔离和文件发布规则集中处理,避免每个前端分别实现一套恢复逻辑。

接入协议之间存在不同的完成条件。普通文件上传需要成功结束写入,分片上传需要完成组装;连接断开和上传完成不能混为一谈。存储层接收的应当是明确结束、可以确定长度的文件版本。尚在写入或组装的数据保留在暂存阶段,不提前交给国内接收端。

国内端统一使用 HTTPS 拉取,减少了接收侧需要维护的协议数量。接收进程根据自己的空闲处理能力认领任务,可以在开始下载前检查目标空间,网络中断后自行恢复。中转端不必掌握国内主机的写入凭证,也不需要主动建立到每一台接收机的连接。

拉取模式将并发控制放在实际承担校验和落盘的一侧。增加接收任务会同时消耗网络、摘要计算和磁盘资源,国内端可以围绕这三者调整并发。中转端则通过任务认领防止正常情况下多个工作进程无约束地下载同一个版本。

这套接口呈现的是单向文件交付。文件已经送达国内之后,中转副本可以退出生命周期;国内文件修改不需要再反向同步。接口围绕对象的接收、交付和清理组织,无需承担双向修改合并、全目录状态收敛和多端编辑冲突。

文件版本与发布边界

文件路径对上传方有意义,但路径指向的内容会变化。某个路径第一次上传后,国内端可能仍在下载;第二次上传相同路径时,如果直接覆盖旧内容,下载的前半段和后半段便可能来自不同文件。即使能够检测摘要不一致,重新下载仍会增加传输量。

路径与内容版本需要分开管理。每次完整上传获得独立的版本身份、长度和 SHA-256 摘要,发布后的内容保持不可变。路径指向当前版本,下载任务绑定具体版本,因此同名更新不会改变已经认领的下载内容。这里的版本主要服务于交付一致性,不需要扩展为长期保存历史文件的版本库。

删除同样绑定版本。旧版本交付完成时,远端只清理旧内容;清理路径映射之前,还需要确认该路径仍然指向被清理的版本。假设较早上传的版本先被认领,较新版本随后发布,旧任务的完成确认不能删除后来上传的文件。这种条件清理比单纯按文件名删除多一步判断,却避免了正常并发顺序下的数据丢失。

文件发布还有持久化边界。写入成功可能只表示内容进入操作系统缓存,能够列出文件也不表示上传已经结束。写入结束后,需要同步文件、计算摘要、完成文件发布,再以本地事务登记版本与待交付任务。国内端只获取已发布的对象。

SHA-256 用于判断国内接收到的内容是否与中转发布的版本一致,文件长度则提供直接的截断检查。摘要覆盖的范围是这一交付阶段;若业务还需要证明内容与海外原文件一致,需要由来源额外提供可核对的摘要。明确校验边界,可以避免将传输校验误认为整个业务数据的正确性证明。

不可变内容也简化了断点续传。下载中断后,保存的文件前缀继续属于同一个对象,剩余内容可以按偏移拉取。恢复时重新读取前缀以重建摘要状态,最终仍对完整文件校验。这种处理减少了重复网络传输,恢复依据也比较直接,代价是需要额外本地读取,且读取量随已下载前缀增长。

租约与持久化确认

任务认领需要处理工作进程退出。永久标记一个文件已被接收端领取,会使意外退出的任务长期失去处理机会;仅靠进程内状态,又无法覆盖中转服务重启。处理权以有期限的租约授予,接收端在处理期间续租,未完成任务在租约释放或到期后重新进入可处理状态。

租约提供一段时间内的处理权,主要减少正常运行时的重复工作。跨境连接发生中断时,接收端无法立即知道服务端是否已经接受某次操作,服务端也可能需要等待租约到期才能重新分配。整个交付流程因此采用至少一次投递,并通过版本身份和幂等确认处理重复。

完成下载只是确认流程的起点。接收端首先核对长度与摘要,然后将文件内容同步到磁盘,发布到目标位置并同步目标目录,最后发送交付确认。目录同步用于持久化新文件的目录项,避免只同步了内容而未完成文件发布。中转端收到确认后,才进入该版本的清理阶段。

这个顺序将副本所有权的转移建立在可恢复的本地状态上。若先确认远端删除,再持久化国内文件,国内端在两者之间退出,就可能同时失去远端和本地可用副本。先完成本地持久化,最坏情况下会暂时保留两份内容,重启后仍有依据继续处理。

确认响应丢失是一个典型情况。国内文件已经持久化,中转端也已经执行删除,但接收端没有收到成功响应。此时确认操作必须允许重复执行,远端通过短期保留的删除记录识别已完成的版本。网络超时不会被直接解释为删除失败,更不应触发无条件重新上传。

如果国内文件已经存在且长度、摘要一致,接收端可以补交确认,省去再次下载。若内容不同,则报告冲突并保留远端副本。拒绝自动覆盖可以避免损失已有内容,代价是同名冲突需要人工处理。若希望自动接受同名更新,就需要记录目标文件的来源与交付版本,以区分正常更新和其他来源的文件。

可靠性在这里落实为具体操作顺序。确认之前允许重试,重复操作识别具体版本,清理之后保留足够的完成记录。这样即使传输与确认重复发生,也不会因为一个迟到的操作误删其他内容。

进程恢复与本地事务

元数据与待交付队列保存在同一个本地事务存储中。发布一个文件版本时,版本记录、路径映射和队列记录可以一起提交;认领任务时,处理权与对象状态也一起更新。文件内容由磁盘保存,队列仅组织已有对象的交付,不额外传送文件内容。

单独引入消息队列,会增加对象已经发布但消息尚未发送、消息已经发送但对象状态尚未提交等组合。需要再设计事务消息、补偿或定期核对,才能处理服务在两次写入之间退出的情况。文件与交付记录集中在一台节点时,本地事务可以同时提交相关元数据,减少额外服务的部署与一致性处理。

不过,本地事务并不能把数据库更新与文件系统操作变成同一个原子步骤。文件已持久化、元数据尚未发布,或文件已删除、交付记录尚未清理,都可能成为重启后看到的中间状态。因此文件发布与删除分别设置可恢复的阶段,启动及维护过程根据持久化记录继续完成。

中断位置重启后保留的依据恢复方式
上传尚未完成暂存文件与上传记录标记为中断,不投递半成品;保留可恢复内容并按期限清理
完整文件已落盘,版本尚未发布文件与发布中的记录核对现存内容,继续完成版本登记与入队
国内下载尚未完成对象身份与本地临时文件重新认领后复用前缀,重建摘要并继续下载
国内文件已持久化,确认尚未完成本地完整内容与远端交付状态核对内容后补交确认
远端删除尚未完成,或成功响应丢失待清理状态或删除记录继续清理,或重复返回已经完成的结果

恢复依据放在持久化状态中,进程内的连接和工作任务可以在重启后重建。正在上传、等待交付、已经认领和等待清理的文件各自有不同处理方式,无需通过扫描目录后猜测所有文件是否已经送达。

错误处理也需要保留明确的恢复条件。暂时的连接中断可以释放任务后重试,摘要失败保留明确的错误结果,目标路径冲突不应通过提前清理远端来消除。保留远端文件、处理状态和错误原因,重试或人工介入才有可靠的依据。

暂存容量与上传反馈

中转容量取决于文件到达后停留多久。按持续流入每天 3 TB、平均驻留 6 小时估算,平均存量约为 0.75 TB;驻留时间延长至 12 小时,平均存量变成约 1.5 TB。若同样的数据保存 30 天,稳态存量约为 90 TB。及时清理将容量需求约束在交付窗口内,这一优势来自生命周期管理,自建与托管存储都可以采用。

平均存量只能用于初步估算。国内端完全离线时,新增积压以每天 3 TB 增长:8 小时约增加 1 TB,24 小时约增加 3 TB,还要加上离线前尚未交付的文件。若国内接收速率只是下降,需要按流入与完成清理之间的差额计算剩余空间能支撑多久。

例如,国内端持续完成 200 Mbps 的有效交付,一天只能处理约 2.16 TB,日净积压约为 0.84 TB。额外 500 GB 空间只能支持约 14.3 小时。扩大磁盘可以延长缓冲时间,长期稳定仍要求交付并清理的平均数据量达到流入量。

容量还要覆盖数据处理中暂时出现的多份内容。分片上传在组装过程中,原分片与完整文件可能同时存在;中断上传会留下暂存内容,接收端也会保留下载临时文件。只统计已发布对象会漏掉这些占用,按一天的平均流量购买一块磁盘同样无法保证峰值时有足够空间。

独服示例的两块 1.92 TB 磁盘采用镜像后,可用容量约为 1.92 TB,实际还需扣除文件系统与运行余量。即使暂存盘原本为空,也无法吸收国内端中断 24 小时产生的 3 TB 数据。磁盘镜像可以覆盖部分单盘故障,对节点失效、误操作和更长积压则需要其他处理办法。

容量反馈按水位分级:75% 开始收紧上传预算,90% 拒绝新上传,95% 或最低可用空间不足时进入写入保护。低水位允许利用空闲资源,接近上限时让上传方明确感知暂时不可接收。下载、确认和清理仍是释放空间的必要路径,入口保护不能依赖暂停整个交付过程。

控制器同时观测上传、下载与确认删除速率,用这些观测估算剩余容量窗口,再结合账号权重与并发限制分配上传能力。入口长期超过出口时,控制机制负责阻止磁盘耗尽;它无法补足不足的线路容量。网络发送和空间释放的计量差异,也需要在实际运行中继续核对。

容量限制对上传方意味着退避和重试,但比接受完整文件后再因磁盘耗尽而无法兑现交付更可控。未完成上传可以按期限回收,已经接受并等待交付的文件则不能仅因空间紧张被随意删除。两者承担的责任不同,应在状态和清理规则中分别处理。

单机部署的适用范围

服务端以一个容器运行,国内端由一个常驻接收进程负责交付。配置、凭证和暂存数据独立持久化,账号之间隔离命名空间与访问凭证,并提供速率及并发限制。多协议入口共用同一套对象状态与容量管理,使接入方式增加时,交付规则仍然保持一致。

单机结构减少了需要协调的组件,也便于定位传输、元数据和磁盘之间的关系。文件内容需要较高的连续 I/O,控制状态需要可靠的小事务写入,两者的负载特征可以分别观察。上传、下载、确认清理的速率以及各阶段的文件数量,能够帮助区分线路不足、接收端处理缓慢和清理未完成。

单机结构的恢复能力依赖本地数据卷。进程重启和连接中断可以依据本地记录恢复,整台机器或数据卷丢失则需要跨节点副本或来源重传。若上传成功后源文件立即删除,业务就需要额外的副本保障;若来源仍保留可重新提交的数据,则可以围绕恢复时间和重传费用选择不同配置。

更高的可用性要求会改变成本结构。增加副本意味着额外存储和传输,增加节点还需要协调版本身份、任务所有权与删除结果。它们有明确的价值,应由可接受的数据损失与交付中断时间驱动。

文件接收、交付与回收需要由持久化记录连接起来,每项机制都对应一次可能中断的操作。节点需要明确记录已经接受哪些文件、哪些已经完成交付、哪些仍须保留。扩展到多节点时,任务分配、数据迁移和安全回收同样依赖这些状态,节点数量增加并不会消除对交付语义的要求。

跨境文件回传的存储转发架构与成本模型 · xylan / journal