Servlet BOF (1999/5/19)

Apache JServのWebサーバ・Servletエンジン間通信モデル

風間 一洋
E-mail: kazama@ingrid.org
日本電信電話(株) 未来ねっと研究所

概要

Apache JServのWebサーバとServletエンジン間の通信モデルを, 特に1.0b4の負荷分散機能に重点を置いて解説する.


1. mod_jservモジュール


2. ローカルモードとリモートモード

2.1 ローカルモード

設定例

ローカルゾーン"/root"を, Webサーバの"/servlets"にマウントする.

ApJServMount /servlets /root

2.2 リモートモード

設定例

手動で起動するように設定し, リモートのゾーン"/root"を, Webサーバの"/servlet"にマウントする.

ApJServManual on
ApJServMount /servlets ajpv11://192.168.0.51:7777/root

注意

セキュリティへの配慮が必要になる


3. 通信プロトコル


4. 接続形態

WebサーバとServletエンジンの基本的な接続形態は,以下のように分類される. さらに目的に応じて, 基本パターンを柔軟に組み合わせた多対多接続がおこなえる.

  1. 一対一接続
  2. 多対一接続
  3. 一対多接続
  4. 一対多接続(ラウンドロビン)

5. 処理性能の確保

アクセス頻度やWebサーバ・Servletエンジンの負荷に応じて, WebサーバとServletエンジンの処理性能を独立に, 複数のレベルの対処ができる.

  1. 複数のServletエンジン(同一マシン)に静的負荷分散
  2. 複数のServletエンジン(別マシン)に静的負荷分散
  3. 複数のServletエンジンに動的負荷分散

マルチプロセッサマシン(+ネイティブスレッドVM)はより効果的である

図1. プロセッサ数とリクエスト処理時間の相関関係

注意点


6. 負荷分散

  1. DNSを利用したラウンドロビン
  2. mod_rewriteモジュールを使用する手法(3)
  3. Apache JServの負荷分散機能(4)

7. 負荷分散可能なservlet


8. 負荷分散のために追加された機能

  1. httpd.confのbalanceパラメタ
  2. セッション処理
  3. 共有メモリ (1.0b4以降)
  4. watchdogプロセス (1.0b4以降)

9. balanceパラメタ

httpd.confの設定例

# Apache JServをマニュアル起動にする
ApJServManual on 

# /servletを負荷分散する
ApJServMount /servlet balance://set1/zone1 

# マシンのウェイトを設定する
ApJServBalance set1  PC
ApJServBalance set1  SPARC4 # 4CPU

# Servletエンジンを指定する
ApJServHost PC ajpv11://192.168.0.51:7777 
ApJServHost SPARC ajpv11://192.168.0.52:8888 

# ここで定義した名前をセッションcookieの末尾に付加する
ApJServRoute JS1 PC
ApJServRoute JS2 SPARC

# 共有メモリファイルを設定する
ApJServShmFile logs/jserv_shm 

注意

  1. あまり大きいウェイト値は使用しない
  2. Apache JServ Status Handlerは対応していないので,状態が正しく表示されない

10. セッション処理

注意

プログラムで直接cookieを操作せずに, Servlet APIのセッション管理を使用しなければ, セッションを正しく維持できない.


11. 共有メモリ

  1. httpdプロセス間の通信に使用される.
  2. ディスク上のファイルをread/writeでmmapすることにより実現する(MT-safe, MP-safeではない / 排他制御されない).
  3. 他のプログラム(CGI, SNMPプロキシ,inetdが管理するサーバ)からアクセスして,モニタ・管理できる(jserv.hで構造体が定義 / jserv_mmap.cが例).
  4. 現在の制限は25 (jserv.hのNB_MAX_JSERVで定義)

12. watchdogプロセス

注意

1.0b4のNT版ではwatchdogプロセスは実装されていない


13. watchdogアルゴリズム

while true
do
    10秒sleepする.
    if このプロセスが(共有メモリ中で)デフォルトwatchdogではない?
        break
    endif
     for 共有メモリ中のリストの各Jserv
    do
        if JServ.state = DOWN
            JServに接続
            if 接続に失敗?
                continue
            else
                共有メモリに"UP"とマークする
            endif
        endif
    done
done

14. 負荷分散アルゴリズム

for 負荷分散servletマウントポイントに来た各HTTPリクエスト
do
    if そのマウントポイントに対する最初のHTTPリクエストか?
    then
        process_mount_default_target = ターゲットの組からランダムに選択
    endif

    if セッションcookieが存在するか?
    then
        セッションを持っているJServを検索(ApJServRouteパラメタを使用)
        if そのJServが共有メモリで"UP"または"SHUTDOWN_GRACEFUL"か?
        then
             JServにリクエストを送信
             if リプライが存在するか?
             then
                 return
             else
                 JServが(共有メモリに)"DOWN"とマークする
             endif
         endif
     endif

    # ここで,セッションcookieが存在しない,またはセッションが壊れてい
    # るリクエストを受け取った処理をおこなう.後者の場合には,クライア
    # ントに相談せずに,リスト中の別のターゲットにリクエストを送信でき
    # る(ただし,セッションが壊れていることを通知する必要はあるかもしれない).
    if process_target != process_mount_default_target AND 
       process_mount_default_targetが共有メモリで"UP"か?
    then
        process_target = process_mount_default_target
    endif
    while (process_targetが存在する?)
    do
        if process_targetが共有メモリで"UP"か?
        then
            JServにリクエストを送信する
            if リプライが存在するか?
            then
                return
            else
                JServを(共有メモリ中で)"DOWN"にマークする
            endif
        endif
        process_target = 次のターゲット
    done
done

参考資料

  1. The Java Apache Project: "Apache JServ Protocol Version 1.1 (AJPv1.1)", http://java.apache.org/jserv/protocol/AJPv11.html, 1998.
  2. The Java Apache Project: "Apache JServ Protocol Version 2.1 (AJPv2.1)", http://java.apache.org/jserv/protocol/AJPv21.html, 1998.
  3. The Java Apache Project: "Frequently Asked Questions", http://java.apache.org/jserv/FAQ.html#load_balancing, v. 1.15, 1999.
  4. The Java Apache Project: "How to : Scalability - Load-Balancing - Fault tolerance with Apache JServ 1.0b4 and higher", http://java.apache.org/jserv/howto.load-balancing.html, 1999.
  5. Stefano Mazzocchi & Pierpaolo Fumagalli: "Servlet Performance and Apache JServ", http://java.apache.org/jserv/papers/performance.pdf, ApacheCon '98, 1998.
  6. Stefano Mazzocchi & Pierpaolo Fumagalli: "Advanced Apache JServ Techniques", http://java.apache.org/jserv/papers/techniques.pdf, ApacheCon '98, 1998.

(風間 一洋 NTT未来ねっと研究所)