ストレージサーバーのスケールアウト

アプリケーションサーバーやDBサーバーのスケール方法については一通り情報が出そろっていて、どこも同じような方法でやっているような気がしているのですが、ストレージサーバーについてはあまり情報がないなぁと思っていました。

自分が知る限り最良の記事である、kazeburoさんの記事とgreeのイメージクラスタの記事を読んでざっくりまとめてみました。

ストレージサーバーの構築は経験がないので、もう少し運用方法とか含めてしりたいですね。ご存知の方がいれば、他の方法もあるよ!とか、他ではこうやってるよ!など、是非教えてください。

画像のWriteの分散

  • アプリケーションでは、非同期で画像変換タスクをQueueに追加
    • Gearmanでやってるところもあれば、TheShwartzでやってるところもあるみたいですね
  • WorkerでQueueからタスク受け取って画像変換
  • 画像変換後、画像をWebDAV経由でStorageサーバーにコピー
    • アップロードはバックアップをかねて2台のサーバーにコピー
    • どのサーバーにアップロードするかはファイル名から分散させるように、

できるアルゴリズムを決定する
(Consistent Hashing or so)

画像のReadの分散

Reverse Proxy層
  • mod_proxy_balancerでSquidサーバーを分散
    • キャッシュするほどアクセスのある部分はSquid
    • それ以外はSquid介さずにスルー
Squid
  • Squidによるcacheサーバとそれを分散するbalancer
  • Squidのbalancer
    • Squidサーバーの分散は、CARP(Cache Array Routing Protocol)を使う
      • URIとcacheサーバのhash値を組み合わせてアクセスするサーバを決定
      • mod_proxy_balancerのbalanceアルゴリズムを追加すれば、balancerは不要かも
director層
  • mod_proxy(mod_proxy_balaner)とmod_rewriteが組み込まれています。
  • Reverse ProxyやSquidのcacheサーバからのリクエストのURIから、

画像ファイル名の剰余を求め正しいストレージサーバへproxy

SquidのキャッシュサーバーとStorageサーバーを密に結合しないようにすることで、
設定ファイルのメンテナンスコストを下げ、かつストレージサーバーへの負荷の
balancingもしていると。AppServerとDBサーバーの間のLVS的な存在のようなものみたいですね。

ポイント

何点かポイントがあるようなので、少しまとめてみました。

  • 画像のストレージ先をどう分散させるか
    • CARP, Consisten Hashing
  • ストレージサーバーへのwrite/readはhttpで
      • NFSサーバーが死んでappserverが応答しなくなることを避ける
  • 画像のキャッシュ
    • よく読まれるものをcache
    • キャッシュ手段
  • ストレージサーバーの対障害性

疑問点

  • storageサーバーの冗長性の確保方法はどうする?
    • 複数のストレージサーバーにアプリ側でコピーするのは失敗したとき面倒そうだなぁとか。
    • DRBD + Heartbeat?
  • ストレージサーバーのバックアップとリストアの方法
    • サイズ大きいだけに復旧するのが面倒そうだなぁ
  • 画像のサイズが大きくなると、どうキャッシュさせていくのがいいのか
  • そもそも自前でこんなのやらないのかなぁとか

TODO

  • MogileFSについても後でまとめる

special thanks to Hな人!