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

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

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

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 プラグインや本体の拡張で対応し た