对集群,负载均衡没啥概念都,做个Test吧。
参考:
[Apache+Tomcat负载平衡]me.war.zip Step 1. 准备环境
> 下载并安装 Apache 2.2 (这里是 httpd-2.2.17-win32-x86-openssl-0.9.8o.msi)
> 下载并安装 Tomcat 6.0 (这里是 apache-tomcat-6.0.29.zip),安装2份(TomcatA和TomcatB),
> 下载 tomcat-connectors(这里是 mod_jk-1.2.31-httpd-2.2.3.so)
Step 2. 禁用旧的 mod_jserv (如果有的话)
检查 ${HTTPD_HOME}/conf/httpd.conf,
确保其未加载 mod_jserv,
且指令 ApJServMount 指令也未出现,
而且没有 include tomcat-apache.conf 或 tomcat.conf,这两个文件对于mod_jserv有特别的意义,
但是却与 mod_jk 不兼容。
Step 3. 将mod_jk-1.2.31-httpd-2.2.3.so重命名为mod_jk.so,
并拷贝到 ${HTTPD_HOME}/modules/ 下
Step 4. 修改 ${HTTPD_HOME}/conf/httpd.conf,在文件末尾追加以下配置。
- LoadModule jk_module modules/mod_jk.so
-
<IfModule jk_module>
-
JkWorkersFile conf/workers.properties
-
# 共享内存的文件名,仅在Unix平台上可用。它被balancer 和 status worker 使用。
-
# 此值只允许出现一次,它必须配置在全局配置中。
-
# 默认值:logs/jk-runtime-status
-
# JkShmFile /var/log/httpd/mod_jk.shm
-
-
# 配置URI 与 Tomcat Worker之间的映射关系的文件,一般被称为 uriworkermap.properties
-
# 无默认值。
-
JkMountFile conf/uriworkermap.properties
-
# 文件多长时间被检查一次(单位:秒,默认值:60)
-
# 如果被设置为0,则禁止重新加载
-
JkMountFileReload 60
-
-
# 日志文件,默认值:logs/mod_jk.log
-
JkLogFile logs/mod_jk.log
-
JkLogLevel info
-
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
-
</IfModule>
Step 5. 追加 ${HTTPD_HOME}/conf/workers.properties,内容如下:
- #-----------------------环境变量
-
# <variable_name>=<value>
-
-
#-----------------------全局变量
-
worker.list = status, lb
-
worker.maintain = 60
-
-
#-----------------------状态Worker
-
worker.status.type = status
-
-
#-----------------------负载均衡Worker
-
worker.lb.type = lb
-
worker.lb.balance_workers = tomcatA, tomcatB
-
worker.lb.sticky_session = True
-
#worker.lb.method = S
-
-
#-----------------------工作Worker
-
worker.tomcatA.type = ajp13
-
worker.tomcatA.host = localhost
-
worker.tomcatA.port = 8009
-
worker.tomcatA.lbfactor = 1
-
-
worker.tomcatB.reference=worker.tomcatA
-
worker.tomcatB.port=18009
Step 6. 追加 ${HTTPD_HOME}/conf/uriworkermap.properties,内容如下:
Step 7. 配置TomcatA和TomcatB
> 确保以下代码未被注释掉
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
> 配置 jvmRoute
(注意:jvmRoute的值应当与 workers.properties 中对应的worker的名称相一致)
(注意:TomcatB中的 jvmRoute的值应当是 "tomcatB")
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">
Step 8. 在TomcatA和TomcatB中均部署测试应用 me.war
注意:需要确保在 web.xml 中 有以下配置:
说明:这个测试工程中主要有2个测试页面,a.jsp POST提交一个表单,b.jsp则在请求中有提交的值得情况下将其保存到session中,
---------------------------TomcatA和TomcatB均在运行------------------------------------------
Step 9. 启动 tomcatA、启动 tomcatB、启动 apache
Step 10.
> 访问 ,输入"zhang3"并提交,结果画面显示:
浏览器窗口1:
- cur path = [E:\tomcat_A\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@ebcdbb], session id = [2008CF3A871064B75A195F10B90D6C83.tomcatA]
-
cur user = [zhang3]
> 单独打开另外一个浏览器窗口,再次访问 ,输入"li4"并提交,结果画面显示:
浏览器窗口2:
- cur path = [E:\tomcat_B\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@1be16f5], session id = [0A343796DC7DB9B8E606E86F6A335507.tomcatB]
-
cur user = [li4]
---------------------------仅TomcatB在运行------------------------------------------
Step 11. 停止tomcatA
Step 12. 分别在点击 Step 10中两个页面上的“refresh”链接,结果分别如下:
浏览器窗口1:
- cur path = [E:\tomcat_B\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@fb6354], session id = [2008CF3A871064B75A195F10B90D6C83.tomcatB]
-
cur user = [zhang3]
浏览器窗口2:
- cur path = [E:\tomcat_B\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@1be16f5], session id = [0A343796DC7DB9B8E606E86F6A335507.tomcatB]
-
cur user = [li4]
---------------------------仅TomcatA在运行------------------------------------------
Step 13. 启动TomcatA,并关闭TomcatB
Step 14. 重复Step 12的操作,结果画面如下:
浏览器窗口1:
- cur path = [E:\tomcat_A\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@192a848], session id = [2008CF3A871064B75A195F10B90D6C83.tomcatA]
-
cur user = [zhang3]
浏览器窗口2:
- cur path = [E:\tomcat_A\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@1b0bdc8], session id = [0A343796DC7DB9B8E606E86F6A335507.tomcatA]
-
cur user = [li4]
---------------------------TomcatA和TomcatB均未运行------------------------------------------
Step 15. 关闭TomcatA
Step 16. 重复Step 12的操作,结果均报:“Service Temporarily Unavailable”
---------------------------重新启动TomcatA------------------------------------------
Step 17. 重启TomcatA
Step 18. 分别在之前的每个浏览器窗口中按F5进行刷新,结果画面如下:(session 未恢复~~~)
浏览器窗口1:
- cur path = [E:\tomcat_A\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@81b1fb], session id =[612EF63DB9D4BA8FB0003675DF31FB26.tomcatA]
-
cur user = [null]
浏览器窗口2:
- cur path = [E:\tomcat_A\webapps\me\.]
-
cur session = [org.apache.catalina.session.StandardSessionFacade@2c35e], session id = [E3CAB95E5B19052AC843B290A047005C.tomcatA]
-
cur user = [null]
---------------------------------------------------------------------------------
结论:
在集群的配置下,session通过在各个worker之间复制来保障应用的可靠性,但是如果所有的集群节点均断掉,则由于session未被持久序列化,所以最后一步的再重启之后也无法恢复session了。
PS:在非集群模式下,在Tomcat中,会将session持久序列化到 SESSIONS.ser 中的,然后可以在重启的时候继续以前的session了。
Over~~~
阅读(1176) | 评论(0) | 转发(0) |