1. 程式人生 > >Resin 的watchdog(看門狗)介紹和resin負載均衡實現

Resin 的watchdog(看門狗)介紹和resin負載均衡實現

為了穩定和安全,Resin使用一個獨立的watchdog程序來啟動和監視Resin伺服器。watchdog連續你檢測Resin伺服器的狀態,如果其沒有反應或者遲鈍,將會重啟Resin伺服器程序。大多數情況下,watchdog從resin.xml中讀取配置資訊,而不需要其它的附加配置。某些ISP服務商可能使用特別的配置,為了安全他們會配置watchdog來隔離JVM(Java虛擬主機)。

概述
因為watchdog作為一個服務執行,大多數情況下你根本不需要注意它。標準的配置下,一個機器上的watchdog可以監視這個機器上所有JVM,因此大部分情況下你不需要修改watchdog的配置。需要你管理watchdog的任務就是,如果機器發生了問題,停止watchdog,並檢查watchdog日誌中Resin伺服器的重啟事件。

  watchdog自動重啟崩潰和退出的Resin服務。因此如果你想停止Resin,你需要告訴watchdog來停止Resin例項,或者完全停止watchdog。使用resin.ar中的主程式(main)來控制watchdog,有用來啟動、停止、重啟Resin例項的命令,同樣還有報告watchdog狀態的命令。

  大多數使用者不需要特別的配置watchdog,但是ISP和大的站點可能建立特殊的watchdog.xml(包含<watchdog-manager>標籤)來控制watchdog。<watchdog-manager>允許ISP控制watchdog,為他們使用者的Resin例項指定附加的命令列引數,包括為他們的使用者建立安全的chroot環境的能力。典型地,watchdog以root帳號執行,然而使用者例項使用他們各自的使用者id。

命令列
  resin.jar中的主類ResinBoot的命令列用來控制watchdog。主要的操作包括:start、stop、restart、shutdown和status。

start
  "start"命令使用給定的server id啟動一個新的Resin例項。ResinBoot首先會嘗試在當前機器上的watchdog,在需要時會啟動一個新的watchdog。在resin.xml中定義的server id必須是惟一的。
例如: watchdog啟動

resin-3.2.x> java -jar lib/resin.jar -conf conf/test.conf -server a start
Resin/3.2.x started -server 'a' for watchdog at 127.0.0.1:6700

stop
"stop"命令使用給定的server id停止Resin例項。如果停止的例項是watchdog管理的最後一個Resin例項,watchdog也會自動退出。如果沒有指定 -server 引數,watchdog使用預設的 -server "" 。

例子: watchdog停止

resin-3.2.x> java -jar lib/resin.jar stop
Resin/3.2.x started -server '' for watchdog at 127.0.0.1:6600

status
"status"命令統計被watchdog服務管理的Resin例項的狀態。
例子: watchdog狀態

resin-3.2.x> java -jar lib/resin.jar status
Resin/3.2.x status for watchdog at 127.0.0.1:6600

server '' : active
  password: missing
  user: ferg
  root: /home/test/resin/
  conf: /etc/resin/resin.xml

單一Resin例項
  這個例子顯示了一個單一伺服器站點,其監聽標準的HTTP埠80,並以resin這個使用者身份執行。在這個例子中watchdog是以root使用者身份執行的,因此其能夠繫結到特殊的埠80上,但是Resin例項是以resin身份執行的。

  因為使用了預設的配置,watchdog監聽6600埠來獲取命令。
例子: /etc/resin/resin.xml

  <server id="app-a" address="127.0.0.1">
    <user-name>resin</user-name>
    <group-name>resin</group-name>

    <http port="80" />
  </server>

  <resin:import path="${resin.home}/conf/app-default.xml" />

  <host id="">
    <web-app id="" path="/var/www/htdocs" />
  </host>

</cluster>
</resin>


在一個機器上使用共享的watchdog實現負載平衡  當在一個機器上執行多個Resin例項的時候,一個watchdog-manager就能管理所有的Resin例項。指定server id用來決定那個Resin例項是start或者stop。
在這個例子中,有一個web-tier伺服器做為負載平衡器,兩個app-tier伺服器處理後臺資料,它們都在一個機器上。為了維護和升級方便,一個站點可能需要多個app-rier伺服器。當一個停機的時候,第二個伺服器可以繼續服務。
這個例子使用預設的watchdog配置,其讀取的是標準的resin.xml檔案。watchdog程序和ResinBoot都讀取resin.xml配置檔案,因此不需要特別的watchdog配置。watchdog能夠自動發現執行在這個機器上的多個Resin例項並管理它們。

例子: /etc/resin/resin.xml

<cluster id="app-tier">

  <server-default>
    <user-name>resin</user-name>
    <group-name>resin</group-name>
  </server-default>

  <server id="app-a" address="192.168.1.10" port="6810" />
  <server id="app-b" address="192.168.1.10" port="6811" />

  <host id="">
    <web-app id="" path="/var/www/htdocs" />
  </host>

</cluster>

<cluster id="web-tier">

  <server-default>
    <user-name>resin</user-name>
    <group-name>resin</group-name>
  </server-default>

  <server id="web-a" address="192.168.1.10" port="6800">
    <http port="80" />
  </server>

  <host id="">
    <web-app id="">
      <rewrite-redirect>
        <load-balance regexp="" cluster="app-tier" />
      </rewrite-redirect>
    </web-app>
  </host>

</cluster>

</resin>

同一機器使用不同的watchdog來實現負載平衡
在某些情況下,最好讓每個Resin例項有其自己的watchdog,例如當多個使用者在使用相同的機器。每個<server>塊配置一個<watchdog-port>。因為watchdog將讀取resin.xml使用<server>塊匹配命令列引數中的 -server id,每個watchdog將啟動期自己的埠。

例子: /etc/resin/resin.xml

<cluster id="app-tier">

  <server-default>
    <user-name>resin</user-name>
    <group-name>resin</group-name>
  </server-default>

  <server id="app-a" address="192.168.1.10" port="6810">
    <watchdog-port>6700</watchdog-port>

    <http port="8080" />
  </server>

  <server id="app-b" address="192.168.1.10" port="6811">
    <watchdog-port>6701</watchdog-port>

    <http port="8081" />
  </server>

  <host id="">
    <web-app id="" path="/var/www/htdocs" />
  </host>

</cluster>

</resin>

  在上面的例子中,啟動Resin, 使用 -server app-a引數將啟動一個在埠6700上的watchdog,使用 -server app-b引數將啟動一個在埠6701上的watchdog。

例子: starting app-b with watchdog-port=6701

resin-3.2.x> java -jar lib/resin.jar -server app-b start

ISP watchdog管理
  在ISP的環境中,你可能需要為watchdog使用一個隔離的配置檔案,它為不同的使用者啟動Resin例項。在這個情況下,你要確保watchdog.xml不能被這些普通使用者讀取,要建立一個管理使用者來讀取這個檔案。

●啟動和重啟使用者的Resin JVM
●設定JVM引數和Java可執行性
●設定Resin例項的root-directory
●setuid user-name 和 group-name
●設定resin.xml配置
●開啟受保護的埠,例如80
●可選的chroot設定

watchdog將使用給定的帳號作為setuid來啟動Resin例項。它也能開啟任何需要的保護埠,例如80。
例子: /etc/resin/watchdog.xml

<management>
  <user name="harry" password="MD5HASH==" />
</management>

<watchdog-manager>

  <watchdog-default>
    <jvm-arg>-Xmx256m</jvm-arg>
  </watchdog-default>

  <watchdog id="user_1">
    <user-name>user_1</user-name>
    <group-name>group_1</group-name>

    <resin-xml>/home/user_1/conf/resin.xml</resin-conf>
    <resin-root>/home/user_1/www</resin-root>

    <open-port address="192.168.1.10" port="80" />
  </watchdog>

  ...

  <watchdog id="user_n">
    <user-name>user_n</user-name>
    <group-name>group_n</group-name>

    <resin-conf>/home/user_n/conf/resin.xml</resin-conf>
    <resin-root>/home/user_n/www</resin-root>

    <open-port address="192.168.1.240" port="80" />
  </watchdog>

</watchdog-manager>

</resin>