Chinaunix首页 | 论坛 | 博客
  • 博客访问: 529678
  • 博文数量: 135
  • 博客积分: 3568
  • 博客等级: 中校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-19 17:52
文章分类

全部博文(135)

文章存档

2012年(29)

2011年(41)

2010年(26)

2009年(12)

2008年(9)

2007年(12)

2006年(6)

分类: Java

2011-06-20 20:21:58

对集群,负载均衡没啥概念都,做个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,在文件末尾追加以下配置。
  1. LoadModule jk_module modules/mod_jk.so
  2. <IfModule jk_module>
  3. JkWorkersFile conf/workers.properties
  4. # 共享内存的文件名,仅在Unix平台上可用。它被balancer 和 status worker 使用。
  5. # 此值只允许出现一次,它必须配置在全局配置中。
  6. # 默认值:logs/jk-runtime-status
  7. # JkShmFile /var/log/httpd/mod_jk.shm

  8. # 配置URI 与 Tomcat Worker之间的映射关系的文件,一般被称为 uriworkermap.properties
  9. # 无默认值。
  10. JkMountFile conf/uriworkermap.properties
  11. # 文件多长时间被检查一次(单位:秒,默认值:60)
  12. # 如果被设置为0,则禁止重新加载
  13. JkMountFileReload 60

  14. # 日志文件,默认值:logs/mod_jk.log
  15. JkLogFile logs/mod_jk.log
  16. JkLogLevel info
  17. JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
  18. </IfModule>
Step 5. 追加 ${HTTPD_HOME}/conf/workers.properties,内容如下:
  1. #-----------------------环境变量
  2. # <variable_name>=<value>

  3. #-----------------------全局变量
  4. worker.list = status, lb
  5. worker.maintain = 60

  6. #-----------------------状态Worker
  7. worker.status.type = status

  8. #-----------------------负载均衡Worker
  9. worker.lb.type = lb
  10. worker.lb.balance_workers = tomcatA, tomcatB
  11. worker.lb.sticky_session = True
  12. #worker.lb.method = S

  13. #-----------------------工作Worker
  14. worker.tomcatA.type = ajp13
  15. worker.tomcatA.host = localhost
  16. worker.tomcatA.port = 8009
  17. worker.tomcatA.lbfactor = 1

  18. worker.tomcatB.reference=worker.tomcatA
  19. worker.tomcatB.port=18009
Step 6. 追加 ${HTTPD_HOME}/conf/uriworkermap.properties,内容如下:
  1. /*=lb
  2. /status=status
Step 7. 配置TomcatA和TomcatB
  > 确保以下代码未被注释掉
  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
  > 配置 jvmRoute
  (注意:jvmRoute的值应当与 workers.properties 中对应的worker的名称相一致)
  (注意:TomcatB中的 jvmRoute的值应当是 "tomcatB")
  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">

Step 8. 在TomcatA和TomcatB中均部署测试应用 me.war
  注意:需要确保在 web.xml 中 有以下配置:
  1. <distributable/>
  说明:这个测试工程中主要有2个测试页面,a.jsp POST提交一个表单,b.jsp则在请求中有提交的值得情况下将其保存到session中,

---------------------------TomcatA和TomcatB均在运行------------------------------------------
Step 9. 启动 tomcatA、启动 tomcatB、启动 apache

Step 10.
> 访问 ,输入"zhang3"并提交,结果画面显示:
浏览器窗口1:
  1. cur path = [E:\tomcat_A\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@ebcdbb], session id = [2008CF3A871064B75A195F10B90D6C83.tomcatA]
  3. cur user = [zhang3]
> 单独打开另外一个浏览器窗口,再次访问 ,输入"li4"并提交,结果画面显示:
浏览器窗口2:
  1. cur path = [E:\tomcat_B\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@1be16f5], session id = [0A343796DC7DB9B8E606E86F6A335507.tomcatB]
  3. cur user = [li4]


---------------------------仅TomcatB在运行------------------------------------------
Step 11. 停止tomcatA

Step 12. 分别在点击 Step 10中两个页面上的“refresh”链接,结果分别如下:
浏览器窗口1:
  1. cur path = [E:\tomcat_B\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@fb6354], session id = [2008CF3A871064B75A195F10B90D6C83.tomcatB]
  3. cur user = [zhang3]
浏览器窗口2:
  1. cur path = [E:\tomcat_B\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@1be16f5], session id = [0A343796DC7DB9B8E606E86F6A335507.tomcatB]
  3. cur user = [li4]

---------------------------仅TomcatA在运行------------------------------------------
Step 13. 启动TomcatA,并关闭TomcatB

Step 14. 重复Step 12的操作,结果画面如下:
浏览器窗口1:
  1. cur path = [E:\tomcat_A\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@192a848], session id = [2008CF3A871064B75A195F10B90D6C83.tomcatA]
  3. cur user = [zhang3]
浏览器窗口2:
  1. cur path = [E:\tomcat_A\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@1b0bdc8], session id = [0A343796DC7DB9B8E606E86F6A335507.tomcatA]
  3. cur user = [li4]

---------------------------TomcatA和TomcatB均未运行------------------------------------------
Step 15. 关闭TomcatA

Step 16. 重复Step 12的操作,结果均报:“Service Temporarily Unavailable”

---------------------------重新启动TomcatA------------------------------------------
Step 17. 重启TomcatA

Step 18. 分别在之前的每个浏览器窗口中按F5进行刷新,结果画面如下:(session 未恢复~~~)
浏览器窗口1:
  1. cur path = [E:\tomcat_A\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@81b1fb], session id =[612EF63DB9D4BA8FB0003675DF31FB26.tomcatA]
  3. cur user = [null]
浏览器窗口2:
  1. cur path = [E:\tomcat_A\webapps\me\.]
  2. cur session = [org.apache.catalina.session.StandardSessionFacade@2c35e], session id = [E3CAB95E5B19052AC843B290A047005C.tomcatA]
  3. cur user = [null]

---------------------------------------------------------------------------------
结论:
   在集群的配置下,session通过在各个worker之间复制来保障应用的可靠性,但是如果所有的集群节点均断掉,则由于session未被持久序列化,所以最后一步的再重启之后也无法恢复session了。
PS:在非集群模式下,在Tomcat中,会将session持久序列化到 SESSIONS.ser 中的,然后可以在重启的时候继续以前的session了。
  
Over~~~










阅读(1175) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~