世界を動かす技術を、日本語で。

AWS S3が遅いHDDの上で1ペタバイト毎秒をどのように提供するか

概要

AWS S3は、膨大なスケールで動作する分散型ストレージサービス。 HDDの物理的制約を克服し、並列化とイレイジャーコーディングで高い可用性・耐久性・スループットを実現。 データ分散とロードバランシングの工夫により、ホットスポット回避と予測可能なパフォーマンスを維持。 マルチパートアップロードやバイトレンジGETなどのAPI設計で効率的なアクセスを可能に。 巨大システムゆえに、規模が大きくなるほど全体の負荷が平準化され、予測性が向上。

AWS S3の驚異的なスケール

  • AWS S3 は、API経由でオブジェクトを保存・取得できる スケーラブルなマルチテナントストレージサービス
  • 可用性耐久性 が極めて高く、コストも比較的低廉
  • 400兆以上のオブジェクト毎秒1.5億リクエストピーク時1PB/s超のトラフィック数千万台のHDD を運用
  • スケールを支える中核は意外にも HDD(ハードディスクドライブ)
  • HDDはIOPS・レイテンシーに制約があるが、「 安価な大容量」という強みを最大活用

HDDの物理的制約と進化

  • HDD は物理的な動作(回転・アーム移動)が必要なため ランダムアクセスが遅い
  • 30年以上 IOPSは約120で頭打ち、レイテンシーも大きな進歩なし
  • 価格は60億倍安価容量7,200,000倍増加サイズ・重量も大幅減少
  • シーケンシャルアクセス に最適化されており、 ログ構造 のデータストアと相性が良い

S3のストレージバックエンドとLSM

  • S3の ShardStoreLSM(Log-Structured Merge Tree) ベース
  • 書き込みはシーケンシャル なのでHDDの性能を最大限活用
  • 読み込みはランダムアクセス が多く、HDDの弱点となる
  • 平均的なランダムリードは0.5MBで約11ms、45MB/s程度が限界

並列化によるスループット向上

  • S3は大規模な並列化 でHDDの制約を克服
  • 1TBファイルを1台のHDDに保存すると 最大300MB/s だが、 20,000台に分散 すれば TB/s級の並列リード が可能
  • これを実現するのが イレイジャーコーディング(EC)

イレイジャーコーディングの仕組み

  • K個のデータシャードM個のパリティシャード でデータを分割・冗長化
  • S3では 5-of-9スキーム (5データ+4パリティ)を採用
  • 最大4シャード喪失まで耐性1.8倍の容量オーバーヘッド で済む
  • 並列リード先が9箇所 になり、ホットスポット・ボトルネックを緩和
  • シャードが小さいため ヘッジリクエスト も低コストで実施可能

エンドツーエンドの並列化とAPI設計

  • ユーザー側 :ファイルをチャンク分割してアップロード/ダウンロード
  • クライアント側 :複数のフロントエンドサーバーへリクエスト送信
  • サーバー側 :オブジェクトを複数ストレージサーバーに分散
    • マルチパートアップロード で複数スレッドによる高速PUT
    • バイトレンジGET で部分的な高速リード
  • 大量の小さなリクエストを並列化 することで全体スループットを最大化

ロードバランシングとホットスポット回避

  • データ配置はランダム化 が基本
  • Power of Two Random Choices で、2つのランダムノードから負荷の少ない方を選択
  • 新しいデータほどアクセス頻度が高い ため、時間とともに自然に「冷却」される
  • リバランス も頻繁に実施し、空き容量やI/Oを有効活用
  • 新規ラック追加時も 自動的にデータを分散

巨大システムならではの予測性

  • 規模が大きいほど全体負荷が平準化 し、ピークと平均の差が縮小
  • 多数の独立したワークロードが同時にバーストしないため、 総合的な負荷が予測しやすい
  • マルチテナント による経済性とスムーズなオペレーション

まとめ:S3のエンジニアリングの要点

  • エンドツーエンドの大規模並列化 でHDDの物理的制約を克服
  • イレイジャーコーディング による効率的な冗長化と高スループット
  • ランダム配置・リバランス・ホットスポット回避 の工夫
  • API設計 で並列化・部分リード・マルチパートアップロードを推奨
  • 巨大システムの規模の経済性 を最大限に活用

S3は、もともとバックアップや静的ファイル用のサービスとして始まったが、今や世界最大級の 汎用ストレージ基盤 へと成長。 その裏には、HDDの制約を逆手に取った 分散システム設計運用ノウハウ が詰まっている。

Hackerたちの意見

S3についてもっと面白い記事があると思うんだけど、「Building and operating a pretty big storage system called S3」ってやつ。

すごくいい記事だった、ありがとう!

当時話題になったこと: S3というかなり大きなストレージシステムの構築と運用 - https://news.ycombinator.com/item?id=36894932 - 2023年7月(コメント160件)

HDDを考慮して設計されたオープンソースのサービスで、似たようなパフォーマンスを出せるものってある?大手のはHDDとあんまり相性良くないって知ってるけど、MinIO、Swift、Ceph+RadosGW、SeaweedFSとか、みんなフラッシュ専用の展開を勧めてるよね。最近Garageに興味を持ってるんだけど、デザインがかなり違うみたい(ECなし)。

Ceph以外にも軽くググってみたら、Glusterっていうのもあるね。「一般的なオフ・ザ・シェルフのハードウェアを使って、大規模な分散ストレージソリューションをメディアストリーミングやデータ分析、その他のデータや帯域幅を多く使うタスクのために作れる」って自称してる。オープンソースで無料だし。ただ、直接の経験はないけどね。

どれも同じように機能するけど、たくさんのデータセンター分のドライブが必要で、そういう展開はほんと少ないよね。横のスケーリングと縦のスケーリングのトレードオフがあるから、フラッシュの方が速いアクセスにはスペースやコスト効率がいいんだよね。

LustreとZFSも似たような速度が出せるよ。ただ、高いIOPSが必要なら、LustreにはMDSにフラッシュが必要だし、ZFSには専用の書き込み用と読み込み用のLog SSDが必要だね。

SeaweedFSはここ数年でかなり進化して、RDMAサポートやECも追加されたよ。

前の仕事ではSwiftStackを使ったオブジェクトストレージがあったんだけど、メタデータの保存にはSSDを使って、オブジェクトは普通のHDDに保存してた。まあ、そこそこうまくいってたよ。

Ceph+RadosGWはHDDと相性がいいと思うよ。条件としては、1) インデックスプールにはSSDを使うこと、2) HDDプールから得られるIOPSの数を現実的に考えることが大事。あと、個々のクライアントのIOPSに対しては、トリプルストレージやエラーチェックを使ってもIOPSが掛け算になることを忘れないで。S3もIOPSの掛け算があって、たくさんのHDDで解決してる。大きなオブジェクトストレージで、主に4MBのチャンクをストリーミングする場合は、特に問題ないけど、小さなランダムな読み書きがたくさんある場合や、一つの大きなキーに対しては、バックストアがついてこれるか確認する必要があるね。

Apache Ozoneは、100ペタバイト以上のクラスターをいくつも運用してるよ。容量はHDDに、メタデータはSSDに載せてる。更新されたドキュメント(新しいドキュメントの準備中): https://kerneltime.github.io/ozone-site/

11年間、プロダクションのCephクラスターを運用してきて、これまでのところ大規模なアップグレードのためのフルスケジュールダウンタイムは1回だけだったよ。3世代のハードウェアを使ってね。簡単とは言わないけど、難しいとも言えないかな。以前はradosgwのインデックス用にSSDを使ったり、いくつかのVM用に速いプールを作ったり、バルクオブジェクトストレージにはハードドライブを使ってたんだ。5ノードでそれぞれ10台のドライブを運用してたから、重いリカバリーの時にたまにIOPの問題があって疲れたから、最後のアップグレードで100% NVMeドライブに移行したんだ。コストを抑えるために、良い取引が出たときにeBayで中古のエンタープライズ用マイクロンのドライブを買ってたよ。それ以来、何を投げてもパフォーマンスの問題は出てない。お勧めするけど、他のオプションについての経験はないからね。理論的にはまだ一番の選択肢だと思う。ただし、CephFSには近づかない方がいいよ。パフォーマンスが本当にひどくて、プロダクションで使うには自分を足元から撃つことになるから。

Hacker Newsで議論の続きを見る