Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Application Server  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 求助apache跟tomcat做集群session不同步问题?
lhbdir





发贴: 6
积分: 0
于 2006-06-22 11:00 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
一台apache服务器为apache2.2下载了一个mod_jk2.so放在modules目录下.在配置文件中加入以下两行:
<IfModule !mod_jk.c>
LoadModule jk2_module /usr/local/modules/mod_jk2.so
JkSet config.file /usr/local/conf/workers2.properties
</IfModule>

worker2.properties文件里的内容如下:
[logger]
level=ERROR
[status:status]
[lb:lb]
debug=1
[lb:lb_1]
debug=0

[config:]
file=/usr/local/conf/workers.properties
debug=0
debutEnv=0
[logger.file]
level=ERROR
file=/usr/local/logs/jk2.log

[shm:]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers.
file=/usr/local/logs/shm.file
size=10248576
debug=0
disabled=0

[channel.socket:192.168.2.13:8089]
port=8089
host=192.168.2.13
#info=Ajp13 forwarding over socket
#config first server
lb_factor=10

[ajp13:192.168.2.13:8089]
channel=channel.socket:192.168.2.13:8089
#debug=0

[channel.socket:192.168.2.14:8099]
port=8099
host=192.168.2.14
lb_factor=10

[ajp13:192.168.2.14:8099]
channel=channel.socket:192.168.2.14:8099

[uri:/test/*]
group=status:status

[uri:/jsp-examples/*]

[uri:/*]

[uri:/jkstatus/*]
group=status:status

workers.properties文件里的内容如下:

worker.list = "web,web1,status,loadbalancer"

worker.status.type = "status"

worker.loadbalancer.type = "lb"
worker.loadbalancer.balanced_workers = "web,web1"
worker.loadbalancer.sticky_session = "false"

worker.web.port = "8087"
worker.web.host = "192.168.2.13"
worker.web.type = "ajp13"
worker.web.lbfactor = "1"

worker.web1.port = "8098"
worker.web1.host = "192.168.2.14"
worker.web1.type = "ajp13"
worker.web1.lbfactor = "1"

以上为均衡负载功能以实现可以运作.

两台tomcat服务器中,配置文件如下:

server.xml文件内容如下:
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
<GlobalNamingResources>
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>

<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />

</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8087" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />
<Connector port="8089"
enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" URIEncoding="UTF-8" />

<Engine name="Catalina" defaultHost="localhost" jvmRoute="web" > (注意这里在另一个tomcat上是"web1")
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">

<Context path="/jsp-examples" docBase="/opt/tomcat-55/webapps/jsp-examples" debug="0" reloadable="true" distributable="true" crossContext="true" />
<Context path="" docBase="/opt/tomcat-55/webapps/myapp.com" debug="0" reloadable="true" crossContext="true" distributable="true" />
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>

<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>

<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"/>

<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListenter" />

</Cluster>
</Host>
</Engine>

</Service>

</Server>

jk.properties文件内容为:

handler.list=apr,request,channelJni
channelSocket.port=8089
channelUnix.file=${jkHome}/work/jk2.socket
shm.file=${jkHome}/work/jk2.shm
apr.jniModeSo=inprocess

workers.properties 里的内容为注意这里的文件是tomcat服务器上的不是apache上的,虽然同名)

workers.tomcat_home=/opt/tomcat-55

workers.java_home=/opt/jdk1.5

ps=/

worker.list=ajp12, ajp13

worker.ajp12.port=8007
worker.ajp12.host=localhost
worker.ajp12.type=ajp12
worker.ajp12.lbfactor=1

worker.ajp13.port=8089
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp12, ajp13

worker.inprocess.type=jni

worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar

worker.inprocess.cmd_line=start

worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)lib$(ps)i386$(ps)classic$(ps)libjvm.so

worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr

workers2.properties 里的内容为注意这里的文件是tomcat服务器上的不是apache上的,虽然同名)

[logger]
level=DEBUG

[config:]
file=${serverRoot}/conf/workers2.properties
debug=0
debugEnv=0

[uriMap:]
info=Maps the requests. Options: debug
debug=0

[shm:]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers
file=${serverRoot}/logs/jk2.shm
size=1000000
debug=0
disabled=0

[workerEnv:]
info=Global server options
timing=1
debug=0

[lb:lb]
info=Default load balancer.
debug=0

[lb:lb_1]
info=A second load balancer.
debug=0

[channel.socket:192.168.2.13:8089](这个应该是ajp13端口吧)
info=Ajp13 forwarding over socket
debug=0
tomcatId=192.168..2.13:8089
(这里使用了第二块网卡,内网地址)
[channel.socket:192.168.2.14:8089]
info=A second tomcat instance.
debug=0
tomcatId=192.168.2.14:8089
lb_factor=1
group:lb:lb
group:lb:lb_1
disabled=0

[channel.un:/opt/33/work/jk2.socket]
info=A second channel connecting to localhost:8019 via unix socket
tomcatId=localhost:8019
lb_factor=1
debug=0

[channel.jni:jni]
info=The jni channel, used if tomcat is started inprocess

[status:]
info=Status worker, displays runtime informations

[vm:]
info=Parameters used to load a JVM in the server process
classpath=${TOMCAT_HOME}/bin/tomcat-jni.jar
classpath=${TOMCAT_HOME}/server/lib/commons-logging.jar
OPT=-Dtomcat.home=${TOMCAT_HOME}
OPT=-Dcatalina.home=${TOMCAT_HOME}
OPT=-Xmx128M
disabled=1

[worker.jni:onStartup]
info=Command to be executed by the VM on startup. This one will start tomcat.
class=org/apache/jk/apr/TomcatStarter
ARG=start
disabled=1
stdout=${serverRoot}/logs/stdout.log
stderr=${serverRoot}/logs/stderr.log

[worker.jni:onShutdown]
info=Command to be executed by the VM on shutdown. This one will stop tomcat.
class=org/apache/jk/apr/TomcatStarter
ARG=stop
disabled=1

[uri:/jkstatus/*]
info=Display status information and checks the config file for changes.
group=status:

[uri:127.0.0.1:8003]
info=Example virtual host. Make sure myVirtualHost is in /etc/hosts to test it
alias=myVirtualHost:8003

[uri:127.0.0.1:8003/ex]
info=Example webapp in the virtual host. It'll go to lb_1 ( i.e. localhost:8019 )
context=/ex
group=lb_1

[uri:/examples]
info=Example webapp in the default context.
context=/examples
debug=0

[uri:/examples1/*]
info=A second webapp, this time going to the second tomcat only.
group=lb_1
debug=0

[uri:/examples/servlet/*]
info=Prefix mapping

[uri:/examples/*.jsp]
info=Extension mapping

[uri:/examples/*]
info=Map the whole webapp

[uri:/examples/servlet/HelloW]
info=Example with debug enabled.
debug=10

就这样了,其它的什么都没改过.
我在官方网站上看到,保存在session里的数据要实现序列化不知道这个是不是必须的,因为我们写的formbean基本都没有实现.我们的领导说,跟这个无关,不用实现的,他说tomcat会自动将保存在session里的数据序列化.晕,可我还是在catalina.out里看到这样的异常:
Jun 22, 2006 10:00:14 AM org.apache.catalina.cluster.session.DeltaManager requestCompleted
SEVERE: Unable to serialize delta request for sessionid [31DDA9019DA1D2A4513C7502DB5EF676.web]
java.io.NotSerializableException: com.cc176.utils.Pagination
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1341)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1284)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
at org.apache.catalina.cluster.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:326)
at org.apache.catalina.cluster.session.DeltaRequest.writeExternal(DeltaRequest.java:243)
at org.apache.catalina.cluster.session.DeltaManager.unloadDeltaRequest(DeltaManager.java:331)
at org.apache.catalina.cluster.session.DeltaManager.requestCompleted(DeltaManager.java:747)
at org.apache.catalina.cluster.tcp.ReplicationValve.invoke(ReplicationValve.java:206)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:307)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:385)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
com.cc176.service.impl.BaseManagerImpl@1b51db7

希望高手帮帮我,谢谢了,我已经弄了快一个月没弄好,我想就是序列化问题,可领导都那么说了,我也没办法,希望你们的讨论能让我明白并解决这一问题,谢谢了
各位哥哥姐姐们,谢谢了,谢谢了.再不行我就要被抄了,哎.晕呀!!!!



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-22 15:27 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在支持session复制的时候,放到session里的东西必须序列化。
actionForm是已经支持序列化了的,

只是 com.cc176.utils.Pagination,这个你们写的class 没序列化,

编辑一下这个class的代码,加上 " implements java.io.Serializable".



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
lhbdir





发贴: 6
积分: 0
于 2006-06-23 12:35 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
谢谢你,我让他们把那个类实现序列化了,日志没有异常了.可是还是没有同步呀,在登陆时就是说验证码不正确.


作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-23 12:47 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
那是因为你同时访问的时候,生成验证码的是一个tomcat,登录页面又是一个tomcat,这样导致产生了两个session,所以会有这样的问题,

你在网上搜索一下,凡是用frameset框架访问页面,session复制的时候都容易出这样的问题,有个比较糟糕的解决办法,就是先让用户访问首页,这个页面无框架,然后生成session,这个时候再转向其它页面,这个时候客户端就会通过已经生成的sessionid来对服务器器进行请求,这个时候,就不会再产生新的session了。



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
lhbdir





发贴: 6
积分: 0
于 2006-06-23 13:10 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你现在线吗,我现在把两个tomcat都起来了,你可以访问一下,看看效果帐号和密码我可以给你一个测试用的.不过我感觉我们的程序不像你说的验证码是由另一个tomcat生成的,因为,两个tomcat里发布的应用程序都是一样.
由于轮循级别比较高,所以是第一次请求在第一个tomcat上,当提交时就由第二个tomcat来处理了,所以这样第二个tomcat生成的验证码就跟提交的不一样了,是吗?
你是这个意思吗?
我感觉是这个原因.
还是非常感谢你的.



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-23 13:18 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在线。

如果你愿意提供访问的话,我可以试一下。



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
lhbdir





发贴: 6
积分: 0
于 2006-06-23 13:19 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
网站: www.cc176.com
帐号: linhb@channelcampus.com
密码: lhbdir



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
haibo



CJSDN高级会员


发贴: 322
积分: 71
于 2006-06-23 13:26 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
BTW,bluepure熟悉resin cluster么?想请教一些问题



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-23 13:36 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
刚才访问了一下,你的服务端返回了两个不同的sessionid.

第一次请求重定向之后:

Location: http://www.cc176.com/logon.do;jsessionid=F2000F02FDC2EB5067643D3257B24052.web1
注意,这个是以we1结尾的。

但是此时的session还没复制过去,
结果返回的结果里又产生了新的Sessionid.

Set-Cookie: JSESSIONID=B95CAEB438B8A32461B51AA3D0FE6039.web; Path=/

注意:是以web结尾的。

执行登录操作

Cookie: JSESSIONID=B95CAEB438B8A32461B51AA3D0FE6039.web

user.email=xx&user.pwd=xxx&random_number=0653&Submit=%E7%99%BB%E5%BD%95

这个时候客户端提交上去的sessionid是web结尾的。

但是服务端返回的结果里,又生成了新的sessionid,也就意味着服务端每识别出先前已经产生的session:

Set-Cookie: JSESSIONID=0D2AB9D517AECE7F5448F0AA54AE65A6.web1; Path=/

而且,在访问另外一个页面的时候,还生成了一个新的sessionid.
Set-Cookie: JSESSIONID=1F1821AC324610D8203BAEA698C37096.web; Path=/

并且还有:
Set-Cookie: JSESSIONID=CEC3956B5B1223D17DEE42761C686E2A.web; Path=/

仅仅打开页面执行一次登录,就产生了5个不同的session,
由此可见如果你每使用粘性会话的话,那就是session复制应该没有配置成功。



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:haibo]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-23 13:40 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
resin的没配置过,不过个人认为实现原理大致应该差不多的,有问题的话可以一起探讨,我在家可以配置来摸索看看。apache+tomcat 也是我自己结合资料摸索总结的:)

haibo wrote:
BTW,bluepure熟悉resin cluster么?想请教一些问题



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
lhbdir





发贴: 6
积分: 0
于 2006-06-23 13:41 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
谢谢你,也就是说还是我的配置不是正确的.好的,我再研究下调一调.谢谢你,不过我还想知道一个问题就是,这些会不会跟程序有关.


作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-23 13:46 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思, 刚才没注意你把配置文件贴出来了的

建议:
worker.loadbalancer.sticky_session = "false"
改成
worker.loadbalancer.sticky_session = "true"

这样,粘性会话加session复制就是双保险了。
一般来说,session复制有些得不偿失。

你既然用apache2.2了, 如果可以的话,建议直接使用mod_proxy_balancer和mod_proxy_ajp。

这样的配置方式更简单方便:)



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
bluepure

pureblue



发贴: 509
积分: 85
于 2006-06-23 13:49 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
跟程序有一定的关系,所有session里面的内容改变的时候,

都需要用 session.setAttribute()方法来触发复制同步。

比如:

session.setAttribute("user",user);
user.setName("新名字");
session.setAttribute("user",user);//必须再来这行,才会进行session重新同步user内的内容。



作者 Re:求助apache跟tomcat做集群session不同步问题? [Re:lhbdir]
lhbdir





发贴: 6
积分: 0
于 2006-06-23 14:00 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
好的,太感谢了,我也要学编程,我还是先把这个弄好吧,暂时只能用一个tomcat了.你说的用代理我也会考虑的.不过一试边了,改成true也不好使,我再改其它的吧,但现在不能改了,大家在用,要保证大家正常使用.有时间再向你请教.



flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923