狠狠撸

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

More Related Content

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

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