Apache+jk+tomcat負載均衡詳細配置方法
網上關於Apache+JK+Tomcat的叢集配置例子很多,按著例子配置下來,基本都能執行,不過,在一些重要的地方卻沒有進一步的說明。這次公司一個產品就是採用Apache+JK+Tomcat叢集,在整個配置、測試過程中,遇到了許多的問題,經過不斷測試、摸索,最後總算是搞定了,效能也達到了預期的目標。針對網上的例子,感覺有必要再詳細的介紹一下我的配置過程,對一些要特別注意的地方進行補充。
叢集有別於分散式的解決方案,它採用的是每臺伺服器執行相同應用的策略,由負責平衡的伺服器進行分流,這對提高整個系統的併發量及吞吐量是更有效的辦法。而叢集對請求的處理又有兩種不同的方式:負載平衡、狀態複製(即叢集),狀態複製需要在各伺服器間複製應用狀態,而負載平衡則不用,每臺伺服器都是獨立的。實踐證明,在各應用伺服器之間不需要狀態複製的情況下,負載平衡可以達到效能的線性增長及更高的併發需求。
對於叢集的其它基礎知識,在此就不再贅述。以下就這次Apache+JK+Tomcat的負載平衡配置進行總結,重點關注整個配置及注意事項。
準備軟體
1、Tomcat或JBoss(本文件中採用的是JBoss4.0.2);
2、apache2.0.54是開源的Web伺服器,下載地址為: http://www.apache.org/dist/httpd/binaries/ ;
3、mod_jk-1.2.14-apache-2.0.54.so模組,jk是mod_jserv的替代者,它是Tomcat-Apache外掛,為Apache和Tomcat的聯結器,處理Tomcat和Apache之間的通訊,在叢集配置中充當負載均衡器的作用,當前的最新版本為1.2.15,不過不同JK版本與不同的Apache版本之間的搭配有一些差異,有的甚至配不起來。JK2是符合apache2.x系列的新品,但由於其配置太過麻煩,使用的人很少,所以目前已停止開發,所以我們採用了jk聯結器,下載地址: http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/ 。
叢集與負載平衡
使用mod_jk預設的以輪循方式進行平衡負載,假設有四個伺服器節點,有10個請求,則四個節點分別接受請求編號如下:
而叢集方式也是使用這種方法進行平衡。Tomcat中的叢集原理是通過組播的方式進行節點的查詢並使用TCP連線進行會話的複製。
叢集不同於負載平衡的是,由於叢集服務需要在處理請求之間不斷地進行會話複製,複製後的會話將會慢慢變得龐大,因此它的資源佔用率是非常高的,如果在併發量大的應用中,複製的會話大小會變得相當大,而使用的總記憶體更是會迅速升高。
但叢集的會話複製,增加了系統的高可用性。由於在每臺伺服器都儲存有使用者的Session資訊,如果伺服器群中某臺當機,應用可以自動切換到其它伺服器上繼續執行,而使用者的資訊不會丟失,這提高了應用的冗錯性。
具體採用負載平衡還是叢集,這要看應用的需求了。
安裝配置Apache
1、下載Apache的安裝程式apache_2.0.54-win32-x86-no_ssl.exe後,安裝很簡單,一路回車,就此略過。
2、安裝完畢後,將下載的mod_jk-1.2.14-apache-2.0.54.so複製到Apache安裝目錄下的modules子目錄中。
3、然後進入Apache安裝目錄下的conf子目錄中,開啟httpd.conf配置檔案,在最後插入以下一行:
Include conf/mod_jk.conf
以上指令的目的為載入JK模組的配置檔案,當然,你也可以直接將JK配置檔案直接寫在此處,但前者思路更加清晰。
4、在conf子目錄下,建立一個新的配置檔案:mod_jk.conf,此檔案為Apache載入聯結器的配置檔案,檔名可修改,但要與httpd.conf中Include的檔名一致,內容如下:
# Load mod_jk module. Specify the filename# of the mod_jk lib you’ve downloaded and
# installed in the previous section
LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so
# Where to find workers.properties
JkWorkersFile conf/workers2.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# 請求分發配置,可以配置多項
JkMount /* loadbalancer
# 關掉主機Lookup,如果為on,很影響效能,可以有10多秒鐘的延遲。
HostnameLookups Off
5、在conf子目錄下,建立一個新的配置檔案:workers2.properties,此檔案為負載平衡的配置檔案,檔名不能修改,這是JK預設的名字,內容如下:
worker.list=loadbalancer
# Define the first node...
worker.server99.port=8009
worker.server99.host=192.168.11.99
worker.server99.type=ajp13
worker.server99.lbfactor=1
worker.server99.local_worker=1
worker.server99.cachesize=1000
worker.server99.cache_timeout=600
worker.server99.socket_keepalive=1
worker.server99.socket_timeout=0
worker.server99.reclycle_timeout=300
worker.server99.retries=3
# Define the second node...
worker.server202.port=8009
worker.server202.host=192.168.11.202
worker.server202.type=ajp13
worker.server202.lbfactor=1
worker.server202.local_worker=1
worker.server202.cachesize=1000
worker.server202.cache_timeout=600
worker.server202.socket_keepalive=1
worker.server202.socket_timeout=0
worker.server202.reclycle_timeout=300
worker.server202.retries=3
# Now we define the load-balancing behaviour
worker.loadbalancer.type=lb
worker.retries=3
worker.loadbalancer.balance_workers=server99 ,server202
worker.loadbalancer.sticky_session=true
worker.loadbalancer.sticky_session_force=true
注:以上定義了兩個worker,一個為server99,另一個為server202,定義了一個負載平衡伺服器loadbalancer,相關的詳細說明可以看官方的網站文件: http://tomcat.apache.org/connectors-doc/ ,其它節點的定義可以直接Copy,修改一下節點名及IP就好了。下面對各指令做詳細的說明:
worker.list=loadbalancer:設定工作的負載平衡器,各Tomcat節點不能加入此列表。
worker.server99.lbfactor:負載平衡的權重比,如果此權重比越大,則分配到此節點的請求越多,如以上兩個節點的權重比為1:1,則為平均分配。
worker.loadbalancer.balance_workers=server99,server202:指定此負載平衡器負責的Tomcat應用節點。
worker.loadbalancer.sticky_session=true:此處指定叢集是否需要會話複製,如果設為true,則表明為會話粘性,不進行會話複製,當某使用者的請求第一次分發到哪臺Tomcat後,後繼的請求會一直分發到此Tomcat伺服器上處理;如果設為false,則表明需求會話複製。
worker.loadbalancer.sticky_session_force=true:如果上面的sticky_session設為true時,建議此處也設為true,此參數列明如果叢集中某臺Tomcat伺服器在多次請求沒有響應後,是否將當前的請求,轉發到其它Tomcat伺服器上處理;此引數在sticky_session=true時,影響比較大,會導致轉發到其它Tomcat伺服器上的請求,找不到原來的session,所以如果此時請求中有讀取session中某些資訊的話,就會導致應用的null異常。
6、Apache伺服器的配置檔案httpd.conf中,預設有三個引數對效能的影響比較大,但根據不同的效能要求,引數的表現又不一樣,太小併發提不上去,太大效能反而不好,建議根據專案的需要,實際做個測試,如併發要求800的話,可以設定為:
# 一個連線的最大請求數量MaxKeepAliveRequests 1000(值為0,則不限制數量)
# 每個程式的執行緒數,最大1920。NT只啟動父子兩個程式,不能設定啟動多個程式
ThreadsPerChild 1000(最大為1920)
# 每個子程式能夠處理的最大請求數
MaxRequestsPerChild 1000(值為0,則不限制數量)
這三個引數要根據不同的需求,不同的伺服器進行調整。
安裝配置Tomcat或JBoss
1、對於Tomcat或JBoss的安裝,這裡不做說明,目前我們是採用Apache+JBoss,不過,JBoss也是用的Tomcat,所以這裡的配置也是適合Tomcat的;
2、對於JBoss的配置,很簡單,只需要改兩個地方就可以了:
進入jboss-4.0.2serverdefaultdeployjbossweb-tomcat55.sar,開啟server.xml,大約在第32行左右,有,在其中加入一個引數,變為:
進入jboss-4.0.2serverdefaultdeployjbossweb-tomcat55.sarMETA-INF目錄,開啟jboss-service.xml,大約在110行,有false,將其改為:true
這裡有一個需要特別注意的地方,JBoss的Tomcat中,關於AJP連線協議的預設配置,對於大併發量是不夠用的,要做一些修改,進入jboss-4.0.2serverdefaultdeployjbossweb-tomcat55.sar,開啟server.xml,找到的地方,這裡是定義AJP聯結器的地方,它的配置中沒有maxThreads項,預設為200,我們可以做修改:
emptySessionPath="true" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" maxThreads="3000" />
maxThreads的值要看你的併發量多大,設定太大也不好。
執行
至此,整個配置全部完成,注意一點是,在各JBoss節點,重啟或新增加一個JBoss節點時,需要重新啟動Apache,而對於伺服器群中某個JBoss節點shutdown,Apache會自動偵測,不用重新啟動。
如果在執行過程中,群中的某個JBoss節點shutdown,則已登入到此伺服器上的使用者的請求將出錯,此伺服器負責的session將丟失,但Apache會自動偵測到此伺服器已shutdown,後繼的新請求將不會再引導到此節點。
對於負責請求分發的Apache伺服器,需要消耗大量的CPU資源,因此如果在測試過程中出現一些Service Temporarily Unavailable或Server has shut down the connection prematurely這樣的錯誤,這一般都是伺服器配置不夠好引起的,或者是Apache、Tomcat、及應用中的某些配置不夠使用,這時候就要考慮換更好的機器或優化應用中的配置。
常見問題
1、cannot connect to server:無法連線到伺服器。這種情況是伺服器的配置有問題,伺服器無法承受過多的併發連線了,需要優化伺服器的配置:
如作業系統採用更高版本,如windows 2003 server,優化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450" 但是tomcat 最多支援500個併發訪問
優化apache配置:ThreadsPerChild 1900, MaxRequestsPerChild 10000
2、 Action.c(10): Error -27791: Server has shut down the connection prematurely HTTP Status-Code=503 (Service Temporarily Unavailable):一般都是由於伺服器配置不夠好引起的,需要優化硬體和調整程式了。
3、無法處理請求:當我們輸入 ***.do 命令後,apache卻返回錯誤資訊,而連線tomcat卻沒有問題。原因是沒有把.do命令轉發給tomcat處理。解決方法為在apache配置檔案中配置如下內容:
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
相關文章
- 負載均衡詳解負載
- 4. Spring Cloud Ribbon 實現“負載均衡”的詳細配置說明SpringCloud負載
- 全網最詳細的負載均衡原理圖解負載圖解
- Nginx負載均衡詳解Nginx負載
- nginx配置+uwsgi+負載均衡配置Nginx負載
- Nginx/Httpd負載均衡tomcat配置Nginxhttpd負載Tomcat
- 使用Nginx配置TCP負載均衡NginxTCP負載
- IdentityServer4 負載均衡配置IDEServer負載
- windows第七層負載均衡 基於IIS的ARR負載均衡詳解Windows負載
- F5負載均衡系列教程八【負載均衡演算法詳解】負載演算法
- nginx安裝及負載均衡配置Nginx負載
- 做了反向代理和負載均衡的nginx配置檔案簡單示例(nginx.conf) HTTP負載均衡/TCP負載均衡負載NginxHTTPTCP
- 負載均衡開啟Gzip配置及檢測方法說明負載
- LVS負載均衡配置與keepalive服務配置負載
- Kubernetes上的負載均衡詳解負載
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- 使用LVS實現負載均衡原理及安裝配置詳解負載
- windows伺服器第四層負載均衡_基於NLB負載均衡詳解Windows伺服器負載
- 負載均衡負載
- Ribbon負載均衡策略與自定義配置負載
- docker下nginx反向代理和負載均衡配置DockerNginx負載
- RHEL 7配置HAProxy實現Web負載均衡Web負載
- Nginx 兩臺伺服器配置負載均衡!!!Nginx伺服器負載
- nginx配置web服務|反向代理|負載均衡NginxWeb負載
- 阿里雲負載均衡SSL證書配置(更新)阿里負載
- IP負載均衡負載
- WebSocket負載均衡Web負載
- nginx負載均衡Nginx負載
- NGINX 負載均衡Nginx負載
- 【Nginx】負載均衡Nginx負載
- 負載均衡---ribbon負載
- LoadBalancer負載均衡負載
- LVS 負載均衡負載
- 常用負載均衡詳解(圖文總結)負載
- 負載均衡 - MQTT Broker 叢集詳解(一)負載MQQT
- 負載均衡技術(一)———負載均衡技術介紹負載
- 解密負載均衡技術和負載均衡演算法解密負載演算法
- F5負載均衡有何技術優勢?為你詳細解讀負載