web負載均衡[轉]

1,jboss

前面我們對Jboss的負載均衡的安裝和基本知識進行了敘述,想必大家已經把程序安裝好了。那麼現在來介紹一下配置的具體內容。首先我們來看一下 JBOSS實現負載均衡的方案。包括和其他軟件的綁定使用,以及自帶負載均衡模塊的使用這兩種方案。那麼現在讓我們從下文中具體瞭解一下。

  負載均衡

  Jboss的負載均衡目前有兩種方案,一是使用apache的mod_jk,二是使用jboss自帶的負載均衡模塊。下面分別講解這兩種配置。

  mod_jk的配置

  (1)、請確認%apache%\modules下已經有mod_jk-1.2.25-httpd-2.2.4.so文件。

  (2)、修改%apache%\conf\httpd.conf在文件末尾添加:Include conf/mod_jk2.conf

  (3)、在%apache%\conf下新建文件mod_jk2.conf文件內容如下:

以下是引用片段:
# 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.25-httpd-2.2.4.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 其中JkMount  
/* loadbalancer的意思是,把所有的請求都發給loadbalancer處理。可以通過修改url來控制發送某些request。 

  (4)、在%apache%\conf下新建文件workers2.properties其內容爲:

以下是引用片段:
worker.list=loadbalancer,server1,server2 
# Define the first node... 
  worker.server1.port=8009 worker.server1.host=192.168.0.1  
 worker.server1.type=ajp13 worker.server1.lbfactor=1 
  worker.server1.local_worker=1  worker.server1.cachesize=10   
# Define the first node...   
worker.server2.port=8009 worker.server2.host=192.168.0.2 
  worker.server2.type=ajp13 worker.server2.lbfactor=1 worker.server2.local_worker=1 worker.server2.cachesize=10   
# Now we define the load-balancing behaviour 
  worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=server1,server2   
worker.loadbalancer.sticky_session=1 

   其中對於node的命名規則是worker.節點名.xxxx。所以上述文件定義了兩個節點:server1和server2。8009端口是 jboss默認的ajp端口,另外需要注意的是worker.server2.lbfactor參數,它是節點的負載加權,它的值越大,獲得負載的機會就 越大。可以根據node的硬件性能進行調整。worker.loadbalancer.sticky_session參數是指定是否使用粘性 session。所有需要負載均衡的節點,都必須在worker.loadbalancer.balanced_workers參數中列舉出來。請記住所 有node的名稱和它對應着哪臺機器,後面的配置中會使用。嘗試啓動apache:%apache\bin\apache.exe,正常情況下沒有任何提 示。如果你使用的jk是2.0的,那麼配置文件的寫法完全不同,由於mod_jk2已經停止開發,所以apache並沒有提供任何講解,對於配置文件的編 寫也沒有任何指導。 

  (5)Jboss自帶均衡器的配置

  將文件 夾%jboss%\docs\examples\varia\loadbalancer\loadbalancer.sar拷貝到%jboss% \server\all\deploy下,並且修改loadbalancer.sar\loadbalancer.sar\META-INF \jboss-service.xml,在<host>標籤中類出所有節點,在<sticky-session>標籤中指定是否 使用粘性session。配置完成。該均衡器的缺點是負載能力相對不高,配置參數太少,比如無法指定不同節點的負載加權,所以後面都以mod_jk爲例, 不再講解jboss自帶的負載均衡器的內容。負載均衡的配置基本完成,啓動jboss,其中過程中會列出DefaultPatition中所有的節 點:run.bat -c all。任何節點的關閉與啓動都會在cluster中廣播,比如加如一個新節點後,其他節點會得到以下提示:

  (6)、Jboss負載均衡的session sticky配置

   apache應該會以粘性session的方式分發請求。部署一個應用測試一下,你會發現粘性session沒有起作用。因爲我們還沒有給jboss配 置jvm路由( jvmRoute),apache就無法知道究竟哪些session是屬於哪個節點的。我們繼續往下:

  修改server1機器上的jboss的配置文件:%jboss%\server\default\deploy\jboss-web.deployer\ META-INF\ jboss-service.xml

  在110行有:<attribute name="UseJK">false</attribute>,將它改爲true。值得注意的是在這行標籤上面有一段註釋,要求你在server.xml中必須有:

以下是引用片段:
Engine name="jboss.web" jmvRoute="Node1" defaultHost="localhost"

  請注意這裏有一個氣死人不償命的小bug,jboss的官方文檔把 jvmRoute寫成了jmvRoute,就是v和m兩個字母的顛倒讓我鬱悶了三天,翻遍了jboss.com和theserverside.com。都是直接拷貝的錯,吐血吐到脫水啊。

  下面需要修改server1上的%jboss%\server\default\deploy\jboss-web.deployer\ server.xml,在32行左右有:

以下是引用片段:
<Engine name="jboss.web" defaultHost="localhost">

  給它增加一個jvmRoute屬性:

以下是引用片段:
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="server1">

   請注意,jvmRoute的值必須和mod_jk中的節點名字正確對應,否則無法正確路由。Cluster中的所有節點都應該做相應的配置。Jboss 的配置完成了,下面需要在你的web應用中修改配置文件,讓它支持集羣。在WEB-INF\web.xml中加入屬 性:<distributable/>Ok,基於用戶的cluster完成了,每個用戶會綁定都某個節點上進行交互。這種綁定是如何完成的 呢?原來apache把客戶分發到節點後,該節點會在用戶的session id後面加上此節點的路由名稱,變成這個樣子:

以下是引用片段:
Efdfxxd98daja87daj76da2dka**,server1

  有了這個標誌,就能分辨該session屬於哪個節點。 

  (7)、session replication配置

   下面要做的是基於request的cluster,也就讓各個節點之間互相複製session狀態。有兩種複製模式,同步與異步。使用同步的方 式,jboss會把session複製的操作和對request的響應放到一個應用事務(application  transaction),session複製完成後纔去處理request。異步複製則發送session複製的消息後馬上處理 request,session複製則會稍有延遲。但是在多框架的web頁面中,這樣的集羣方式會有問題。由於frame在同一時間發出多個 request,會造成一些混亂,這也是採用基於用戶的集羣方式的原因之一。JBoss 4.0.2中採用了Jboss  cache來實現session複製,實際上就是一個分佈式緩存,由於session id中包含了jvm  route,所以能夠分辨session屬於哪個節點。Session的更新類似於hibernate中的樂觀鎖,有了更新之後就讓session的版本 號增加,其他節點通過對比版本號來決定是否同步session狀態。

  配置session replication首先需要編輯

   %jboss% server\all\deploy\jbossweb-tomcat55.sar\META-INF\  jboss-service.xml,88行左右有:  <attribute  name="SnapshotMode">instant</attribute>  這就是剛纔提到的複製模式,instant爲立即複製,如果設爲interval  那麼系統會在延遲一段時間再進行復制,時間長度在<attribute  name="SnapshotInterval">2000</attribute>中指定,單位是毫秒。單獨配置這一個地方還不夠, 在%jboss% server\all\deploy\ tc5-cluster-service.xml中有:<attribute  name="CacheMode">REPL_ASYNC</attribute>

  這裏才真正決定複製是同步的還是異步的,可以指定爲REPL_ASYNC(異步)或者REPL_SYNC(同步)。

   之後Jboss負載均衡的配置在這個文件下面一點,還有一個config標籤,裏面指定了各個節點在進行session複製的時候如何通信,有udp和 tcp兩種可選,如果使用udp方式,那麼應該將udp的lookback屬性指定爲true,因爲windows上有一個叫做media  sense的東西會影響udp multicast。注意如果你不瞭解multi  address的ip規則,請不要隨便修改mcast_addr的值。如果採用tcp方式的話,應該指定bind_addr的值爲本機ip,並且在 TCPPING標籤的initial_hosts屬性中列出所有節點,格式是"機器名[端口號]",比如在我們的例子中,就應該這樣配置tcp(以其中一 個節點爲例):

以下是引用片段:
<config>  
<TCP bind_addr="172.16.0.116" start_port="7810" loopback="true"/>  
<TCPPING initial_hosts="172.16.0.116[7810],172.16.32.88[7810]" port_range="3" timeout="3500" num_initial_members="3" up_thread="true" down_thread="true"/>  
 <MERGE2 min_interval="5000" max_interval="10000"/> 
 <FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" /> 
 <VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" /> 
 <pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"  retransmit_timeout="3000"/> 
 <pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" /> 
 <pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false" print_local_addr="true" down_thread="true" up_thread="true"/> <pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>  
 </config> 

  JBoss的 clustering版主建議儘量使用udp。不過在Sobey內部,建議使用tcp方式,經測試可能有不明物體在影響udp通信,導致Timeout異 常。在%jboss%\ server\all\deploy\  cluster-service.xml中也有關於udp和tcp的配置信息,在4.0以前版本的jboss中,會以這個文件爲主配置,4.0以後都以 tc5-cluster-service.xml爲主配置。

  Jboss的配置完成了,最後需要在web應用中增加配置信息,控制session複製的粒度。在WEB-INF\jboss-web.xml中增加以下內容:

以下是引用片段:
<replication-config> 
 <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger> 
 <replication-granularity>SESSION</replication-granularity> 
 </replication-config> 

  其中replication-trigger是指定哪些操作引發session的版本更新,它的取值有:

   SET_AND_GET    SET_AND_NON_PRIMITIVE_GET  SET  replication-granularity是複製粒度,可以取session或attribute。如果取爲attribute有可能導致複製失 敗,這是目前版本的jboss cache的一個bug,等待修正。

  部署項目,測試,如果配置沒有問題,可以 在%jboss%\0server\all\log\server.log中發現類似於這樣的信息:  DEBUG  [org.jboss.web.tomcat.tc5.session.JBossCacheManager] check to see if  needs to store and replicate session with id  Im9-qpuaXppMS+xXwE3M+Q**.server1

  DEBUG  [org.jboss.web.tomcat.tc5.session.ClusteredSession]  processSessionRepl(): session is dirty. Will increment version from: 20  and replicate.

  在Jboss負載均衡中Session replication配置的成功率比較低,情況也很複雜,請仔細操作。


2,tomcat

前題準備:

至少2個tomcat、1個apache、 mod_jk(如果apache的module中有,就不用去官網下了)

端口配置

apache端口 8889(該死的80屏蔽了半天,停了幾個都busy,直接改掉80端口)

tomcat1   SHUTDOWN:8085   ip:8080   ajp:8009

tomcat2   SHUTDOWN:8285   ip:8280   ajp:8209

 

實行步驟

1在apache的conf中 建立 workers.properties 配置文件,內容如下

worker.list = controller,tomcat1,tomcat2  #server 列表
#========tomcat1========
worker.tomcat1.port=8009         
#ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat1.host=localhost  
#tomcat的主機地址,如不爲本機,請填寫ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor =   
#server的加權比重,值越高,分得的請求越多

#========tomcat2========
worker.tomcat2.port=8209     
#ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat2.host=localhost  
#tomcat的主機地址,如不爲本機,請填寫ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 

#server的加權比重,值越高,分得的請求越多
#========controller,負載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2   #指定分擔請求的tomcat
worker.controller.sticky_session=1

 

2.在apache的conf中 建立  mod_jk.conf 配置文件

內容如下:

#加載mod_jk Module(這裏因爲我安裝的apache中的module下已經有mod_jk了
LoadModulejk_module modules/mod_jk.so

#指定 workers.properties文件路徑
JkWorkersFile conf/workers.properties
#指定那些請求交給tomcat處理,"controller"爲在workers.propertise裏指定的負載分配控制器
JkMount /*.jsp controller

 

3在apache中的conf中httpd.conf配置文件最後導入mod_jd.conf配置文件,

內容如下

Include conf/mod_jk.conf

 

整個負載配置完成,變動的主要是apache下面的3個配置文件,有2個是新增的

 
 

 測試

我在2個tomcat的root下都弄了個1.jsp

<%
 System.out.println("++++++++++++++++++++=");
%>

啓動2個tomact

訪問apache整合的地址http://127.0.0.1:8889/1.jsp(因爲我把一直busy的80端口改爲8889了)

多訪問幾次看tomact運行如下

 

可以看出2個tomact都均衡運行

這裏只是在win7下模擬,正常情況下,一般是在linux環境下,同理把只是要下載linux下的mo_jk.so,tar.gz包,安裝肯定也要安裝linux下的apache,等下次弄個linux環境再測試下

3,was

1、F5組網規劃
(1)組網拓樸圖(具體到網絡設備物理端口的分配和連接,服務器網卡的分配與連接)
(2)IP地址的分配(具體到網絡設備和服務器網卡的IP地址的分配)
(3)F5上業務的VIP、成員池、節點、負載均衡算法、策略保持方法的確定
2、F5配置前的準備工作
(1)版本檢查
f5-portal-1:~# b version 
Kernel:
BIG-IP Kernel 4.5PTF-07 Build18 
(2)時間檢查--如不正確,請到單用戶模式下進行修改
f5-portal-1:~# date
Thu May 20 15:05:10 CST 2004 
(3)申請license--現場用的F5都需要自己到F5網站上申請license
3、F5 的通用配置
(1)在安全要求允許的情況下,在setup菜單中可以打開telnet及ftp功能,便於以後方便維護
(2)配置vlan unique_mac選項,此選項是保證F5上不同的vlan 的MAC地址不一樣。在缺省情況下,F5的各個vlan的MAC地址是一樣的,建議在配置時,把此項統一選擇上。可用命令ifconfig –a來較驗 
具體是system/Advanced Properties/vlan unique_mac
(3) 配置snat  any_ip選項選項,此選項爲了保證內網的機器做了snat後,可以對ping的數據流作轉換。Ping是第三層的數據包,缺省情況下F5是不對 ping的數據包作轉換,也就是internal vlan的主機無法ping external  vlan的機器。(注意:還可以採用telnet來驗證。) 
具體是system/Advanced Properties/snat any_ip
4、F5 的初始化配置
建議在對F5進行初始時都用命令行方式來進行初始化(用Web頁面初始化的方式有時會有問題)。登錄到命令行上,運行config或setup命令可以進行初始化配置。初次運行時會提示一些license的信息。
default:~# config 
5、F5雙機切換監控配置(有F5雙機時需要)
(1)在web頁面中選擇相應的vlan,在arm failsafe選擇則可。Timeout爲從F5收不到包的時間起,經過多長時間就發生切換。此配置不能同步,需要在F5的主備機上同時配置。每個vlan都可以配置vlan arm failsafe。
具體在Network下
(2)在web頁面中選擇system,在redundant properties中把gateway failsafe選擇則可。Router是需要監控的地址。此配置不能同步,需要在F5的主備機上同時配置。一套F5上只能配置一個gateway failsafe
具體在system/redundant properties/gateway failsafe
6、F5 MAC masquerade配置
Mac Masquerading是F5的Shared IP Address (Floating)的MAC地址,F5如果不配置此項,則shared IP Address的MAC地址與每臺F5的vlan self IP Address的MAC地址是一樣的。
一般服務器是以shared IP Address爲網關,在兩臺F5上都配置了Mac Masquerade(相同的MAC地址),這樣當F5發生切換後,服務器上shared IP address的MAC不變,保證了業務的不中斷
具體在Network下
7、F5的pool配置
(1)在配置工具Web頁面的導航面板中選擇“Pools”中的“Pools”標籤,點擊“ADD”按鈕添加服務器池(Pool)。
(2)在池屬性(Pool Properties)中的“Load Balancing Method”表格中選擇負載均衡策略,通常採用默認策略:“Round Robin” 
(3)在“Resouces”表格中的“Member Address”文本框輸入成員IP地址,在“Service”文本框中輸入服務端口,點擊“>>”添加到“Current Members”當前成員列表中。
(4)添加所有組成員,點擊“Done”完成配置。 
(5)在“Pools”中的“Pool Name”列選中特定池,然後池屬性頁面中選擇“Persistence”標籤。 
(6)在“Persistence Type”表格中選定會話保持類型。點擊“Apply”應用配置。 
8、F5的virtual server配置
(1)在配置工具Web頁面的導航面板中選擇“Virtual Servers”中的“Virtual Servers”標籤,點擊“ADD”按鈕添加虛擬服務器。 
(2)在“Add Virtual Server”窗口的“Address”文本框中輸入虛擬服務器IP地址,並在“Service”文本框中輸入服務端口號或在下拉框中選擇現有的服務名稱,點擊“Next”執行下一步。 
(3) 在“Add Virtual Server”窗口的“Configure Basic Properties”頁面中點擊“Next”執行下一步。  在“Add Virtual Server”窗口的“Select Physical  Resources”頁面中點擊單選按鈕“Pool”,並在下拉框中選擇虛擬服務器對應的負載均衡池。 
(4)按“Done”完成創建虛擬服務器。 
9、F5的monitor的配置
(1)在配置工具Web頁面的導航面板中選擇“Monitor”中的“Monitors”標籤,點擊“ADD”按鈕添加監控
(2)根據需要選擇相關關聯類型:“Node Associations”標籤、Node Address Associations”標籤、Service Associations”標籤。
(3)被選關聯標籤中,在“Choose Monitor”表格中選擇監控名稱,點擊“>>”按鈕添加到“Monitor Rule”監控規格文本框中。監控規則可以爲一條或多條。
(4)選擇監控規則後,在對應節點的“Associate Current Monitor Rule”複選框中選中。如果欲刪除監控關聯,則選中對應節點的“Delete Existing Assocation”複選框。
(5)點擊“Apply”關聯監控
10、F5的SNAT配置
(1)在配置工具Web頁面的導航面板中選擇“NATs”中的“SNATs”標籤,點擊“ADD”按鈕添加SNAT地址。 
(2) 在“Add SNAT”窗口中“Translation Address”的“IP”文本框中輸入SNAT IP地址,並在“Origin  List”的“Origin Address”文本框中輸入節點IP地址或在“Origin  VLAN”下拉框中選擇VLAN名稱,點擊“>>”加入“Current List”列表。 
(3)按“Done”完成添加SNAT IP地址。 
11、F5主備機同步及切換校驗
具體在system/Redundant Properties/synchonize Config...
12、業務的校驗
F5主備機切換的校驗
F5主備機業務運行的校驗
其中1~6是基本配置,7~10業務配置,11~12校驗
二、F5負載均衡器的維護

1、F5節點及應用的檢查
通過“System -> Network Map”頁面查看節點及應用狀態
綠色:節點或虛擬服務器爲“UP”
紅色:節點或虛擬服務器狀態爲“Down”
灰色:節點或虛擬服務器被禁用
2、日誌的檢查
(1)當天日誌:從web上查看logs中的system log、bigip log、monitor log,看日誌中是否有異常。 
(2)7天內的日誌
系統日誌文件 - /var/log/messages消息, 系統消息
BIG-IP 日誌文件 - /var/log/bigip
“External” BIG-IP events
Monitor 日誌文件 - /var/log/bigd
“Internal” BIG-IP Events
3DNS 日誌文件 - /var/log/3dns
3DNS Information
用gzcat、more、vi命令打開
3、F5流量的檢查
(1)業務上的基本維護主要是在F5上查看F5分發到各節點的connect是否負載均衡,一般不應有數量級的差別
(2)通過WEB->pool-> pool statistics中查看connection項中的total和current項,不應有明顯的數量級的差別
(3)F5 qkview命令
執行qkview,執行完成後將輸出信息保存在文件“/var/tmp/-tech.out”中,供高級技術支持用
(4)F5 tcpdump命令
TCPDUMP是Unix系統常用的報文分析工具,TCPDUMP經常用於故障定位,如會話保持失效、SNAT通信問題等
tcpdump [ -adeflnNOpqRStvxX ] [ -c count ] [ -F file ]
[ -i interface ] [ -m module ] [ -r file ]
[ -s snaplen ] [ -T type ] [ -w file ]
[ -E algo:secret ] [ expression ]

是不是用F5做負載均衡器比用edge容易丟session,我 們這裏的環境是WAS6.0.2for redhat  linux。兩臺機器做cluster,cluster中有四個成員,勻設置了Memory-to-Memory的內存複製功能。每臺機器上兩個。前端沒 用用edge,而是用F5做的負載均衡器,出現session丟失現象。 

不知道是不是和F5有關係,還是WAS本身少了那些配置沒做,謝謝! 


f5裏有設置可以保持會話親緣性。默認是不保持的

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