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

3,894 views

Published on

関西オープンソース 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

Published in: Technology

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

  1. 1. 30days Album の裏側 後日談 YAPC::Asia Tokyo 2010 2010/10/15
  2. 2. はじめに CM をご覧ください
  3. 3. 自己紹介 <ul><ul><li>金子 健介 </li></ul></ul><ul><ul><li>所属 </li></ul></ul><ul><ul><ul><li>株式会社 paperboy&co. </li></ul></ul></ul><ul><ul><ul><li>ホスティング事業本部 30days Album チーム </li></ul></ul></ul><ul><ul><ul><li>プログラマ </li></ul></ul></ul><ul><ul><li>ハンドルネーム等 </li></ul></ul><ul><ul><ul><li>刺身☆ブーメラン </li></ul></ul></ul><ul><ul><ul><li>id:a666666 </li></ul></ul></ul><ul><ul><ul><li>@kyanny </li></ul></ul></ul>
  4. 4. 30days Album とは <ul><ul><li>http://30d.jp/ </li></ul></ul><ul><ul><li>写真共有・保存サービス </li></ul></ul><ul><ul><li>2008 年 4 月〜 </li></ul></ul><ul><ul><li>期間限定オンラインアルバム </li></ul></ul><ul><ul><li>容量無制限オンラインフォトストレージ </li></ul></ul>
  5. 5.  
  6. 6. 本日のアジェンダ <ul><ul><li>30days Album の裏側 </li></ul></ul><ul><ul><li>MogileFS の運用ノウハウ・苦労話 </li></ul></ul><ul><ul><li>自作サーバの紹介 </li></ul></ul><ul><ul><li>Perlbal の運用ノウハウ・苦労話 </li></ul></ul>
  7. 7. 30days Album の裏側 (1) <ul><ul><li>表側は Ruby on Rails </li></ul></ul><ul><ul><li>裏側はいろいろ </li></ul></ul><ul><ul><ul><li>Perlbal </li></ul></ul></ul><ul><ul><ul><li>MogileFS </li></ul></ul></ul><ul><ul><ul><li>Gearman </li></ul></ul></ul><ul><ul><ul><li>TheSchwartz </li></ul></ul></ul><ul><ul><ul><li>Catalyst </li></ul></ul></ul><ul><ul><ul><ul><li>実はけっこう Perl を多用してます </li></ul></ul></ul></ul>
  8. 8. 30days Album の裏側 (2) <ul><ul><li>過去のプレゼンテーション </li></ul></ul><ul><ul><ul><li>関西オープンソース 2008 </li></ul></ul></ul><ul><ul><ul><ul><li>http://www.slideshare.net/mizzy/2008-30days-album-presentation </li></ul></ul></ul></ul><ul><ul><ul><li>YAPC::Asia Tokyo 2009 </li></ul></ul></ul><ul><ul><ul><ul><li>  http://www.slideshare.net/hiboma/yapc-asia-2009-perl </li></ul></ul></ul></ul>
  9. 9. 30days Album の裏側 (3)
  10. 10. 30days Album の裏側 (4) <ul><ul><li>疎結合を意識したシステム構成 </li></ul></ul><ul><ul><ul><li>各コンポーネント間は HTTP API でやり取り </li></ul></ul></ul><ul><ul><ul><li>API は Catalyst 製ウェブアプリケーション </li></ul></ul></ul><ul><ul><ul><li>REST を意識したシンプルな実装 ( GET, PUT) </li></ul></ul></ul>
  11. 11. 30days Album の裏側 (5) <ul><ul><li>メリット </li></ul></ul><ul><ul><ul><li>負荷分散 </li></ul></ul></ul><ul><ul><ul><li>開発能率アップ </li></ul></ul></ul><ul><ul><ul><ul><li>得意な人に任せられる </li></ul></ul></ul></ul><ul><ul><ul><li>メンテナンスのしやすさ </li></ul></ul></ul><ul><ul><ul><ul><li>  他のコンポーネントへの影響が少ない </li></ul></ul></ul></ul><ul><ul><ul><li>他のサービスからの利用 </li></ul></ul></ul><ul><ul><ul><ul><li>ログピ http://logpi.jp/ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>ブクログのパブー http://p.booklog.jp/ </li></ul></ul></ul></ul>
  12. 12. 30days Album の裏側 (6) <ul><ul><li>デメリット </li></ul></ul><ul><ul><ul><li>システム構成の複雑化 </li></ul></ul></ul><ul><ul><ul><ul><li>一台のサーバが複数の役割を持つと把握しづらい </li></ul></ul></ul></ul><ul><ul><ul><li>サーバ台数の増加 </li></ul></ul></ul><ul><ul><ul><li>レイヤーが増えることによるオーバーヘッドの増加 </li></ul></ul></ul><ul><ul><ul><li>他サービスへの影響範囲の増大 </li></ul></ul></ul><ul><ul><ul><ul><li>例 : 障害、メンテナンス </li></ul></ul></ul></ul>
  13. 13. 30days Album の裏側 <ul><li>終わり </li></ul>NEXT: MogileFS の運用ノウハウ・苦労話
  14. 14. MogileFS の運用ノウハウ・苦労話 <ul><ul><li>MogileFS の障害対応の話 </li></ul></ul><ul><ul><li>MogileFS のリバランスについて </li></ul></ul>
  15. 15. MogileFS の障害対応の話 (1) <ul><ul><li>ストレージサーバでディスク障害が発生した </li></ul></ul><ul><ul><li>LVM で構築していたデータ領域は修復不可能 </li></ul></ul><ul><ul><li>どのように対応したか </li></ul></ul><ul><ul><ul><li>MogileFS のストレージプールから切り離し </li></ul></ul></ul><ul><ul><ul><li>サーバを再構築 </li></ul></ul></ul><ul><ul><ul><li>ストレージプールに復帰 </li></ul></ul></ul>
  16. 16. MogileFS の障害対応の話 (2) <ul><ul><li>障害発生前 </li></ul></ul><ul><ul><ul><li>複数のサーバに分散して保存されている </li></ul></ul></ul>
  17. 17. MogileFS の障害対応の話 (3) <ul><ul><li>障害発生時 </li></ul></ul><ul><ul><ul><li>障害発生サーバ上のデータはアクセス不能 </li></ul></ul></ul><ul><ul><ul><li>他のサーバ上のデータにはアクセス可能 </li></ul></ul></ul>
  18. 18. MogileFS の障害対応の話 (4) <ul><ul><li>障害対応中 </li></ul></ul><ul><ul><ul><li>ストレージプールから切り離す </li></ul></ul></ul>
  19. 19. MogileFS の障害対応の話 (5) <ul><ul><li>切り離しの手順 </li></ul></ul><ul><ul><ul><li>device を dead にする </li></ul></ul></ul><ul><ul><ul><li>$ mogadm device mark mogfs5 dev5 dead </li></ul></ul></ul>
  20. 20. MogileFS の障害対応の話 (6) <ul><ul><li>障害対応中 </li></ul></ul><ul><ul><ul><li>コピーがあるのでサービスには影響なし </li></ul></ul></ul><ul><ul><ul><li>他のホストにも自動的にコピーされる </li></ul></ul></ul>
  21. 21. MogileFS の障害対応の話 (7) <ul><ul><li>コピーされていることを確認するには </li></ul></ul><ul><ul><ul><li>X-REPROXY-URL ヘッダをみる </li></ul></ul></ul><ul><ul><ul><ul><li>dead にした device の URL が外れる </li></ul></ul></ul></ul><ul><ul><ul><ul><li>別の device の URL が追加される </li></ul></ul></ul></ul><ul><ul><ul><li>file_on テーブルのレコード数を数える </li></ul></ul></ul><ul><ul><ul><li>SELECT COUNT(*) FROM file_on WHERE devid = 5; </li></ul></ul></ul><ul><ul><ul><ul><li>他の device へコピーされるたびに減る </li></ul></ul></ul></ul>
  22. 22. MogileFS の障害対応の話 (8) <ul><ul><li>障害復旧後 </li></ul></ul><ul><ul><ul><li>復旧したサーバをストレージプールへ復帰 </li></ul></ul></ul><ul><ul><ul><li>障害対応中のサービス停止なし </li></ul></ul></ul>
  23. 23. MogileFS の障害対応の話 (9) <ul><ul><li>復帰の手順 </li></ul></ul><ul><ul><ul><li>device を alive にする </li></ul></ul></ul><ul><ul><ul><li>$ mogadm device mark mogfs5 dev5 alive </li></ul></ul></ul>
  24. 24. MogileFS の障害対応の話 (10) <ul><ul><li>その他にやったこと </li></ul></ul><ul><ul><ul><li>Perlbal を再起動する </li></ul></ul></ul><ul><ul><ul><ul><li>X-REPROXY-CACHE-FOR をクリア </li></ul></ul></ul></ul><ul><ul><ul><ul><li>dead な device の URL をキャッシュしてるため </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Perlbal は X-REPROXY-URL が 200 を返さないと次の URL をとりにいくため、必須ではない </li></ul></ul></ul></ul>
  25. 25. MogileFS の障害対応の話 <ul><li>終わり </li></ul>NEXT: MogileFS のリバランスについて
  26. 26. MogileFS のリバランスについて (1) <ul><ul><li>リバランスとは </li></ul></ul><ul><ul><ul><li>ストレージノード間でデータを平準化する機能 </li></ul></ul></ul><ul><ul><ul><li>バックグランドで走る </li></ul></ul></ul><ul><ul><ul><li>任意のタイミングで開始・終了できる </li></ul></ul></ul><ul><ul><ul><li>http://code.google.com/p/mogilefs/wiki/Rebalance </li></ul></ul></ul><ul><ul><li>$ mogadm settings set enable_rebalance 1 </li></ul></ul>
  27. 27. MogileFS のリバランスについて (2) <ul><ul><li>リバランスの動作例 (1) </li></ul></ul><ul><ul><ul><li>分散して保存されている </li></ul></ul></ul>
  28. 28. MogileFS のリバランスについて (3) <ul><ul><li>リバランスの動作例 (2) </li></ul></ul><ul><ul><ul><li>使用量が少ない device へファイルを移動 </li></ul></ul></ul>
  29. 29. MogileFS のリバランスについて (4) <ul><ul><li>リバランスの動作例 (3) </li></ul></ul><ul><ul><ul><li>ストレージの使用量が平準化される </li></ul></ul></ul>
  30. 30. MogileFS のリバランスについて (5) <ul><ul><li>どういうときに使うか </li></ul></ul><ul><ul><ul><li>新しいストレージノードを追加したとき </li></ul></ul></ul><ul><ul><ul><li>残容量が少なくなったとき </li></ul></ul></ul><ul><ul><ul><li>class を変更したとき </li></ul></ul></ul><ul><ul><ul><ul><li>ファイルのコピー数を制御する仕組み </li></ul></ul></ul></ul><ul><ul><ul><ul><li>ファイルの重要度によってコピー数をかえられる </li></ul></ul></ul></ul><ul><ul><ul><ul><li>あとで変更することができる </li></ul></ul></ul></ul>
  31. 31. MogileFS リバランスについて (6) <ul><ul><li>注意点 </li></ul></ul><ul><ul><ul><li>MySQL の負荷 </li></ul></ul></ul><ul><ul><ul><ul><li>MogileFS のバージョンアップで改善した </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>SELECT クエリが減った </li></ul></ul></ul></ul></ul>
  32. 32. MogileFS のリバランスについて (7) <ul><ul><li>注意点(続き) </li></ul></ul><ul><ul><ul><li>ネットワーク帯域をかなり使う </li></ul></ul></ul><ul><ul><ul><li>ストレージノードのディスク I/O も激しい </li></ul></ul></ul><ul><ul><ul><li>サーバリソースのモニタリングは必須 </li></ul></ul></ul><ul><ul><ul><ul><li>Munin を使ってます </li></ul></ul></ul></ul><ul><ul><ul><li>サービスへのアクセスが多い夜間はオフに </li></ul></ul></ul>
  33. 33. MogileFS リバランスについて 終わり NEXT: 自作サーバの紹介
  34. 34. 自作サーバの紹介 <ul><ul><li>自作サーバをつくりました </li></ul></ul><ul><ul><ul><li>MP-100 </li></ul></ul></ul><ul><ul><ul><ul><li>通称マッパ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>「マサキパワー」の略 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>馬崎 ( まさき ) さん作なので </li></ul></ul></ul></ul><ul><ul><ul><li>ストレージサーバ </li></ul></ul></ul><ul><ul><ul><ul><li>mogstored </li></ul></ul></ul></ul><ul><ul><ul><li>2010 年 4 月〜 (1 号機 ) </li></ul></ul></ul><ul><ul><ul><li>2010 年 9 月〜 (2 号機 ) </li></ul></ul></ul>
  35. 35. ※ 写真は制作中のものです
  36. 36. 自作サーバのスペック <ul><ul><li>CPU </li></ul></ul><ul><ul><ul><li>Inete Celeron E3000 番台 </li></ul></ul></ul><ul><ul><li>RAM </li></ul></ul><ul><ul><ul><li>DDR2 メモリ 2GB(1GBx2) </li></ul></ul></ul><ul><ul><li>HDD  </li></ul></ul><ul><ul><ul><li>データ領域  2TB HDD x 8 </li></ul></ul></ul><ul><ul><ul><li>システム領域  Intel 製 40GB SSD x 1 </li></ul></ul></ul><ul><ul><li>マザーボード </li></ul></ul><ul><ul><ul><li>Intel 製 microATX マザー </li></ul></ul></ul><ul><ul><li>ポートマルチプライヤ </li></ul></ul>
  37. 37. 自作サーバの特徴 <ul><ul><li>HDD の固定に L 字金具を使用 </li></ul></ul><ul><ul><li>リモート管理可能なマザーボードを採用 </li></ul></ul><ul><ul><ul><li>Intel AMT </li></ul></ul></ul><ul><ul><li>ポートマルチプライヤーで HDD を 8 本搭載 </li></ul></ul><ul><ul><ul><li>値段の関係で多ポート RAID カードは見送った </li></ul></ul></ul>
  38. 38. 自作サーバこぼれ話 (1) <ul><ul><li>パーツ選定の基準 </li></ul></ul><ul><ul><ul><li>値段 > 信頼性 </li></ul></ul></ul><ul><ul><ul><li>MogileFS で冗長化できているためパーツ単体の信頼性は高くなくてもよい </li></ul></ul></ul><ul><ul><ul><ul><li>今のところハードウェアに起因する障害は無し </li></ul></ul></ul></ul><ul><ul><li>設計のノウハウがなく苦労した </li></ul></ul><ul><ul><ul><li>自作サーバカンファレンスで仕入れたネタがベース </li></ul></ul></ul><ul><ul><ul><li>Cerevo さんとはてなさんを参考にさせて頂きました </li></ul></ul></ul>
  39. 39. 自作サーバこぼれ話 (2) <ul><ul><li>MP-100 の 100 って? </li></ul></ul><ul><ul><ul><li>制作当時、馬崎さんの体重が 100kg だった </li></ul></ul></ul><ul><ul><ul><li>現在は省エネ化して 75kg </li></ul></ul></ul><ul><ul><ul><li>ちなみに Max 値は 125kg </li></ul></ul></ul>
  40. 40. 自作サーバの今後 <ul><ul><li>次の目標 </li></ul></ul><ul><ul><ul><li>HDD 12 本搭載 </li></ul></ul></ul><ul><ul><ul><ul><li>HDD マウンタの作成が課題 </li></ul></ul></ul></ul><ul><ul><ul><li>ストレージ以外の用途も検討 </li></ul></ul></ul><ul><ul><ul><ul><li>ジョブサーバなど </li></ul></ul></ul></ul>
  41. 41. 自作サーバの紹介 <ul><li>終わり </li></ul>NEXT: Perlbal の運用ノウハウ・苦労話
  42. 42. Perlbal の運用ノウハウ・苦労話 <ul><ul><li>2010/10 〜 動画アップロードに対応 </li></ul></ul><ul><ul><ul><li>http://30d.jugem.jp/?eid=115 </li></ul></ul></ul><ul><ul><li>Perlbal と動画配信にまつわる苦労話 </li></ul></ul><ul><ul><ul><li>FLV の疑似ストリーミングの話 </li></ul></ul></ul><ul><ul><ul><li>Perlbal と Range ヘッダの話 </li></ul></ul></ul>
  43. 43. FLV の疑似ストリーミングの話 (1) <ul><ul><li>FLV の疑似ストリーミング </li></ul></ul><ul><ul><ul><li>例 : YouTube, ニコニコ動画 </li></ul></ul></ul><ul><ul><ul><li>シーク可能であること </li></ul></ul></ul><ul><ul><li>一般的な仕組み </li></ul></ul><ul><ul><ul><li>動画プレイヤーが ?start=**** のようなクエリストリングつきでリクエストを送る </li></ul></ul></ul><ul><ul><ul><ul><li>**** の部分はバイト数 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>FLV ファイルに埋め込まれたメタデータ </li></ul></ul></ul></ul><ul><ul><ul><li>サーバ側で **** の部分に応じたデータを返す </li></ul></ul></ul><ul><ul><ul><ul><li>FLV ヘッダを付与する必要あり </li></ul></ul></ul></ul>
  44. 44. FLV の疑似ストリーミングの話 (2) <ul><ul><li>一般的なソリューション </li></ul></ul><ul><ul><ul><li>lighttpd の mod_flv_streaming が有名 </li></ul></ul></ul><ul><ul><ul><li>http://blog.lighttpd.net/articles/2006/03/09/flv-streaming-with-lighttpd </li></ul></ul></ul><ul><ul><ul><ul><li>Apache や nginx にも同様のモジュールがある </li></ul></ul></ul></ul><ul><ul><ul><li>30days Album は Perlbal を使っている </li></ul></ul></ul>
  45. 45. FLV の疑似ストリーミングの話 (3) <ul><ul><li>どうやって解決したか </li></ul></ul><ul><ul><ul><li>Perlbal プラグインを書いた </li></ul></ul></ul><ul><ul><ul><ul><li>Reproxy リクエストに Range ヘッダを追加 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>レスポンスヘッダを調整 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>レスポンスボディに FLV ヘッダを追加 </li></ul></ul></ul></ul><ul><ul><ul><li>フックポイントを追加するために本体にも手を入れた </li></ul></ul></ul><ul><ul><ul><ul><li>http://github.com/mizzy/Perlbal/commit/cb6e4b2e4fe769701d36e27220edcc4b5dce6524 </li></ul></ul></ul></ul>
  46. 46. FLV の疑似ストリーミングの話 <ul><li>終わり </li></ul>NEXT: Perlbal と Range ヘッダの話
  47. 47. Perlbal と Range ヘッダの話 (1) <ul><ul><li>Range ヘッダつきリクエストを送ると Perlbal がエラーを返す </li></ul></ul><ul><ul><ul><li>原因は X-REPROXY-EXPECTED-SIZE ヘッダ </li></ul></ul></ul><ul><ul><ul><li>データが不完全でないかチェックする仕組み </li></ul></ul></ul><ul><ul><ul><ul><li>Perlbal と MogileFS の間のストレージ API で付与している </li></ul></ul></ul></ul>
  48. 48. Perlbal と Range ヘッダの話 (2) <ul><ul><li>Perlbal はどう振る舞うか </li></ul></ul><ul><ul><ul><li>ストレージ API へ GET </li></ul></ul></ul><ul><ul><ul><li>ストレージ API が X-REPROXY-URL と X-REPROXY-EXPECTED-SIZE を返す </li></ul></ul></ul><ul><ul><ul><li>X-REPROXY-URL ヘッダで返された URL を GET </li></ul></ul></ul><ul><ul><ul><li>Content-Length と X-REPROXY-EXPECTED-SIZE を比較 </li></ul></ul></ul><ul><ul><ul><li>数値が一致しなければ次の X-REPROXY-URL をとりにいく </li></ul></ul></ul>
  49. 49. Perlbal と Range ヘッダの話 (3) <ul><ul><li>問題点 </li></ul></ul><ul><ul><ul><li>Content-Length と X-REPROXY-EXPECTED-SIZE が 常に 異なってしまう </li></ul></ul></ul><ul><ul><ul><ul><li>ストレージ API が Range ヘッダを考慮していなかったため </li></ul></ul></ul></ul><ul><ul><ul><li>Perlbal は 次の   X-REPROXY-URL をとりにいく </li></ul></ul></ul><ul><ul><ul><li>全ての URL に対して Reproxy 失敗とみなして 503 を返してしまう </li></ul></ul></ul>
  50. 50. Perlbal と Range ヘッダの話 (4) <ul><ul><li> どうやって解決したか </li></ul></ul><ul><ul><ul><li>Range ヘッダがある場合は適切な X-REPROXY-EXPECTED-SIZE ヘッダを返すようにした </li></ul></ul></ul><ul><ul><ul><li>複数のレンジセットが指定されている場合は X-REPROXY-EXPECTED-SIZE ヘッダを返さないようにした </li></ul></ul></ul><ul><ul><ul><ul><li>例 : Range: bytes=0-100,200-300 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>参考 :  部分的 GET とレンジ単位 </li></ul></ul></ul></ul>
  51. 51. Perlbal と Range ヘッダの話 (4) <ul><li>終わり </li></ul>NEXT: まとめ
  52. 52. まとめ <ul><ul><li>MogileFS の運用ノウハウ・苦労話 </li></ul></ul><ul><ul><ul><li>リバランスの概要説明 </li></ul></ul></ul><ul><ul><ul><li>障害対応の事例紹介 </li></ul></ul></ul><ul><ul><li>自作サーバの紹介 </li></ul></ul><ul><ul><li>Perlbal の運用ノウハウ・苦労話 </li></ul></ul><ul><ul><ul><li>動画配信にまつわる諸問題の事例紹介 </li></ul></ul></ul><ul><ul><ul><li>Perlbal プラグインや本体の拡張で対応した </li></ul></ul></ul>
  53. 53. 宣伝 <ul><ul><li>30days Album PRO プランのクーポンあります </li></ul></ul><ul><ul><ul><li>お手元のノベルティグッズをご覧ください </li></ul></ul></ul>
  54. 54. 30days Album の裏側 後日談 <ul><li>ご静聴ありがとうございました </li></ul>
  55. 55. ご質問はございますか? <ul><li>  </li></ul>

×