Web アプリケーションの無停止稼働 Server::Starter, Parallel::Prefork, Starlet  を使って 株式会社ディー・エヌ・エー 奥 一穂
ご注意 <ul><li>特定の会社の話ではなく、あくまでもオープンソースのモジュールの使い方を説明しているだけですよ </li></ul>2011 年 1 月 21 日 Web アプリケーションの無停止稼働
要旨 <ul><li>高負荷・大規模環境における、プリフォーク型アプリサーバの  fork  負荷問題について </li></ul><ul><ul><li>以下のタイミングおける  fork  処理の分散する手法 </li></ul></ul>...
プリフォーク型サーバが抱える問題 <ul><li>ワーカープロセスの起動コストが大きい </li></ul><ul><ul><li>fork  が多発するタイミングでパフォーマンスが劣化 </li></ul></ul><ul><li>既存解決策...
Starlet  における再起動間隔ランダム化 <ul><li>plackup -s Starlet  </li></ul><ul><li>--min-reqs-per-child=50   </li></ul><ul><li>--max-re...
ワーカープロセスが起動するタイミングっていつ ? <ul><li>古いワーカープロセス回収時 </li></ul><ul><ul><li>⇒  MaxRequestsPerChild  のランダム化で対処済 </li></ul></ul><ul...
アップデート時の再起動問題 <ul><li>ウェブアプリをアップデートした際の再起動 </li></ul><ul><ul><li>既存の手段 : LB から切り離し ⇒ アプリ再起動 ⇒切り戻し </li></ul></ul><ul><ul><...
解決策 : Slow Restart <ul><li>「じわじわ起動/終了する機能 </li></ul><ul><ul><li>ワーカープロセスの数を保ちながら fork のタイミングを分散 </li></ul></ul>Web アプリケーショ...
Slow Restart  デモ Web アプリケーションの無停止稼働 2011 年 1 月 21 日
Using Slow Restart with Starlet <ul><li>start_server --port=80  </li></ul><ul><li>--signal-on-hup=USR1  --  </li></ul><ul>...
Parallel::Prefork  の  Slow Restart  対応 <ul><li>$pm = Parallel::Prefork->new({ </li></ul><ul><li>… , </li></ul><ul><li>spaw...
各モジュールの対応バージョン <ul><li>Server::Starter >= 0.11 </li></ul><ul><li>Parallel::Prefork >= 0.11 </li></ul><ul><li>Starlet >= gi...
成果と次回予告 <ul><li>完了 : fork 負荷の分散 </li></ul><ul><li>課題 :  アプリケーションのバージョン一貫性 </li></ul><ul><ul><li>ファイル配布と再起動には、必ずタイムラグがある </...
参考資料 <ul><li>Writing Hot-deployable servers (introduction of Server::Starter) </li></ul><ul><ul><li>http://developer.cyboz...
Upcoming SlideShare
Loading in...5
×

Webアプリケーションの無停止稼働

7,314
-1

Published on

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,314
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
13
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Webアプリケーションの無停止稼働

  1. 1. Web アプリケーションの無停止稼働 Server::Starter, Parallel::Prefork, Starlet を使って 株式会社ディー・エヌ・エー 奥 一穂
  2. 2. ご注意 <ul><li>特定の会社の話ではなく、あくまでもオープンソースのモジュールの使い方を説明しているだけですよ </li></ul>2011 年 1 月 21 日 Web アプリケーションの無停止稼働
  3. 3. 要旨 <ul><li>高負荷・大規模環境における、プリフォーク型アプリサーバの fork 負荷問題について </li></ul><ul><ul><li>以下のタイミングおける fork 処理の分散する手法 </li></ul></ul><ul><ul><ul><li>ワーカープロセス回収時 </li></ul></ul></ul><ul><ul><ul><li>アプリケーション再起動時 </li></ul></ul></ul><ul><ul><li>Server::Starter, Parallel::Prefork, Starlet による実装と運用法 </li></ul></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  4. 4. プリフォーク型サーバが抱える問題 <ul><li>ワーカープロセスの起動コストが大きい </li></ul><ul><ul><li>fork が多発するタイミングでパフォーマンスが劣化 </li></ul></ul><ul><li>既存解決策 : mod_bumpy_life (Apache) </li></ul><ul><ul><li>by hirose31++ </li></ul></ul><ul><ul><li>MaxRequestsPerChild をランダマイズ </li></ul></ul><ul><ul><ul><li>ワーカープロセスの終了時期を分散する効果 </li></ul></ul></ul><ul><ul><ul><ul><li>⇒ ワーカープロセス再起動のタイミングが分散される </li></ul></ul></ul></ul><ul><ul><li>Starlet でも同様のことができればいいのに… </li></ul></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  5. 5. Starlet における再起動間隔ランダム化 <ul><li>plackup -s Starlet </li></ul><ul><li>--min-reqs-per-child=50 </li></ul><ul><li>--max-reqs-per-child=100 </li></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  6. 6. ワーカープロセスが起動するタイミングっていつ ? <ul><li>古いワーカープロセス回収時 </li></ul><ul><ul><li>⇒ MaxRequestsPerChild のランダム化で対処済 </li></ul></ul><ul><li>アプリケーションのアップデート時 </li></ul><ul><ul><li>⇒ どうしよう ? </li></ul></ul>2011 年 1 月 21 日 Web アプリケーションの無停止稼働
  7. 7. アップデート時の再起動問題 <ul><li>ウェブアプリをアップデートした際の再起動 </li></ul><ul><ul><li>既存の手段 : LB から切り離し ⇒ アプリ再起動 ⇒切り戻し </li></ul></ul><ul><ul><ul><li>問題 : 時間がかかる・並列化できない </li></ul></ul></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  8. 8. 解決策 : Slow Restart <ul><li>「じわじわ起動/終了する機能 </li></ul><ul><ul><li>ワーカープロセスの数を保ちながら fork のタイミングを分散 </li></ul></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日 listen spawn app. servers accept app. logic fork & exec accept app. logic SIGUSR1 fork & exec accept app. logic SIGHUP
  9. 9. Slow Restart デモ Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  10. 10. Using Slow Restart with Starlet <ul><li>start_server --port=80 </li></ul><ul><li>--signal-on-hup=USR1 -- </li></ul><ul><li>plackup -s Starlet … </li></ul><ul><li>--spawn-interval=1 </li></ul><ul><li>yourapp.psgi </li></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  11. 11. Parallel::Prefork の Slow Restart 対応 <ul><li>$pm = Parallel::Prefork->new({ </li></ul><ul><li>… , </li></ul><ul><li>spawn_interval => $interval, </li></ul><ul><li>trap_signals => { </li></ul><ul><li>‘ TERM’ => ‘TERM’, </li></ul><ul><li>‘ HUP’ => ‘TERM’, </li></ul><ul><li>‘ USR1’ => [ ‘TERM’, $interval ], </li></ul><ul><li>}, </li></ul><ul><li>}); </li></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  12. 12. 各モジュールの対応バージョン <ul><li>Server::Starter >= 0.11 </li></ul><ul><li>Parallel::Prefork >= 0.11 </li></ul><ul><li>Starlet >= github trunk  </li></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  13. 13. 成果と次回予告 <ul><li>完了 : fork 負荷の分散 </li></ul><ul><li>課題 : アプリケーションのバージョン一貫性 </li></ul><ul><ul><li>ファイル配布と再起動には、必ずタイムラグがある </li></ul></ul><ul><ul><li>一部のファイルは遅延読み込みされる </li></ul></ul><ul><ul><ul><li>e.g. テンプレート </li></ul></ul></ul><ul><ul><li>旧世代のプロセスが新世代のファイルを読んでしまう </li></ul></ul><ul><ul><li>⇩ </li></ul></ul><ul><ul><li>続きは次回の SoozyCon で! </li></ul></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  14. 14. 参考資料 <ul><li>Writing Hot-deployable servers (introduction of Server::Starter) </li></ul><ul><ul><li>http://developer.cybozu.co.jp/kazuho/2009/09/writing-hot-dep.html </li></ul></ul>Web アプリケーションの無停止稼働 2011 年 1 月 21 日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×