ストレージサーバーのスケールアウト
アプリケーションサーバーやDBサーバーのスケール方法については一通り情報が出そろっていて、どこも同じような方法でやっているような気がしているのですが、ストレージサーバーについてはあまり情報がないなぁと思っていました。
自分が知る限り最良の記事である、kazeburoさんの記事とgreeのイメージクラスタの記事を読んでざっくりまとめてみました。
ストレージサーバーの構築は経験がないので、もう少し運用方法とか含めてしりたいですね。ご存知の方がいれば、他の方法もあるよ!とか、他ではこうやってるよ!など、是非教えてください。
画像のWriteの分散
- アプリケーションでは、非同期で画像変換タスクをQueueに追加
- Gearmanでやってるところもあれば、TheShwartzでやってるところもあるみたいですね
- WorkerでQueueからタスク受け取って画像変換
- 画像変換後、画像をWebDAV経由でStorageサーバーにコピー
- アップロードはバックアップをかねて2台のサーバーにコピー
- どのサーバーにアップロードするかはファイル名から分散させるように、
できるアルゴリズムを決定する
(Consistent Hashing or so)
画像のReadの分散
director層
- mod_proxy(mod_proxy_balaner)とmod_rewriteが組み込まれています。
- Reverse ProxyやSquidのcacheサーバからのリクエストのURIから、
画像ファイル名の剰余を求め正しいストレージサーバへproxy
SquidのキャッシュサーバーとStorageサーバーを密に結合しないようにすることで、
設定ファイルのメンテナンスコストを下げ、かつストレージサーバーへの負荷の
balancingもしていると。AppServerとDBサーバーの間のLVS的な存在のようなものみたいですね。
ポイント
何点かポイントがあるようなので、少しまとめてみました。
疑問点
- storageサーバーの冗長性の確保方法はどうする?
- 複数のストレージサーバーにアプリ側でコピーするのは失敗したとき面倒そうだなぁとか。
- DRBD + Heartbeat?
- ストレージサーバーのバックアップとリストアの方法
- サイズ大きいだけに復旧するのが面倒そうだなぁ
- 画像のサイズが大きくなると、どうキャッシュさせていくのがいいのか
- そもそも自前でこんなのやらないのかなぁとか