Wasabi 对象存储服务使用实践

本文更新于 2024 年 3 月,更新了 Wasabi 服务的价格信息。

先前一段时间,我在浏览 Cloudflare 带宽联盟页面的时候了解到了 Wasabi。Wasabi 是一家提供对象存储服务的企业。与其他竞争对手(通常是大型云服务提供商)不同的是,Wasabi 的对象存储服务提供了极其简单且可预测的价格模型。根据官方网站的宣传,Wasabi 对象存储服务的使用成本要比 AWS S3 低 80% 左右。

先前在考虑如何托管博客图片、搭建网盘以及存储备份/日志数据时都考虑过各个云服务商的对象存储服务,但是复杂的存储层级和不可预测的计费模式均成为了当时选择的阻碍。了解到 Wasabi 提供的服务后,我花了一些时间对其进行调研使用,遂撰写本文,以向大家分享 Wasabi 对象存储服务的使用实践。

服务与计费模型

Wasabi 对象存储服务采用了直观且可预测的计费模型:

  • 对于每 TB 的对象存储空间,6.99 美元/月
  • 入口流量、出口流量和 API 调用是免费的
    • 每月的出口流量不超过当前使用的存储空间总和
  • 如果对象存储不足 90 天而删除,会为该对象收取补足至 90 天的存储费用

一些其他对象存储服务商提供的服务通常根据数据的读取频繁程度将数据分为不同的存储层(热存储、冷存储以及归档存储等),针对每一层数据,出口流量以及 API 请求数等均单独计费。Wasabi 将所有存储对象均视为热存储,数据随时可以在需要时被读取。即使将 Wasabi 提供的服务用作归档存储,其每月费用仍比其他主要竞争对手的(收费最低的产品)价格还要低。Wasabi 对象存储服务同样提供对于 S3 API 的兼容性。

与 AWS S3 的标准存储层不同,Wasabi 会收取对于未满 90 天对象的额外删除费用。根据这篇支持文章,如果你的对象通常存储不超过 23 天,则 AWS 对象存储服务的成本会比 Wasabi 要低。否则,Wasabi 对象存储服务的成本则更加划算

作为一名开发者,我十分关注所使用的服务每月成本的可预测性。可预测的成本能够使开发者更多地将精力聚焦于创造本身,而非饱受每月不确定数额的账单的困扰。例如,当用户受到拒绝服务攻击(DoS)时,按请求量计费的服务通常会为用户产生天价账单,而较小规模的开发者是无法承受这样的不确定性的。 Wasabi 服务的计费模型非常易于理解——上一次有这样的体验还是在初次了解 Cloudflare 时,对于 DDoS 攻击的未计量免费缓解服务。

一张屏幕截图,展示了 wasabi 的简明计费项目(左侧)以及竞争对手 AWS S3 的复杂计费项目(右侧)
一张来自 wasabi.com 的页面截图,显示与其他对象存储服务提供商(如 AWS S3)相比,wasabi 的计费模型简明且费用较低

Wasabi 使用以 20 个磁盘为一组的存储阵列,提供拥有 11 个 9 的极高可靠性(99.999999999%)持久化存储性能。这意味着,如果存储 1 万个文件对象,平均来说经过 1 千万年时间会遇到一次文件损失。如果在单个地域存储文件,Wasabi 官方文档描述的服务可用性为 99.9%(每年约 8 小时停机时间)。

这里有两个关于使用量的限制:分别表明用户在使用 Wasabi 的对象存储服务时,每月的出口流量不超过当前正在使用的存储空间总量。以及必须将请求 API 的频率控制在合理范围之内。上述两个限制约束了用户使用 Wasabi 可以从事的业务用例,例如直接利用对象存储服务搭建静态网站、作为静态资源的直接分发网站(图床、视频站、镜像站等)都是不合适的。

适合的使用场景

综上所述,Wasabi 对象存储服务适合用于以下场景:

  • 作为图床、视频站或镜像站的源站
    • 源站不直接为用户提供服务,由另外的 CDN 服务商(如 Cloudflare)为用户提供服务
  • 数据备份或归档存储
  • 业务日志存储
  • 数据分析与数据仓库
  • 个人网盘等

所有月均出口流量小于等于存储容量的业务用例均适合使用 Wasabi 对象存储。以我自己的需求为例,先前一段相当长的时间我一直有数据备份的需求,但是苦于没有找到一个可用的解决方案:因为对于数据备份来讲,我所依赖的备份媒介应该具有以下特征:

  • 使用网络存储,随时随地需要数据的时候都能够访问
  • 高数据可靠性(至少要与 RAID 5 NAS 在同一水平)
  • 低成本

对于 1TB 的文件存储需求来说,使用 Wasabi 的服务的每年成本为 71.88 美元。该成本相较于自己在本地搭建 NAS 系统来说非常具有竞争力,且不再需要考虑硬件和网络的维护问题。

使用实践

数据备份

本小节,我以本博客(DGideas’ Blog)的实际数据备份需求为例,向读者分享 Wasabi 对象存储服务的使用实践。博客类网站需要备份的文件一般如下:

  • 数据库内容
  • 站点文件夹,以及
  • 多媒体附件(每篇文章中的图片等)

其中,本博客中的所有多媒体附件使用了单独搭建的对象存储服务,需要备份的内容只有数据库以及站点文件夹两部分内容。为了能够自动化地备份内容,我使用 Python 编写了博客自动化备份服务,可以在这里看到。其中主要代码节选如下:

...
os.system(f"mysqldump {os.environ.get('BACKUP_DB_NAME')} > {TMP_BACKUP_LOCATION}")
s3 = boto3.client(
    's3',
    endpoint_url=os.environ.get("BACKUP_S3_ENDPOINT"),
    aws_access_key_id=os.environ.get("BACKUP_S3_KEY_ID"),
    aws_secret_access_key=os.environ.get("BACKUP_S3_ACCESS_KEY"),
)
s3.upload_file(
    TMP_BACKUP_LOCATION,
    os.environ.get("BACKUP_BUCKET_NAME"),
    f"{os.environ.get('BACKUP_KEY_PREFIX', '')}{datetime.datetime.now().isoformat(timespec='seconds')}.sql"
)
...

在上述节选代码中,我们通过系统调用的方式执行 mysqldump 命令,该命令能够将 MySQL 数据库中的内容导出为 .sql 后缀名的文件。然后,我们使用 boto3提供的 S3 API 与 Wasabi 对象存储服务建立连接并鉴权。而后,使用 upload_file 方法将文件上传至服务器中。

一张屏幕截图,展示了 wasabi 后台控制台的文件管理功能
Wasabi 同时提供了网页版本的资源管理界面,用户可以通过浏览器管理已有文件或上传新文件

整个过程中,由于 Wasabi 兼容 S3 API 协议,我们可以充分利用已经习惯的操作方式以及已有库函数来操作对象存储服务,而无需对代码的核心逻辑部分进行任何更改。我们可以为博客备份文件单独设置桶(Bucket),然后通过权限设置实现博客服务器上使用的访问密钥仅有只写权限。这样一来,即使博客服务器受到攻击,攻击者通过只写密钥也无法对已经上传的备份文件进行任何破坏性操作。

资源库

Wasabi 同时可以做为资源提供者的源站来使用。在本示例中,我们尝试使用 Wasabi 托管一个静态页面,并通过由 Cloudflare 代理的自定义域名访问它。

要创建一个可供公开访问的存储桶,用户需要首先成为 Wasabi 的付费层级用户

根据 Wasabi 的支持文章,如果希望通过自定义域名来访问对象,需要将存储桶的名称设置与自定义域名一致。在本示例中,我们以域名 example.dgclouds.net 为例,此时我们创建一个同名的存储桶后,更改该桶的 Polices(策略)页面添加如下策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example.dgclouds.net/*"
    }
  ]
}

上述 S3 兼容格式的策略允许任意用户直接访问该桶中的任意对象。其中 arn:aws:s3:::example.dgclouds.netARN 部分。我们同时需要在 Cloudflare 域名 DNS 设置部分创建对应域名的 CNAME 记录,由 Cloudflare 代理地将域名 CNAME 到 Wasabi 指定区域的服务器中。这样设置好后,当用户访问 example.dgclouds.net 时,Cloudflare 将代理本请求并从 Wasabi 对象存储服务中获取数据。这样做的好处是,Cloudflare 的服务器可以作为 CDN(内容分发网络),加速网络流量并在边缘节点缓存内容,以节省 Wasabi 存储桶的出口流量并避免重复请求。有关 Cloudflare 边缘缓存的更多内容,请见此处

我们在该桶中上传文件后,用户就可以通过自定义域名来请求对象:

$ curl https://example.dgclouds.net/hello
hello, world!

一些其他

对于 Windows 与 macOS 用户,Wasabi 提供了免费的(基于 MSP 360 构建的)桌面客户端软件,可以在这里下载。另外 Wasabi 还为 Windows 用户提供了付费版本的 NAS 客户端软件。

另外,可以将 awscli 配合 Wasabi 来使用:只需使用 aws configure 命令来配置 awscli 所使用的凭据,然后即可通过 aws s3 命令来上传、下载或管理本地与 Wasabi 存储桶中的对象。

总结

一些中型技术服务商(如本文中的 Wasabi)专注于某项具体服务的构建。这些技术服务商的产品成本相较于大型云服务提供商(如阿里云或 Google Cloud)可能更具优势。在调研和选取技术方案时,尤其是对于成本敏感型个人或组织,考虑组合使用这些服务商提供的服务会在大幅减少成本的情况下同样能够提供高质量的服务。但相关中文资料可能比较少,这要求技术选型者拥有深入思考调研的能力。

撰写本文时(2022 年 5 月),Cloudflare 推出了自家的对象存储服务 R2 的测试版本。从个人视角,我认为 Cloudflare R2 是可能与 Wasabi 竞争的对象存储服务:这是因为 Cloudflare 本身维护了一个遍布世界的大型网络,带宽成本仅占其中的很小一部分。Cloudflare R2 的计费模型中也没有网络流量费用一项,虽然单位空间的存储价格比起 Wasabi 要贵出将近两倍,但由于不限制出口流量,Cloudflare R2 提供的对象存储服务可能更适合开发者搭建网站或进行软件分发。我们也在持续关注性价比更高,更具竞争力的网络服务。