Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

8,646 views

Published on

Published in: Technology
  • Be the first to comment

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 日

×