On 05.01.2010 09:44, LiuYan 刘研 wrote:
I'm currently learning Tomcat clustering these days.
I setup 4 Tomcat-6.0.22 instances in Windows XP: server1, server2, server3,
server4
cluster1: server1& server2 (228.0.0.4:45564)
cluster2: server3& server4 (228.0.0.4:45566)
Apache/2.2.14(win32) is the frontend. mod_jk-1.2.28 is the connector between
Apache and Tomcats.
Start tomcats, start apache, then I visit
http://localhost/tomcatClusterTest/session-test.jsp 4 times, then I saw each
tomcat server got a request.
What I expected is: server1 should get request #1,#3. server2 should get
request #2,#4. server3 and server4 should get no request because they are
another cluster and so they do not have the session which is created at
server1.
I read the comments of "Bug 32317 - Making mod_jk replication aware
(Clustering Support)" from here
https://issues.apache.org/bugzilla/show_bug.cgi?id=32317
I saw the following comment in bug description:
-------------------------------------------------------------------------------
- without stickyness to decide to which workers an existing session is
allowed to be balanced (all workers with the same domain as the worker given
in
the session id)
No, in the current implementation domains are only used if the lb worker
is configured to use sticky sessions (default).
-------------------------------------------------------------------------------
The comment is what I expected, but the test result is unexpected: server3&
server4 which belongs another domain/cluster are picked.
Is it a bug or I misunderand the meaning of the comment above?
workers.properties:
#-------------------------------------------------------------------------------
worker.list=LoadBalancer
worker.LoadBalancer.type=lb
worker.LoadBalancer.balance_workers=server1,server2,server3,server4
worker.LoadBalancer.sticky_session=false
Use sticky sessions. Even when doing cluster session replication,
stickyness is usually better. Cluster+sticky only relies on the correct
replication if a node breaks.
worker.server1.host=localhost
worker.server1.port=8109
worker.server1.type=ajp13
worker.server1.lbfactor=1
worker.server1.domain=cluster1
worker.server2.host=localhost
worker.server2.port=8209
worker.server2.type=ajp13
worker.server2.lbfactor=1
worker.server2.domain=cluster1
worker.server3.host=localhost
worker.server3.port=8309
worker.server3.type=ajp13
worker.server3.lbfactor=1
worker.server3.domain=cluster2
worker.server4.host=localhost
worker.server4.port=8409
worker.server4.type=ajp13
worker.server4.lbfactor=1
worker.server4.domain=cluster2
#-------------------------------------------------------------------------------
httpd.conf
#-------------------------------------------------------------------------------
JkMount /tomcatClusterTest/* LoadBalancer
#...
#-------------------------------------------------------------------------------
session-test.jsp
-------------------------------------------------------------------------------
<%@ page contentType='text/html' pageEncoding='GBK' %>
<pre style='font-size: 12px;'>
<%
String sUserName=(String)session.getAttribute ("username");
Integer oRequestCounter=(Integer)session.getAttribute ("request counter");
int iRequestCounter = oRequestCounter!=null ? oRequestCounter.intValue() :
0;
iRequestCounter ++;
session.setAttribute ("request counter", Integer.valueOf(iRequestCounter));
java.sql.Timestamp oSessionCreatedTime = new
java.sql.Timestamp(session.getCreationTime());
java.sql.Timestamp oSessionLastAccessedTime = new
java.sql.Timestamp(session.getLastAccessedTime());
String sSessionID = session.getId ();
java.sql.Timestamp currentTimestamp=new
java.sql.Timestamp(System.currentTimeMillis());
String sInfo =
"-------------------------------------------\n" +
"Request: # " +iRequestCounter + "\n" +
" Time: " + currentTimestamp + "\n" +
"Session:\n" +
" ID " + sSessionID + "\n" +
" Created " + oSessionCreatedTime + "\n" +
" Accessed " + oSessionLastAccessedTime + "\n" +
" Attribute: username = " + sUserName + "\n" +
" Attribute: request counter = " + session.getAttribute ("request
counter") + "\n" +
""
;
System.out.println (sInfo);
out.println (sInfo);
if (sUserName==null)
{
session.setAttribute ("username", "MyName "+new
java.sql.Time(System.currentTimeMillis()));
}
%>
</pre>
-------------------------------------------------------------------------------
My test result:
server1:
-------------------------------------------
Request: # 1
Time: 2010-01-05 16:01:10.687
Session:
ID 7E5BAD3313EF518C189B1237E7475D74.server1
Created 2010-01-05 16:01:10.687
Accessed 2010-01-05 16:01:10.687
Attribute: username = null
Attribute: request counter = 1
server2:
-------------------------------------------
Request: # 2
Time: 2010-01-05 16:01:12.828
Session:
ID 7E5BAD3313EF518C189B1237E7475D74.server2
Created 2010-01-05 16:01:10.687
Accessed 2010-01-05 16:01:10.687
Attribute: username = MyName 16:01:10
Attribute: request counter = 2
server3:
-------------------------------------------
Request: # 1
Time: 2010-01-05 16:01:14.343
Session:
ID 46F2C9DA30599FF835358D50682E7583.server
Created 2010-01-05 16:01:14.343
Accessed 2010-01-05 16:01:14.343
Attribute: username = null
Attribute: request counter = 1
server4:
-------------------------------------------
Request: # 2
Time: 2010-01-05 16:01:15.0
Session:
ID 46F2C9DA30599FF835358D50682E7583.server4
Created 2010-01-05 16:01:14.343
Accessed 2010-01-05 16:01:14.359
Attribute: username = MyName 16:01:14
Attribute: request counter = 2
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]