基於Apache+Tomcat負載均衡的兩種實現方法


http://yijiu.blog.51cto.com/433846/1435995


基於Apache+Tomcat負載均衡的兩種實現方法
2014-07-08 17:23:50
版權聲明:原創作品,如需轉載,請與作者聯繫。否則將追究法律責任。

Apache+Tomcat實現負載均衡的兩種實現方法

如果我們將工作在不同平臺的apache能夠實現彼此間的高效通信,因此它需要一種底層機制來實現--叫做apr

Apr的主要目的就是爲了其能夠讓apache工作在不同的平臺上,但在linux上安裝apache的時候通常都是默認安裝的

[root@node2 ~]#rpm -qi apr
Name                 :apr                                        Relocations: (not relocatable)
Version              :1.3.9                                      Vendor: CentOS
Release              :5.el6_2                                    Build Date: Thu 14 Jun 2012 06:53:03 PM CST
Install Date: Fri 16 May 2014 07:11:23 PM CST                          Build Host:c6b5.bsys.dev.centos.org
Group                :System Environment/Libraries                    Source RPM: apr-1.3.9-5.el6_2.src.rpm
Size                 :303205                                     License: ASL 2.0
Signature            : RSA/SHA1,Thu 14 Jun 2012 08:27:12 PM CST, Key ID 0946fca2c105b9de
Packager             :CentOS BuildSystem  <http://bugs.centos.org>
URL                   http://apr.apache.org/
Summary              :Apache Portable Runtime library
Description :
The mission of the Apache Portable Runtime (APR) is to provide a
free library of C data structures and routines, forming a system
portability layer to as many operating systems as possible,
including Unices, MS Win32, BeOS and OS/2.

 

Tomcat連接器架構:
基於Apache做爲Tomcat前端的架構來講,Apache通過mod_jk、mod_jk2或mod_proxy模塊與後端的Tomcat進行數據交換。而對Tomcat來說,每個Web容器實例都有一個Java語言開發的連接器模塊組件,在Tomcat6中,這個連接器是org.apache.catalina.Connector類。這個類的構造器可以構造兩種類別的連接器:HTTP/1.1負責響應基於HTTP/HTTPS協議的請求,AJP/1.3負責響應基於AJP的請求。但可以簡單地通過在server.xml配置文件中實現連接器的創建,但創建時所使用的類根據系統是支持APR(ApachePortable Runtime)而有所不同。

APR是附加在提供了通用和標準API的操作系統之上一個通訊層的本地庫的集合,它能夠爲使用了APR的應用程序在與Apache通信時提供較好伸縮能力時帶去平衡效用。

同時,需要說明的是,mod_jk2模塊目前已經不再被支持了,mod_jk模塊目前還apache被支持,但其項目活躍度已經大大降低。因此,目前更常用的方式是使用mod_proxy模塊。
如果支持APR:

1、HTTP/1.1:org.apache.coyote.http11.Http11AprProtocol

2、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol

不支持APR:

HTTP/1.1:org.apache.coyote.http11.Http11Protocol
AJP/1.3: org.apache.jk.server.
JkCoyoteHandler

 

tomcat的運行方式

·standalone 獨立運行的服務,使其本身就能接收web服務,而且能服務動態又能服務靜態內容

   在tomcat處理靜態內容完全不亞於apache,因爲如果必須將動靜分割開來的話,至少可以降低動態請求的壓力,在架構上是必須的,但tomcat本身的確是具有web服務響應能力的

   而tomcat的連接器有多種類型,它的主要目的是服務於動態程序,所以我們是不應該讓它直接面對用戶的

·apache+tomcat 將節點分離,使apache接受請求而tomcat在後端進行動態請求處理

    如果tomcat不直接面向客戶端的話,而是隻接受apache的請求,有種協議非常高效,叫做ajp,這種方式可以完全禁用tomcat的http連接器,而只啓用ajp

    這樣用戶是絕對不可能訪問tomcat,由此所有的請求要想訪問tomcat,必須先由apcahe代理,而apache是支持ajp協議的

這就是爲什麼很多場景都使用apache跟tomcat結合的原因

 

其好處是,tomcat不會直接面對用戶,很多用戶的連接進來的請求只能跟前端apache建立關係,如果支持長連接,但是這段時間又沒請求新的內容,可以將這些連接當做非活動鏈接,非活動鏈接是不會被apache轉向後端的,所以如果前端是長連接而後端使用的是ajp或http協議沒有使用長連接方式,尤其是非活動請求都只到apache就停止活動,因此tomcat的資源就被釋放出來

 

如果能夠這樣配置會更好:

靜態內容都直接交給apache響應,而不會向後轉發,動態內容則直接交給tomcat,這樣就算使用nginx也可以

 

·tomcat+apache 都工作在獨立主機上

    如果跨主機的方式轉發,網絡延遲是不容忽視的,網絡必然要有延遲的

    如果在同臺主機上,基於127.0.0.1作爲轉發地址的話,所有請求都會在內核中進行轉發

    內核最大帶寬大概爲10G左右甚至更高,內核通信間也是需要佔用帶寬的

 

那麼問題又來了:

如何進行會話保持呢?如果是電商站點,很顯然是必須要使用會話保持的

好在tomcat已經考慮到會話機制了,因此在tomcat中有很多內置會話管理器

 

tomcat會話管理器

·標準會話管理器(StandardManager)  

    有持久功能,比如tomcat已關機,會話是不會丟失的會將會話提前保存在磁盤中(定期保存),此後上線還會讀取,但是突然崩潰會話一定會崩潰的

    tomcat正常關閉,會話不會丟失,但是如果主機崩潰或者進程崩潰,會話一定會丟失

 

·持久會話管理器(PersistentManager):

    在進程關閉的的時候將會話保存在磁盤上,就算崩潰了也只是丟失一部分沒有來得及同步的會話,其他已同步的會話依然可用

 

·集羣會話管理器(DeltaManager)

     對tomcat而言完全將幾個節點做成會話集羣,每個節點定期通過多播地址向其他節點通告本機依然在在線的心跳信息,而多久進行通過是以微秒級別進行定義的,只要向外通告心跳,其他節點都認爲其是正常的,一旦不通告自己的心跳,其他節點就將其移除出節點

 

集羣會話管理器的最大好處是可以在內存級別共享會話的

    如果用戶來訪問被定向至第一個服務器,這時會在第一個節點產生會話的,會通過所謂的多播通道將自己的會話信息多播給其他節點,所以這個時候每個節點都會存放一份

    這時任何節點故障,通過重新定向至其他tomcat,會話依舊存在

 

但對於非常繁忙的服務器來講其工作量會很大,所以當在大規模集羣中是非常不適用的,因爲非常佔用資源

因此還需要靠其他機制來實現共享會話

 

如果節點非常的多,這時候就算適用source或ip hash 也未必會有太大問題,因爲節點很多而平時第一次訪問的時候通常都是被負載均衡的,而用戶所有的請求能夠被熱點集中在一臺主機或幾臺主機上機率非常小,雖然基於這類算法有可能會損害一部分負載均衡效果但是在全局範圍內可以被忽略的

 

如果節點非常少結果就非常明顯,所以在節點多的環境下直接綁定會話問題也不大

或者自己提供共享會話機制來存放會話,比如memcached或redis等機制

 

·BackManager 

    將一個節點的會話同步給一個或有限個數的節點,而不是所有,這樣就可降低會話同步造成的代價

 

對於集羣類型的DeltaManager 其額外需要依賴的組件非常多

因爲如果啓用DeltaManager,就必須啓動tomcat內置集羣功能,這個集羣需要監聽在某個多播地址上傳遞心跳信息

apache+tomcat集羣部署

apache+tomcat實現集羣,無非就是用apache兩組模塊來實現的,分別爲mod_proxy 和 mod_jk 最爲常見

mod_proxy 

    ajp

    http

mod_jk

    ajp 

    http

mod_jk2

在apache2.0或2.0之後的版本中只支持mod_jk的方式 ,而mode_proxy是2.2以後支持的功能

 

·方法一:基於mod_jk模塊對tomcat實現負載均衡

配置Apache

檢測httpd是否安裝以下模塊

[root@node1 ~]# httpd -M

proxy_module (shared)
proxy_balancer_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_ajp_module (shared)
proxy_connect_module (shared)

首先確保apr模塊是否安裝

[root@node1 ~]# rpm -qa | grepapr
apr-1.3.9-5.el6_2.x86_64
haproxy-1.4.24-2.el6.x86_64
apr-util-1.3.9-3.el6_0.1.x86_64
apr-devel-1.3.9-5.el6_2.x86_64
apr-util-ldap-1.3.9-3.el6_0.1.x86_64

確保apxs是否存在,由於是臨時yum安裝http-deve應該沒有被安裝,如果是編譯安裝的httpd會自帶apxs

[root@node1 ~]# yum -y install httpd-devel

安裝connectors模塊

[root@node1 tmp]# tar xftomcat-connectors-1.2.37-src.tar.gz 

[root@node1 tmp]# cdtomcat-connectors-1.2.37-src/

[[email protected]]# cd native/

[root@node1 native]#./configure --with-apxs=/usr/sbin/apxs     

[root@node1 native]# make&& make install

安裝過程中可以看到如下信息提示:

chmod 755/usr/lib64/httpd/modules/mod_jk.so
Please be sure to arrange /etc/httpd/conf/httpd.conf...

查看模塊是否存在

[root@node1 ~]#  ls /etc/httpd/modules/  | grep jk

mod_jk.so

配置啓用模塊

[root@node1 native]# cd/etc/httpd/conf.d/

配置mod_jk.conf

創建新配置文件mod_jk.conf,並加入以下內容:

[root@node1 conf]# cat/etc/httpd/conf.d/mod_jk.conf
# Load the mod_jk

LoadModule  jk_module modules/mod_jk.so

JkWorkersFile  /etc/httpd/conf.d/workers.properties

JkLogFile       logs/mod_jk.log

JkLogLevel      debug

JkMount  /*    TomcatA              #標註,必須跟wokers.properties文件中一致

JkMount  /status/ stat1

 

接下來要配置workers.properties

/etc/httpd/conf.d/workers.properties 文件一般由兩類指令組成:

·mod_jk可以連接的各worker名稱列表;

·每一個worker的屬性配置信息;

但是woker name不是隨便命名的,它是需要根據tomcat中engin組件jvmroute參數的值

配置workers.properties

創建文件後加入以下內容:

[root@node1 conf.d]# catworkers.properties

worker.list=TomcatA,stat1                      #tomcatA監聽端口,ajp協議默認就已監聽

worker.TomcatA.host=10.0.10.61                 #TomcatA的主機地址,這裏爲本機的IP地址,因爲本地也在運行tomcat

worker.TomcatA.type=ajp13                      #連接器類型

worker.TomcatA.lbfactor=1                      #負載均衡調度權重

worker.stat1.type = status                    

以上實例在mod_jk中已做調用

stat1 這個參數是瞎編的,因爲他主要目的是在於輸出狀態信息的,因爲mod_jk有狀態接口,相當於nginx狀態監測端口一樣

通常都用stat1來表示

 

到此配置已完成,啓動tomcat以及httpd

 [root@node1 conf]# catalina.sh start

[root@node1 conf.d]# httpd -t

Syntax OK

[root@node1 conf.d]#/etc/init.d/httpd start

Starting httpd:                                           [  OK  ]

[root@node1 conf.d]# netstat-lnt | grep 80

tcp        0     0 :::80                        :::*                       LISTEN     

tcp        0     0 :::8080                     :::*                        LISTEN     

tcp        0     0 ::ffff:127.0.0.1:8005       :::*                        LISTEN     

tcp        0      0:::8009                     :::*                        LISTEN     

訪問測試:

wKiom1O7uG2AbctZAAMc9ncV1W4922.jpg

打開status/

http://10.0.10.61/status/

最後的斜線必須得加,因爲配置mod_jk的時候就已經加過了

wKiom1O7uH7iQcvoAAOzWTm_Kvw467.jpg

如上所示,可以顯示出後端信息但是我們發現並沒有定義這些屬性,之後慢慢會提到

 

補充:woker的類型

Worker        有多種不同的類型,而類型有三種

ajp3          此類型表示當前woker爲一個運行tocat的實例

lb            專用於負載均衡場景,

status  

worker其它常見的屬性說明

· host:Tomcat 7的worker實例所在的主機;
· port:Tomcat 7實例上AJP1.3連接器的端口;
· connection_pool_minsize:最少要保存在連接池中的連接的個數;默認爲pool_size/2;
· connection_pool_timeout:連接池中連接的超時時長;
· mount:由當前worker提供的context路徑,如果有多個則使用空格格開;此屬性可以由JkMount指令替代;
· retries:錯誤發生時的重試次數;
· socket_timeout:mod_jk等待worker響應的時長,默認爲0,即無限等待;
· socket_keepalive:是否啓用keepalive的功能,1表示啓用,0表示禁用;
· lbfactor:worker的權重,可以在負載均衡的應用場景中爲worker定義此屬性;

 

實現多實例轉發

基於mod_jk模塊是可以實現負載均衡的方式向後端進行轉發

規劃如下

服務器IP

服務器角色

10.0.10.61

Apache/Tomcat

10.0.10.62

Tomcat

雙方配置好基礎環境,步驟略,並且建立測試頁面

TomcatA頁面內容如下所示:

[root@node1 app1]# catindex.jsp

<%@ pagelanguage="java" %>

<html>

 <head><title>TomcatA</title></head>

  <body>

    <h1><fontcolor="red">TomcatA </font></h1>

    <tableborder="1">

      <tr>

        <td>Session ID</td>

    <%session.setAttribute("abc","abc"); %>

        <td><%= session.getId()%></td>

      </tr>

      <tr>

        <td>Created on</td>

        <td><%= session.getCreationTime()%></td>

     </tr>

    </table>

  </body>

</html>

TomcatB頁面內容如下所示:

[root@node2 conf]# mkdir -p/tomcat/app1/WEB-INF/{lib,classes}

[root@node2 app1]# catindex.jsp

<%@ pagelanguage="java" %>

<html>

  <head><title>TomcatB</title></head>

  <body>

    <h1><fontcolor="blue">TomcatB </font></h1>

    <tableborder="1">

      <tr>

        <td>Session ID</td>

    <%session.setAttribute("abc","abc"); %>

        <td><%= session.getId()%></td>

      </tr>

      <tr>

        <td>Created on</td>

        <td><%=session.getCreationTime() %></td>

     </tr>

    </table>

  </body>

</html>

 

配置負載均衡

首先配置缺省路由並隱藏對外IP,由於我們這裏其中一個節點分別跑了apache和tomcat所以只能將另外一個節點隱藏其真實ip

eth0      Link encap:Ethernet   HWaddr 00:0C:29:EF:9C:E5 

          inet addr:10.0.10.62  Bcast:10.0.10.255  Mask:255.255.255.0

eth1      Link encap:Ethernet   HWaddr 00:0C:29:EF:9C:EF 

          inet addr:172.23.214.58  Bcast:172.23.215.255  Mask:255.255.254.0

將eth0網卡關閉

[root@node2 app1]# ifdown eth0

配置默認路由

[root@node2 ~]# route adddefault gw 172.23.215.25   

 

切換至apache節點

開啓路由轉發

[root@node1 app1]# vim/etc/sysctl.conf

修改參數

net.ipv4.ip_forward = 1

保存退出並讓其生效

[root@node1 app1]#sysctl -p

編輯tomcat server.xml 找到以下參數

    <Engine name="Catalina"defaultHost="www.test.com" >

TomcatA修改爲:

    <Engine name="Catalina"defaultHost="www.test.com" jvmRoute="TomcatA">

TomcatB修改爲:                                         

    <Engine name="Catalina"defaultHost="www.test.com"jvmRoute="TomcatB" >

·爲了避免用戶直接訪問後端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1連接器。
·爲每一個Tomcat 7實例的引擎添加jvmRoute參數,並通過其爲當前引擎設置全局惟一標識符。如下所示。需要注意的是,每一個實例的jvmRoute的值均不能相同。

而後去配置apache,修改爲如下內容:

# Load the mod_jk

LoadModule  jk_module modules/mod_jk.so

JkWorkersFile  /etc/httpd/conf.d/workers.properties

JkLogFile       logs/mod_jk.log

JkLogLevel      debug

JkMount  /*    lbcluster1

JkMount  /status/ stat1

編輯workers.properties,添加如下內容:

[root@node1 conf.d]# vimworkers.properties

worker.list = lbcluster1,stat1                     #lbcluster1必須與後端的一直

worker.TomcatA.type = ajp13                        #使用的類型爲ajp協議

worker.TomcatA.host = 172.23.215.25                #tomcatA的ip地址

worker.TomcatA.port = 8009                         #ajp協議的監聽端口

worker.TomcatA.lbfactor = 1                        #負載均衡的權重

 

worker.TomcatB.type = ajp13

worker.TomcatB.host = 172.23.214.58

worker.TomcatB.port = 8009

worker.TomcatB.lbfactor = 1

    

worker.lbcluster1.type = lb                        #定義lbcluster1爲負載均衡,類型爲lb

worker.lbcluster1.sticky_session= 0                #會話綁定爲0,0意爲不讓其綁定

worker.lbcluster1.balance_workers= TomcatA, TomcatB         #lbcluster組內有多少個節點並對組內的節點事先負載均衡,這裏爲2個,分別爲tomcata和tomcatb

worker.stat1.type = status

所以這裏lbcluster1可以自動向tomcatA tomcatB上進行轉發了,而lbcluster1這個專用的woker有一些專用的屬性,如下:

·balance_workers

    用來定義後端有幾個server,每個實例都需要定義其屬性的

·method

    設定調度方法,此類有三種

    爲R、T或B;默認爲R,即根據請求的個數進行調度;

    T表示根據已經發送給worker的實際流量大小進行調度;

    B表示根據實際負載情況進行調度

    因此,定義負載均衡的時候可以寫爲worker.lbcluster1.method= R,T,B

·sticky_session

    綁定會話,如果使用此參數就不要使用調度算法,因爲這個參數相當於ip_hash或source 來自同一客戶端請求始終被定向至同一個woker

保存退出並檢查語法

[root@node1 conf.d]#/etc/init.d/httpd configtest

Syntax OK

啓動apache

[root@node1 conf.d]#/etc/init.d/httpd start

啓動tomcat

[root@node2 ~]# catalina.shstart

訪問測試,結果無誤,查看status

 

 

·方法二:基於mod_proxy模塊對tomcat實現負載均衡

實現簡單單臺server轉發

[root@node1 conf.d]# mvmod_jk.conf mod_jk.conf.bak_$(date +%F)

確保以下模塊存在

[root@node1 conf.d]# httpd -M| grep proxy

Syntax OK

 proxy_module (shared)

 proxy_balancer_module (shared)

 proxy_ftp_module (shared)

 proxy_http_module (shared)

 proxy_ajp_module (shared)

 proxy_connect_module (shared)

如要開啓proxy模塊,需要在httpd全局配置文件或某虛擬主機中加入以下參數:

ProxyVia On
ProxyRequests Off

如下所示:

以全局配置爲例,首先創建配置文件mod_proxy.conf,並加入以下參數

[root@node1 conf.d]# vimmod_proxy.conf    

ProxyVia On

ProxyRequests Off

 

<Proxy *>

    Order allow,deny

    Allow from all

</Proxy>

#這裏是以http協議進行反向代理

ProxyPass /http://172.23.215.25:8080/

ProxyPassReverse /http://172.23.215.25:8080/

 

<Location  / >

    Order allow,deny

    Allow from all

</Location>

配置參數說明:

ProxyPreserveHost {On|Off}:如果啓用此功能,代理會將用戶請求報文中的Host:行發送給後端的服務器,而不再使用ProxyPass指定的服務器地址。如果想在反向代理中支持虛擬主機,則需要開啓此項,否則就無需打開此功能。

ProxyVia {On|Off|Full|Block}:用於控制在http首部是否使用Via:主要用於在多級代理中控制代理請求的流向。默認爲Off,即不啓用此功能;On表示每個請求和響應報文均添加Via:;Full表示每個Via:行都會添加當前apache服務器的版本號信息;Block表示每個代理請求報文中的Via:都會被移除。
ProxyRequests {On|Off}:是否開啓apache正向代理的功能;啓用此項時爲了代理http協議必須啓用mod_proxy_http模塊。同時,如果爲apache設置了ProxyPass,則必須將ProxyRequests設置爲Off。想要使用反向代理必須關閉正向代理

ProxyPass  [path] !|url  [key=value key=value ...]]:將後端服務器某URL與當前服務器的某虛擬路徑關聯起來作爲提供服務的路徑,path爲當前服務器上的某虛擬路徑,url爲後端服務器上某URL路徑。使用此指令時必須將ProxyRequests的值設置爲Off。需要注意的是,如果path以“/”結尾,則對應的url也必須以“/”結尾,反之亦然。

·lbmethod:apache實現負載均衡的調度方法,默認是byrequests,即基於權重將統計請求個數進行調度,bytraffic則執行基於權重的流量計數調度,bybusyness通過考量每個後端服務器的當前負載進行調度。
· maxattempts:放棄請求之前實現故障轉移的次數,默認爲1,其最大值不應該大於總的節點數。
· nofailover:取值爲On或Off,設置爲On時表示後端服務器故障時,用戶的session將損壞;因此,在後端服務器不支持session複製時可將其設置爲On。
· stickysession:調度器的stickysession的名字,根據web程序語言的不同,其值爲JSESSIONID或PHPSESSIONID。

保存退出,並訪問測試測試

[root@node1 conf.d]# httpd -t

Syntax OK

[root@node1 conf.d]#catalina.sh start

訪問http://10.0.10.61/

wKioL1O7uHyg9XY_AADR3FikC6I743.jpg

使用ajp協議進行反向代理

ProxyVia On

ProxyRequests Off

 

<Proxy *>

    Order allow,deny

    Allow from all

</Proxy>

 

ProxyPass /ajp://172.23.215.25:8009/

ProxyPassReverse/ ajp://172.23.215.25:8009/

 

<Location  / >

    Order allow,deny

    Allow from all

</Location>

 

 

基於lb cluster實現負載均衡

如果想實現負載均衡不光是需要proxy模塊,還需要藉助於mod_blancer模塊

[root@node1 conf.d]# httpd -M| grep bal

Syntax OK

 proxy_balancer_module (shared)

 

配置balancer模塊

要使用負載均衡首先要定義以後balancer 而後在調度的時候使用ProxyPass,其並不是指定一個server 而是一個cluster組,如下所示:

將mod_proxy.conf配置文件修改爲:

ProxyVia On

ProxyRequests Off

 

<Proxybalancer://hotcluster>     

BalancerMember  ajp://172.23.215.25:8009 loadfactor=1            #後端server ,以ajp協議進行對接,權重爲1

BalancerMember  ajp://172.23.214.58:8009 loadfactor=1

ProxySet  lbmethod=bytraffic                                     #使用的算法,bytraffic爲輪詢算法

</Proxy>

 

<Proxy *>

    Order allow,deny

    Allow from all

</Proxy>

    

ProxyPass /balancer://hotcluster/                               #必須與上面一致,將hotcluster組內的主機進行負載均衡

ProxyPassReverse/ balancer://hotcluster/

 

<Location  / >

    Order allow,deny

    Allow from all

</Location>

balancer必須定義在虛擬主機之外

[root@node1 conf.d]# httpd -t

Syntax OK

[root@node1 conf.d]#/etc/init.d/httpd restart

訪問測試,確保無誤

如果再加入新的節點無非是將其balancer://hotcluster中定義BalancerMember 即可

 

mod_proxy的狀態信息檢查

mod_jk有狀態信息輸出的功能,可以隨時監控後端服務的實時健康狀態,如果是非監控的會自動終止代理轉發

mod_proyx同時也具備此功能呢,只不過是上線時間稍微慢一些

mod_proyx 也可以像mod_jk一樣輸出狀態信息

 

編輯配置文件,並加入以下參數:

ProxyVia On

ProxyRequests Off

 

<Proxybalancer://hotcluster>

BalancerMember  ajp://172.23.215.25:8009 loadfactor=1

BalancerMember  ajp://172.23.214.58:8009 loadfactor=1

ProxySet  lbmethod=bytraffic

</Proxy>

 

<Proxy *>

    Order allow,deny

    Allow from all

</Proxy>

 

<Location/balancer-manager>

  SetHandler balancer-manager

  Proxypass !

  Order Allow,Deny

  Allow from all

</Location>

#一定要放在ProxyPass的上面 不然會導致無法訪問

 

ProxyPass /balancer://hotcluster/

ProxyPassReverse /balancer://hotcluster/

 

<Location  / >

    Order allow,deny

    Allow from all

</Location>

檢查語法並重新加載

[root@node1 conf.d]# httpd -t

Syntax OK

[root@node1 conf.d]#/etc/init.d/httpd reload

 訪問測試

http://10.0.10.61/balancer-manager

wKioL1O7uJSC5_zOAAOKhJSAPlc465.jpg

Sessionscity算法類似於ip_hash,但是後端服務器如果宕機了,那麼會話會消失

如果數量不多的話可以使用tomcat的內部會話保持機制 detamanager算法

 

實現冗餘

如果單臺節點進行分發的話 那麼如果其節點故障,那麼整個環境將會癱瘓

於是我們可以將其進行冗餘配置,一來使資源不再浪費,二來不用擔心因某節點故障而影響業務

規劃如下:

wKioL1O7uK7BvyQkAACBo-GQ41g236.jpg

服務器IP

服務器角色

10.0.10.61

Node1:Apache/Tomcat

10.0.10.62

Node2:Apache/Tomcat

對Node2進行基本配置

開啓轉發

[root@node2 conf.d]# vim/etc/sysctl.conf

修改參數:

net.ipv4.ip_forward = 1

使內核參數生效

[[email protected]]# sysctl -p

由於是yum安裝的httpd 所以模塊已具備

[[email protected]]# httpd -M | grep proxy

SyntaxOK

 proxy_module (shared)

 proxy_balancer_module (shared)

 proxy_ftp_module (shared)

 proxy_http_module (shared)

 proxy_ajp_module (shared)

 proxy_connect_module (shared)

以上,我們已經配置了一臺apache,現在我們只需要在另外一個節點開啓apache並且配置mod_proxy即可,如下所示:

我們將之前配置好的mod_proxy拷貝至Node2一份

[root@node1 conf.d]# scpmod_proxy.conf node2:/etc/httpd/conf.d/

檢查語法無誤,並重啓服務

[[email protected]]# httpd -t

SyntaxOK

訪問測試,確保無誤

wKiom1O7ul3wPyXSAAGFEaw8HSg971.jpg

最後我們將其下游服務器對apache進行負載均衡即可達到冗餘效果

 

END,感謝各位

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章