Upgrade to Pro — share decks privately, control downloads, hide ads and more …

YAPC Asia 2010 30days Albumの裏側 後日談

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

YAPC Asia 2010 30days Albumの裏側 後日談

関西オープンソース 2008でお話しした、ペパボでは珍しくPerlをふんだんに つかっているサービス「30days Album」について、その後どうなったのか、 という話を、主にMogileFS運用上の苦労話、といった観点からお話ししたい と思います。

関西オープンソース 2008での発表資料はこちらです。 http://www.slideshare.net/mizzy/2008-30days-album-presentation

http://yapcasia.org/2010/talks/63D6A01E-BC8C-11DF-8791-B9FC0F276C45

Avatar for Kensuke Nagae

Kensuke Nagae

May 23, 2012
Tweet

More Decks by Kensuke Nagae

Other Decks in Technology

Transcript

  1. 自己紹介 • 金子 健介 • 所属 o 株式会社 paperboy&co. o

    ホスティング事業本部 30days Album チー ム o プログラマ • ハンドルネーム等 o 刺身☆ブーメラン o id:a666666 o @kyanny
  2. 30days Album とは • http://30d.jp/ • 写真共有・保存サービス • 2008年4月〜 •

    期間限定オンラインアルバム • 容量無制限オンラインフォトストレージ
  3. 30days Album の裏側 (1) • 表側は Ruby on Rails •

    裏側はいろいろ o Perlbal o MogileFS o Gearman o TheSchwartz o Catalyst 実はけっこう Perl を多用してます
  4. 30days Album の裏側 (4) • 疎結合を意識したシステム構成 o 各コンポーネント間は HTTP API

    でやり取 り o API は Catalyst 製ウェブアプリケーション o REST を意識したシンプルな実装 (GET, PUT)
  5. 30days Album の裏側 (5) • メリット o 負荷分散 o 開発能率アップ

    得意な人に任せられる o メンテナンスのしやすさ  他のコンポーネントへの影響が少ない o 他のサービスからの利用 ログピ http://logpi.jp/ ブクログのパブー http://p.booklog.jp/
  6. 30days Album の裏側 (6) • デメリット o システム構成の複雑化 一台のサーバが複数の役割を持つと把握 しづらい

    o サーバ台数の増加 o レイヤーが増えることによるオーバーヘッ ドの増加 o 他サービスへの影響範囲の増大 例: 障害、メンテナンス
  7. MogileFS の障害対応の話 (1) • ストレージサーバでディスク障害が発生した • LVM で構築していたデータ領域は修復不可 能 •

    どのように対応したか • MogileFS のストレージプールから切り離 し • サーバを再構築 • ストレージプールに復帰
  8. MogileFS の障害対応の話 (7) • コピーされていることを確認するには • X-REPROXY-URL ヘッダをみる • dead

    にした device の URL が外れる • 別の device の URL が追加される • file_on テーブルのレコード数を数える SELECT COUNT(*) FROM file_on WHERE devid = 5; • 他の device へコピーされるたびに減る
  9. MogileFS の障害対応の話 (10) • その他にやったこと o Perlbal を再起動する X-REPROXY-CACHE-FOR をクリア

    dead な device の URL をキャッシュし てるため Perlbal は X-REPROXY-URL が 200 を返 さないと次の URL をとりにいくため、 必須ではない
  10. MogileFS のリバランスについて (1) • リバランスとは o ストレージノード間でデータを平準化する 機能 o バックグランドで走る

    o 任意のタイミングで開始・終了できる o http://code.google.com/p/mogilefs/wiki/Rebala $ mogadm settings set enable_rebalance 1
  11. MogileFS のリバランスについて (5) • どういうときに使うか • 新しいストレージノードを追加したとき • 残容量が少なくなったとき •

    class を変更したとき • ファイルのコピー数を制御する仕組み • ファイルの重要度によってコピー数をか えられる • あとで変更することができる
  12. MogileFS のリバランスについて (7) • 注意点(続き) o ネットワーク帯域をかなり使う o ストレージノードのディスク I/O

    も激しい o サーバリソースのモニタリングは必須 Munin を使ってます o サービスへのアクセスが多い夜間はオフに
  13. 自作サーバのスペック • CPU o Inete Celeron E3000番台 • RAM o

    DDR2メモリ 2GB(1GBx2) • HDD o データ領域 2TB HDD x 8 o システム領域 Intel製40GB SSD x 1 • マザーボード o Intel製microATXマザー • ポートマルチプライヤ
  14. 自作サーバこぼれ話 (1) • パーツ選定の基準 o 値段 > 信頼性 o MogileFS

    で冗長化できているためパーツ 単体の信頼性は高くなくてもよい 今のところハードウェアに起因する障害 は無し • 設計のノウハウがなく苦労した o 自作サーバカンファレンスで仕入れたネタ がベース o Cerevoさんとはてなさんを参考にさせて頂 きました
  15. 自作サーバこぼれ話 (2) • MP-100 の 100 って? o 制作当時、馬崎さんの体重が 100kg

    だっ た o 現在は省エネ化して 75kg o ちなみに Max 値は 125kg
  16. 自作サーバの今後 • 次の目標 o HDD 12 本搭載 HDD マウンタの作成が課題 o

    ストレージ以外の用途も検討 ジョブサーバなど
  17. FLV の疑似ストリーミングの話 (1) • FLV の疑似ストリーミング o 例: YouTube, ニコニコ動画

    o シーク可能であること • 一般的な仕組み o 動画プレイヤーが ?start=**** のようなクエ リストリングつきでリクエストを送る **** の部分はバイト数 FLV ファイルに埋め込まれたメタデータ o サーバ側で **** の部分に応じたデータを返 す FLV ヘッダを付与する必要あり
  18. FLV の疑似ストリーミングの話 (2) • 一般的なソリューション o lighttpd の mod_flv_streaming が有名

    o http://blog.lighttpd.net/articles/2006/03/09/flv- Apache や nginx にも同様のモジュール がある o 30days Album は Perlbal を使っている
  19. FLV の疑似ストリーミングの話 (3) • どうやって解決したか o Perlbal プラグインを書いた Reproxy リクエストに

    Range ヘッダを 追加 レスポンスヘッダを調整 レスポンスボディに FLV ヘッダを追加 o フックポイントを追加するために本体にも 手を入れた http://github.com/mizzy/Perlbal/commit/cb6
  20. Perlbal と Range ヘッダの話 (1) • Range ヘッダつきリクエストを送ると Perlbal がエラーを返す

    • 原因は X-REPROXY-EXPECTED-SIZE ヘッダ • データが不完全でないかチェックする仕組 み o Perlbal と MogileFS の間のストレージ API で付与している
  21. Perlbal と Range ヘッダの話 (2) • Perlbal はどう振る舞うか • ストレージ

    API へ GET • ストレージ API が X-REPROXY-URL と X- REPROXY-EXPECTED-SIZE を返す o X-REPROXY-URL ヘッダで返された URL を GET o Content-Length と X-REPROXY- EXPECTED-SIZE を比較 o 数値が一致しなければ次の X-REPROXY- URL をとりにいく
  22. Perlbal と Range ヘッダの話 (3) • 問題点 o Content-Length と

    X-REPROXY- EXPECTED-SIZE が常に異なってしまう o ストレージ API が Range ヘッダを考慮 していなかったため o Perlbal は次の X-REPROXY-URL をとりに いく o 全ての URL に対して Reproxy 失敗とみな して 503 を返してしまう
  23. Perlbal と Range ヘッダの話 (4) • どうやって解決したか o Range ヘッダがある場合は適切な

    X- REPROXY-EXPECTED-SIZE ヘッダを返 すようにした o 複数のレンジセットが指定されている場合 は X-REPROXY-EXPECTED-SIZE ヘッダ を返さないようにした 例: Range: bytes=0-100,200-300 参考: 部分的 GET とレンジ単位
  24. まとめ • MogileFS の運用ノウハウ・苦労話 o リバランスの概要説明 o 障害対応の事例紹介 • 自作サーバの紹介

    • Perlbal の運用ノウハウ・苦労話 o 動画配信にまつわる諸問題の事例紹介 o Perlbal プラグインや本体の拡張で対応し た