茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1672039 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
F09_177.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2016/7/14 9:27:20
貼一個集群的配置說明,感覺這個寫的具體
對於WEB應用集群的技術實現而言,最大的難點就是如何能在集群中的多個節點之間保持數據的一致性,會話(Session)信息是這些數據中最重要的一塊。要實現這一點,大體上有兩種方式,一種是把所有Session數據放到一台服務器上或者數據庫中,集群中的所有節點通過訪問這台Session服務器來獲取數據;另一種就是在集群中的所有節點間進行Session數據的同步拷貝,任何一個節點均保存了所有的Session數據。兩種方式都各有優點,第一種方式簡單、易於實現,但是存在著Session服務器發生故障會導致全系統不能正常工作的風險;第二種方式可靠性更高,任一節點的故障不會對整個系統對客戶訪問的響應產生影響,但是技術實現上更複雜一些。常見的平台或中間件如microsoft asp.net和IBM WAS都會提供對兩種共享方式的支持,tomcat也是這樣,但是一般採用第二種方式。

集群說明:
1. 負載均衡(Load Balance):當同一客戶端發起一個請求時,apache始終將請求轉發到同一個節點 (sticky session),當另一個客戶端或同一客戶端從一個新的瀏覽器窗口發起請求時,apache會把請求分發到另一節點 上,依次輪詢,當然,可以在apache上設置後端tomcat的分發權重。從而達到負載均衡的效果。
2. 高可用(High availablity):當其中一台tomcat server 突然crash時,apache會將這在進行的請求分發到集群中其他tomcat server上,由於集群member 之間已經session replication,所以原來的session 會在另外一節點上繼續進行,此時,請求已發生了無縫轉移,在客戶端完全感覺不到故障已發生。
* Tomcat 通過SimpleTcpcluster類進行基於內存的會話複製(in-memory replication)。Tomcat Cluster 通過組播(心跳包)方式決定組成員關係(通過TCP協議進行數據傳輸和其他交流),每一個節點在啟動時和運行時都會有規律地(默認500毫秒)發送組播心跳包,同一個Cluster內的節點會在相同的組播地址和端口監聽這些信息;在一定的dropTime內(默認3S)不發送組播報的節點就會被認為是死去並被從cluster刪去;Session replication 請求和session 更新通過直接TCP 連接在cluster成員間傳送,也就是說當replication session 時,節點會生成一個直接向其他節點的TCP連接。

配置:

1.Apache的配置
Listen 8051
<VirtualHost *:8051>
   ServerAdmin root@99bill.com
   ServerName  localhost
   ServerAlias localhost
   ProxyPass /myweb  balancer://cluster/myweb stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=5 maxattempts=3
   ProxyPassReverse  / balancer://cluster
   ProxyRequests Off
   ProxyPreserveHost On
   ErrorLog "logs/tctest_error.log"
   CustomLog  "logs/tctest_access.log" commmon
<proxy balancer://cluster>
BalancerMember ajp://192.168.55.229:8009 route=jvm_a
BalancerMember ajp://192.168.55.231:8009 route=jvm_b
</proxy>
</VirtualHost>

Tomcat會在創建session時會根據根據jvmRoute的值在sessionID後面追加route值(接下來將要配置),例如167A7621C8ACEF496A0E3D7720F7C35E.jvm1。客戶端訪問時,如果是已建立的session,有route值,apache就sticky session,使該請求一直分發到上次訪問的tomcat server上,如果是第一次請求則根據既定規則分發。

2.Tomcat的配置

2-1.修改server.xml
分別修改為:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm_a">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm_b">

2-2 在server.xnml的 之間添加
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
       channelSendOptions="8">
      <Manager className="org.apache.catalina.ha.session.DeltaManager"
       expireSessionsOnShutdown="false"
       notifyListenersOnReplication="true"/>

Manager用來在節點間拷貝Session,默認使用DeltaManager,DeltaManager採用的一種all-to-all的工作方式,即集群中的節點會把Session數據向所有其他節點拷貝,而不管其他節點是否部署了當前應用。當集群中的節點數量很多並且部署著不同應用時,可以使用BackupManager,BackManager僅向部署了當前應用的節點拷貝Session。但是到目前為止BackupManager並未經過大規模測試,可靠性不及DeltaManager。
       <Channel className="org.apache.catalina.tribes.group.GroupChannel">
       <MemberShip className="org.apache.catalina.tribes.membership.McastService"
                   address="228.0.0.4"
                   port="45564"
                   frequency="500"
                   droptTime="3000"/>

Membership用於發現集群中的其他節點,這裡的address用的是組播地址使用同一個組播地址和端口的多個節點同屬一個子集群,因此通過自定義組播地址和端口就可將一個大的tomcat集群分成多個子集群。
       <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                 address="auto"
                 port="4000"
                 autoBind="100"
                 seceltorTimeout="5000"
                 maxThreads="6"/>

receiver用於各個節點接收其他節點發送的數據,在默認配置下tomcat會從4000-4100間依次選取一個可用的端口進行接收,自定義配置時,如果多個tomcat節點在一台物理服務器上注意要使用不同的端口。
       <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
       <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
       </Sender>

Sender用於向其他節點發送數據,具體實現通過Transport配置
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
      </Channel>

Channel 是一個抽像的端口,和socket類似,集群member通過它收發信息。
      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>

Valve用於在節點向客戶端響應前進行檢測或進行某些操作,ReplicationValve就是用於檢測當前的響應是否涉及Session數據的更新,如果是則啟動Session拷貝操作,filter用於過濾請求,如客戶端對圖片,css,js的請求就不會涉及Session,因此不需檢測,默認狀態下不進行過濾,監測所有的響應。
在生產環境中使用以下選項:
<Valve className=」org.apache.catalina.ha.tcp.ReplicationValve」
filter=」.*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;」/>

即當對靜態頁面圖片等訪問時不進行session replication。
      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

設置此選項是,當一個節點crash時,訪問跳到另一個節點,此時session ID 會將jvmRoute值和以前的session Id 綁定在一起想·
      <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>

2-3.修改webapps/myweb/WEN-INF/web.xml
添加 標籤
即只在之間添加
<distributable/>

2-4.在weapps創建一個測試應用myweb(此次試驗可以直接cp –rf examples myweb)
修改index.jsp 為以下內容:
Tomcat_a:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<%
  //HttpSession session = request.getSession(true);
  System.out.println(session.getCreationTime());
  out.println("<br> SESSION ID:" + session.getId()+"<br>";
  out.println("Session serviced by master"+"<br>";
  out.println("Session created time is :"+session.getCreationTime()+"<br>";
%>
</body>
</html>

(訪問時是會顯示session ID ,server name,session 創建的時間,格式如下:)
=============================================================
=============================================================

Tomcat_b:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<%
  //HttpSession session = request.getSession(true);
  System.out.println(session.getCreationTime());
  out.println("<br> SESSION ID:" + session.getId()+"<br>";
  out.println("Session serviced by node2"+"<br>";
  out.println("Session created time is :"+session.getCreationTime()+"<br>";
%>
</body>
</html>

(訪問時是會顯示session ID ,server name,session 創建的時間,格式如下:)
Note :1、如果用的兩台server,必須保證兩台機器的時間是完全同步的,用ntp服務器同步。
2、設置hostname並修改/etc/hosts文件
Jul 7, 2011 12:53:38 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance
in production environments was not found on the java.library.path:
/usr/local/jdk1.6.0_05/jre/lib/amd64/server:/usr/local/jdk1.6.0_05/jre/lib/amd64:/usr/local/jdk1.6.0_05/jre/../lib/amd64:/usr/java/packages/lib/amd64:/lib:/usr/lib
Jul 7, 2011 12:53:38 PM org.apache.tomcat.util.digester.Digester endElement
WARNING:   No rules found matching 'Server/Service/Engine/Cluster/Channel/MemberShip'.
Jul 7, 2011 12:53:38 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Cluster/Channel/Receiver} Setting property 'seceltorTimeout' to '5000' did not find a matching property.
Jul 7, 2011 12:53:38 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Jul 7, 2011 12:53:38 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 778 ms
Jul 7, 2011 12:53:38 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Jul 7, 2011 12:53:38 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.30
Jul 7, 2011 12:53:38 PM org.apache.catalina.ha.tcp.SimpleTcpCluster start
INFO: Cluster is about to start
Jul 7, 2011 12:53:38 PM org.apache.catalina.tribes.transport.ReceiverBase bind
INFO: Receiver Server Socket bound to:/192.168.55.231:4000
Jul 7, 2011 12:53:38 PM org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
INFO: Setting cluster mcast soTimeout to 500
Jul 7, 2011 12:53:38 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
Jul 7, 2011 12:53:38 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 229}:4000,{192, 168, 55, 229},4000, alive=147616,id={-115 -53 23 90 -40 -79 74 -54 -90 115 -116 85 81 -106 51 73 }, payload={}, command={}, domain={}, ]
Jul 7, 2011 12:53:38 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 231}:4001,{192, 168, 55, 231},4001, alive=8077,id={90 53 3 75 21 83 64 89 -74 -72 34 -92 -19 -97 93 12 }, payload={}, command={}, domain={}, ]
Jul 7, 2011 12:53:39 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:4
Jul 7, 2011 12:53:39 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 231}:4000,{192, 168, 55, 231},4000, alive=1008,id={-15 24 -37 103 96 125 77 20 -79 -51 38 52 38 101 -128 -108 }, payload={}, command={}, domain={}, ]
Jul 7, 2011 12:53:39 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
Jul 7, 2011 12:53:39 PM org.apache.catalina.tribes.io.BufferPool getBufferPool
INFO: Created a buffer pool with max size:104857600 bytes of typerg.apache.catalina.tribes.io.BufferPool15Impl
Jul 7, 2011 12:53:40 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:8
Jul 7, 2011 12:53:40 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor host-manager.xml
Jul 7, 2011 12:53:40 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor manager.xml
Jul 7, 2011 12:53:41 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory moni2
Jul 7, 2011 12:53:41 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/apache-tomcat-6.0.30/webapps/moni2/WEB-INF/lib/j2ee.jar) -
jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jul 7, 2011 12:53:41 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/apache-tomcat-6.0.30/webapps/moni2/WEB-INF/lib/servlet-api-2.4.jar) -
jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jul 7, 2011 12:53:41 PM org.apache.catalina.ha.session.DeltaManager start
INFO: Register manager /moni2 to cluster element Engine with name Catalina
Jul 7, 2011 12:53:41 PM org.apache.catalina.ha.session.DeltaManager start
INFO: Starting clustering manager at /moni2
Jul 7, 2011 12:53:41 PM org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
WARNING: Manager [localhost#/moni2], requesting session state from org.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 229}:4000,{192, 168, 55, 229},4000, alive=150126,id={-115 -53 23 90 -40 -79 74 -54 -90 115 -116 85 81 -106 51 73 }, payload={}, command={}, domain={}, ].
This operation will timeout if no session state has been received within 60 seconds.
Jul 7, 2011 12:53:41 PM org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
INFO: Manager [localhost#/moni2]; session state send at 7/7/11 12:53 PM received in 113 ms.0.30
Jul 7, 2011 12:55:24 PM org.apache.catalina.ha.tcp.SimpleTcpCluster start
INFO: Cluster is about to start
Jul 7, 2011 12:55:24 PM org.apache.catalina.tribes.transport.ReceiverBase bind
INFO: Receiver Server Socket bound to:/192.168.55.231:4000
Jul 7, 2011 12:55:24 PM org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
INFO: Setting cluster mcast soTimeout to 500
Jul 7, 2011 12:55:24 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
Jul 7, 2011 12:55:24 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 231}:4001,{192, 168, 55, 231},4001, alive=114038,id={90 53 3 75 21 83 64 89 -74 -72 34 -92 -19 -97 93 12 }, payload={}, command={}, domain={}, ]
Jul 7, 2011 12:55:25 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 229}:4000,{192, 168, 55, 229},4000, alive=254053,id={-115 -53 23 90 -40 -79 74 -54 -90 115 -116 85 81 -106 51 73 }, payload={}, command={}, domain={}, ]
Jul 7, 2011 12:55:25 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:4
Jul 7, 2011 12:55:25 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
Jul 7, 2011 12:55:25 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 231}:4000,{192, 168, 55, 231},4000, alive=1007,id={-105 -85 -108 -38 -90 97 71 126 -124 -104 86 -113 42 -65 -116 85 }, payload={}, command={}, domain={}, ]
Jul 7, 2011 12:55:25 PM org.apache.catalina.tribes.io.BufferPool getBufferPool
INFO: Created a buffer pool with max size:104857600 bytes of typerg.apache.catalina.tribes.io.BufferPool15Impl
Jul 7, 2011 12:55:26 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:8
Jul 7, 2011 12:55:26 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor host-manager.xml
Jul 7, 2011 12:55:26 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor manager.xml
Jul 7, 2011 12:55:27 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory moni2
Jul 7, 2011 12:55:27 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/apache-tomcat-6.0.30/webapps/moni2/WEB-INF/lib/j2ee.jar) -
jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jul 7, 2011 12:55:27 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/usr/local/apache-tomcat-6.0.30/webapps/moni2/WEB-INF/lib/servlet-api-2.4.jar) -
jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jul 7, 2011 12:55:27 PM org.apache.catalina.ha.session.DeltaManager start
INFO: Register manager /moni2 to cluster element Engine with name Catalina
Jul 7, 2011 12:55:27 PM org.apache.catalina.ha.session.DeltaManager start
INFO: Starting clustering manager at /moni2
Jul 7, 2011 12:55:27 PM org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
WARNING: Manager [localhost#/moni2], requesting session state from org.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 229}:4000,{192, 168, 55, 229},4000, alive=256061,id={-115 -53 23 90 -40 -79 74 -54 -90 115 -116 85 81 -106 51 73 }, payload={}, command={}, domain={}, ].
This operation will timeout if no session state has been received within 60 seconds.
Jul 7, 2011 12:55:27 PM org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
INFO: Manager [localhost#/moni2]; session state send at 7/7/11 12:55 PM received in 113 ms.
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
Jul 7, 2011 12:55:28 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory examples
Jul 7, 2011 12:55:28 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
Jul 7, 2011 12:55:28 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory myweb
Jul 7, 2011 12:55:28 PM org.apache.catalina.ha.session.DeltaManager start
INFO: Register manager /myweb to cluster element Engine with name Catalina
Jul 7, 2011 12:55:28 PM org.apache.catalina.ha.session.DeltaManager start
INFO: Starting clustering manager at /myweb
Jul 7, 2011 12:55:28 PM org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
WARNING: Manager [localhost#/myweb], requesting session state from org.apache.catalina.tribes.membership.MemberImpl
[tcp://{192, 168, 55, 229}:4000,{192, 168, 55, 229},4000, alive=257568,id={-115 -53 23 90 -40 -79 74 -54 -90 115 -116 85 81 -106 51 73 }, payload={}, command={}, domain={}, ].
This operation will timeout if no session state has been received within 60 seconds.
Jul 7, 2011 12:55:28 PM org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
INFO: Manager [localhost#/myweb]; session state send at 7/7/11 12:55 PM received in 104 ms.
Jul 7, 2011 12:55:28 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory ROOT
Jul 7, 2011 12:55:28 PM org.apache.catalina.ha.session.JvmRouteBinderValve start
INFO: JvmRouteBinderValve started
Jul 7, 2011 12:55:28 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Jul 7, 2011 12:55:28 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Jul 7, 2011 12:55:28 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/20  config=null
Jul 7, 2011 12:55:28 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 4309 ms

信息顯示:已將node-2加入組成員中

測試
1.在瀏覽器中輸入:
說明訪問的是tomcat_a這台server
cat /usr/local/apache-tomcat-6.0.30/logs/ localhost.2011-07-07.log

可以看到以下信息:
Jul 7, 2011 12:55:30 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: sessionDestroyed('1260F261596C49A76141FA3949F0E02B.jvm_a')

表明session replication 成功。

2.模仿事故
把tomcat_a這台機器先停掉,不停的刷新瀏覽器,則頁面一直為:
說明session ID 和 session 創建時間沒變,而jvmRoute 和tomcat Server變了,試驗成功。

原文出處:笔记-tomcat的Host配置 - 分布式系统架构-炼数成金-Dataguru专业数据分析社区
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|