Apache httpd和JBoss構建高可用叢集環境

振宇要低調發表於2015-09-29

1、 前言

  叢集是指把不同的伺服器集中在一起,組成一個伺服器集合,這個集合給客戶端提供一個虛擬的平臺,使客戶端在不知道伺服器集合結構的情況下對這一伺服器集合進行部署應用、獲取服務等操作。叢集是企業應用的主要特點,它可以提供:

    高擴充套件性:可以根據自己業務需求新增任意多的伺服器到叢集;

    高可用性:使用透明的負載均衡和容錯機制,對客戶端隱藏叢集內部的錯誤。

  下圖為一傳統企業應用叢集模式:

  圖中各個步驟描述如下:

    1.  客戶端瀏覽器傳送請求

    2.  負載均衡器轉發請求到節點1

    3.  節點1處理業務時發生異常

    4.  負載均衡切換請求到節點2

    5.  節點2完成業務請求返回結果給客戶端請求

  上述業務請求完成過程中客戶端不知道伺服器端節點1發生異常,業務能夠完成的核心是兩個節點之間實時進行著狀態複製。

 

2、高可用叢集環境方案簡介

  Apache httpd作為負載均衡器和後臺應用伺服器構建構架高可用企業應用叢集是非常普遍的一種方式。JBoss做為開源的產品是最被廣泛使用的中介軟體,且JBoss支援Apache httpd作為負載均衡器。JBoss在被Red Hat公司收購後又推出企業版EAP(Enterprise Application Platform),從而使JBoss在許多核心業務領域被廣泛使用。例如:印度鐵路系統底層Web容器為JBoss;2012倫敦奧運會門票系統底層Web容器是4臺JBoss的叢集等。

  本方案使用開源JBoss社群的產品搭建一個高可用企業叢集環境,負載均衡器位於叢集節點之上。通過本方案我們可以體會到企業應用的高可用性,而高可用性主要依賴於叢集節點之間session的同步,即會話共享(Session Replication),而如何進行會話共享則是本文主要論述的主題。如下,我們給出本方案的架構圖:

 

  如上圖所示,使用jboss-eap-6.1.0做為叢集節點,為了簡單我們只使用兩臺JBoss,即叢集中就有兩個節點。Apache httpd 和 mod_cluster 做負載均衡器,mod_cluster作為Apache的外掛模組負責連線Apache和JBoss,根據負載均衡策略分發請求給後臺JBoss。

  本方案是在開源Linux作業系統Red Hat ES6上進行,我們列出本方案所使用機器的基本情況:

    負載均衡器 – 安裝JDK1.7、Apache Httpd、Mod_cluster,IP:192.168.31.22;

    JBoss Server1 – 安裝JDK1.7、JBoss EAP6,節點名稱node1,IP:192.168.31.22;

    JBoss Server2 – 安裝JDK1.7、JBoss EAP6,節點名稱node2,IP:192.168.31.21;

 

3、具體配置

3.1 mod_cluster下載安裝

  下載mod_cluster-1.2.0.Final-linux2-x64-ssl.tar.gz,解壓壓縮包,在mod_cluster-1.2.0.Final-linux2-x64-ssl\opt\jboss\httpd\lib\httpd\modules下尋找:

mod_advertise.so

mod_manager.so

mod_proxy_cluster.so

mod_slotmem.so

這四個包是用來維護、管理Apache httpd與JBoss之間的連線、通訊。將這四個動態包拷貝到Apache httpd 的modules 目錄下,即/etc/httpd/modules下。

3.2 Apache httpd安裝配置

3.2.1 安裝

下載apache 2.2.15並編譯安裝

# tar -zxvf httpd-2.2.15.tar.gz

# cd httpd-2.2.15

#./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util  --with-pcre=/usr/local/pcre

# make

# make install

# service httpd start

3.2.2 配置

(1)編輯httpd.conf

  #vim /etc/httpd/conf/httpd.conf。讓httpd監聽在192.168.31.22:80上:

Listen 192.168.31.22:80

  註釋掉mod_proxy_balancer模組,因為此模組與mod_cluster相關模組不相容:

#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

(2)建立JBoss_HTTP.conf

  # vim /etc/httpd/conf.d/JBoss_HTTP.conf 將如下內容新增到此檔案

# add mod_cluster reference module

LoadModule slotmem_module modules/mod_slotmem.so

LoadModule manager_module modules/mod_manager.so

LoadModule proxy_cluster_module modules/mod_proxy_cluster.so

LoadModule advertise_module modules/mod_advertise.so

 

Listen 192.168.31.22:6666

<VirtualHost 192.168.31.22:6666>

    <Directory />

        Order deny,allow

        Allow from all

    </Directory>

    <Location /mod_cluster-manager>

        SetHandler mod_cluster-manager

        Order deny,allow

        Allow from all

    </Location>

          KeepAliveTimeout 60

          MaxKeepAliveRequests 0

          AdvertiseFrequency 5

          ManagerBalancerName kylincluster

          ServerAdvertise Off

          EnableMCPMReceive On

</VirtualHost>

3.2.3 重啟服務

  #service httpd restart  若啟動成功則表明配置正確。

3.3 JBoss配置

  我們通過Web介面新增proxy-list、balancer完成JBoss端叢集配置。

3.2.1 為JBoss新增管理使用者

  進入到JBoss_HOME/bin下,執行./add-user.sh,按照提示依次選擇使用者型別(管理使用者、應用使用者)、使用者名稱、密碼等。注意,從jboss-eap-6.1.0開始,JBoss管理使用者的密碼必須包含數字、字母和其餘字元,且長度大於8字元。

3.2.2 登入管理介面進行配置

  以standalone-ha.xml模式(./standalone.sh -c standalone-ha.xml)啟動JBoss後登入管理介面(http://192.168.31.22:9990/console),選擇Profile,Web,mod_cluster,在彈出介面點選相關按鈕,編輯balancer值為kylinBalancer,proxy-list值為192.168.31.22:6666,sticky-session值為true,sticky-session-force值為false,點選儲存按鈕即完成配置。具體細節見下兩圖:

3.2.3 JBoss session複製配置

  進入到JBoss_HOME/standalone/deployments/s*.war/WEB-INF/,編輯web.xml。在web.xml中新增:

<distributable/>

3.4 叢集啟動

3.4.1 重新啟動Apache Httpd

#service httpd restart

3.4.1 依次啟動JBoss的兩個節點

  啟動Node1

#./standalone.sh -c standalone-ha.xml -b 192.168.31.22 -bmanagement 192.168.31.22  -Djboss.node.name=node1 -Djboss.mod_cluster.jvmRoute=node1

  啟動Node2

#./standalone.sh -c standalone-ha.xml -b 192.168.31.21 -bmanagement 192.168.31.21  -Djboss.node.name=node2 -Djboss.mod_cluster.jvmRoute=node2

 

4、方案測試、驗證

4.1 登入mod_cluster管理介面

4.2 登入應用伺服器

  以代理伺服器IP、Port登入應用伺服器,例如:http://192.168.31.22:6666/starott_up_client/login ,能夠登入成功。

4.3 高可用性驗證

  以代理伺服器IP、Port登入應用伺服器,例如:http://192.168.31.22:6666/starott_up_client/login。觀察兩個真實節點中的日誌檔案,將正在提供服務的節點(例如節點1)停掉,觀察網頁是否正常提供服務,即節點1上的session複製到其餘節點,繼續提供服務。

 

5、注意事項

5.1 httpd服務啟動問題

(1)Apache Httpd在啟動時可能會遇到埠占用問題,採用如下命令,找到佔用該埠的程式,殺掉:

#netstat -anp | grep 80

#kill -9 12993

(2)在啟動時也會遇到許可權問題,例如:

Starting httpd: (13)Permission denied: make_sock: could not bind to address 192.168.31.22:6666

no listening sockets available, shutting down

解決辦法為關閉selinux:

setenforce 0

5.2 不同機器session複製問題

  如果本地伺服器上可以進行session複製,而不可以同區域網內部的其他節點進行session複製,那麼可能是由於兩臺機器的時間不同步,導致session複製失敗。

5.3 sticky-session解析

  sticky-session是指session是否具有黏著性。如果false則代表session為非黏著性session,也就是說如果第一次的請求會話是在node1這個節點,那麼在下一次請求的時候就有很大的不確定性,很有可能就到了node2這個節點上。而黏著性session就代表著一次請求,只要會話不變、瀏覽器不關閉,那麼在這一整個的長回話session請求中,自始至終都是同一個節點為這個長久會話提供服務,如果不是特殊原因,絕對不會將節點切換到別的機器上。

  如果JBoss配置了相關叢集的資訊,那麼其中一個節點當機之後,請求就會自動切換到另一個節點上去,Session資訊也會複製過去,保證客戶的會話資訊不會丟失。

 

相關文章