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: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to