インフラ ストレージ Bayt 30days Album

S3のAPIと互換性を持ったオブジェクトストレージの運用についてお話します

インフラ ストレージ Bayt 30days Album

はじめまして。 技術部プラットフォームグループの@rsym1290です。

弊社ではBayt(ベイト)というプライベートなオブジェクトストレージを運用しています。 本記事では、Baytの紹介と最近の取り組みについて紹介したいと思います。

Baytとは?

Baytとは、S3と互換性のあるAPIを提供しているプライベートなオブジェクトストレージです。 弊社では様々なサービスを提供していますが、各サービスで画像・動画・テキストなどのコンテンツを扱うことが多々あり、 それらを保存できるストレージが必要です。 このストレージを提供しているのがBaytです。

特に利用しているのはカラーミーショップグーペです。 カラーミーショップで利用する商品画像や、グーペで利用するホームページ用の画像の保存先としてBaytを利用しています。

Baytの利用例

カラーミーショップについては、昨年12月に「カラーミーショップの商品画像の最適化を実施しました」という記事を公開しています。こちらの記事における商品画像の保存先がまさしくBaytです。

構成・規模

構成について簡単に解説します。 より詳しく知りたい方は、こちらの資料をご参照ください。

ペパボでは2008年より30days Albumという、ユーザの皆様が撮影した画像や動画をアルバム形式で共有できるサービスを提供しています。 画像や動画を保存するために、MogileFSというOSSを活用したオブジェクトストレージを構築・運用しています。 このMogileFSをベースとしたオブジェクトストレージを、インターネット経由で利用できるようにAPIを新調したのがBaytです。 そのため、30days AlbumとBaytはそれぞれ異なるサービスですが、バックエンドでは同じオブジェクトストレージに合流しています。

オブジェクトストレージの内訳

30days AlbumとBaytの両方を合わせて約31.5億件のオブジェクトを保有しています。 その内訳は以下のとおりです。

  • 30days Album:約29.0億件
  • Bayt:約2.5億件
    • カラーミーショップ:約2.2億件
    • グーペ:約0.2億件
    • その他:約0.1億件

サーバ構成

Baytを構成するサーバは以下のとおりです。 30days Albumを含めた構成は先述の資料をご参照ください。

先述の通り、Baytと30days Albumはバックエンドは同じオブジェクトストレージに合流しています。 そのため、ストレージサーバは30days AlbumおよびBayt両方のオブジェクトを保有しています。 オブジェクトは日々アップロードされ続けており、これに耐える運用を実現するために、総量4PBという巨大なストレージを実現しています。

  • リバースプロキシサーバ:2台
  • APIサーバ:3台
  • データベースサーバ:3台
  • ストレージサーバ:10台
    • 総量:約4PB
    • HDD本数:377本

なぜBaytを作った?

なぜS3を使わず、わざわざS3互換のオブジェクトストレージを開発・運用しているのか?

Baytは2015年に運用を開始しています。 この当時からすでに既に30days Albumを運用しており、ストレージの運用ノウハウが十分に蓄積されていました。 このことを踏まえ、S3を利用する場合と既存のストレージを活用して自社で運用する場合を比較した結果、後者のほうがコストメリットが大きいことがわかりました。

そのため、S3を利用するよりもBaytを開発・運用したほうが良いという判断に至りました。

S3は使わないの?

ではペパボのサービスはS3を使用しないのか? そんなことはありません。

AWSではS3以外にも豊富なサービスが提供されており、これらと連携してS3を利用できます。 例えば、S3に画像がアップロードされたらLambdaで画像を加工する関数を実行したりできます。 また、S3は複数の拠点にまたがってデータを同期的に保存しており、例えば2拠点で同時にデータ喪失を起こしても、素早く検出・修復できるという高い堅牢性があります。

コスト面ではBaytのほうが優位性がありますが、機能・堅牢性についてはS3のほうが優れています。 サービス毎にメリット・デメリットのバランスを考え、Baytを採用するかS3を採用するかを決めております。

また、BaytはS3と互換性のあるAPIを提供していると先述しましたが、全APIに対して互換性があるわけではなく未サポートなAPIやオプションもあります。 そのため、Baytで未サポートのAPIを使用したい場合は必然的にS3を採用する必要があります。

最近の取り組み

CopyObjectというAPIを使えるように実装に取り組んでいます。 CopyObjectとは、アップロード済のオブジェクトを別名で複製して保存することができるAPIです。 仕様はこちらに記載されています。

CopyObject - Amazon Simple Storage Service

実装のきっかけ

Baytを利用しているサービスで、大容量コンテンツのリネームをできるようにしたいという要望があり、これが実装のきっかけとなりました。 従来の使い方の場合、アップロード済のコンテンツを一度ダウンロードし、ファイル名を変えて再アップロードしていました。 大容量のコンテンツをインターネット経由でアップロードすることになり、これに伴う課題がありました。 具体的には、タイムアウトが発生してアップロードが失敗しやすかったり、仮に再アップロードできてもコンテンツのデータの一部が欠損したり別の内容になってしまうことがあるというものです。

カラーミーショップではphp製のS3 SDKを使用しています。 このSDKでは、CopyObjectというAPIとDeleteObjectというAPIを組み合わせることで、ファイル名のリネームを実現しています。 BaytではDeleteObjectはサポートしているものの、CopyObjectはサポートしておりませんでした。 そこで、CopyObjectを実装することで、SDKでファイル名をリネームする処理を使えるようにすることにしました。

CopyObjectを使うと再アップロードをせずとも、同じ内容でファイル名だけ異なるコンテンツを生成できます。 そのため、インターネット経由でアップロードするために発生する課題を回避することができ、大容量コンテンツのリネームを容易にできるようになることが期待できます。

まとめ

S3と互換性のあるオブジェクトストレージBaytについて紹介しました。 Baytの運用について引き続き改善していくことで、ペパボが運用するサービスの品質を向上させ、ペパボのサービスを利用していただいているユーザ様に良い体験を届けたいと思います。