Tomcat的负载均衡(apache的mod_jk来实现)

时间:2021-07-09 14:20:58

 

  
 
 
  1. Tomcat的负载均衡(apache的mod_jk来实现):  
  2.  
  3. 1、基于Apache的mod_jk来实现:  
  4.         apache    
  5.         /    \  
  6.       tom1    tom2  
  7.  
  8. 在完成两台tomcat1,tomcat2的安装之后,希望可以实现负载均衡,使用mod_jk可以实现节点的故障恢复功能,即一个节点出现问题,mod_jk会其不参与负载,在节点故障恢复后,mod_jk会让其参与负载,对此节点是否失败,对用户而言是透明的。  
  9.  
  10. 实现流程:  
  11. a、用户访问数据达到Apache后,如果是静态内容,Apache立即回应;  
  12. b、如果Apache发现用户请求的是动态内容如jsp,就将请求丢给其中的一台tomcat来处理。  
  13. c、每次用户重复访问时,都被分配到同一台机器上(可以做会话粘滞或是会话复制)  
  14.  
  15. 本文环境在之前的基础上新增加一台机器(做负载均衡器),其实负责负载均衡的主要是由一个配置文件完成!那就是workers.propertise。通过定义worker.list,port,host,type,lbfactor的值来定义每一台tomcat的主机;通过lbfactor来区别每台机器的权重,权重数值越大得到的用户请求数就越多。所以,只要重点关注这个文件的内容就行了。  
  16.  
  17. 实施:  
  18. a、安装Aapche  
  19. # tar -xzf httpd-2.2.22.tar.gz  
  20. # chown root.root -R httpd-2.2.22  
  21. # cd httpd-2.2.22  
  22. # ./configure --prefix=/usr/local/apache  
  23. # make && make install  
  24.  
  25. b、编译mod_jk模块  
  26.  
  27. # tar -xzf tomcat-connectors-1.2.32-src.tar.gz   
  28. # cd tomcat-connectors-1.2.32-src  
  29. # cd native/  
  30. #  ./configure --with-apxs=/usr/local/apache/bin/apxs   
  31. # make && make install  
  32. # ll /usr/local/apache/modules/mod_jk.so   
  33. -rwxr-xr-x 1 root root 1076923 Feb 20 14:17 /usr/local/apache/modules/mod_jk.so  
  34.  
  35. c、加载mod_jk  
  36. # vim /usr/local/apache/conf/httpd.conf   
  37. #增加的内容  
  38. LoadModule jk_module modules/mod_jk.so  
  39. JkWorkersFile /usr/local/apache/conf/workers.properties  
  40. JkMountFile   /usr/local/apache/conf/uriworkermap.properties  
  41. JkLogFile /usr/local/apache/logs/mod_jk.log  
  42. JkLogLevel info  
  43. JkLogStampformat "[%a %b %d %H:%M:%S %Y]"  
  44.  
  45. #告诉apache,如何处理相关类形的文件(这几行可要可不要,只要urlworkermap.properties里面有定义也是可以的! :)  
  46. JkMount /* controller  
  47. JkMount /*.jsp  controller  
  48. JkMount /*.action controller  
  49.  
  50.  
  51. # cat /usr/local/apache/conf/workers.properties  
  52. # cat workers.properties   
  53. worker.list=controller 
  54. #========tomcat1========  
  55. worker.tomcat1.port=8009        
  56. worker.tomcat1.host=192.168.10.56    
  57. worker.tomcat1.type=ajp13 
  58. worker.tomcat1.lbfactor = 1     
  59. worker.tomcat12.connection_pool_timeout=750      
  60. worker.tomcat12.socket_keepalive=0      
  61. worker.tomcat12.socket_timeout=3000     
  62. worker.tomcat12.connect_timeout=1000      
  63. worker.tomcat12.reply_timeout=3300   
  64.  
  65. #========tomcat2========  
  66. worker.tomcat2.port=8009       
  67. worker.tomcat2.host=192.168.10.57   
  68. worker.tomcat2.type=ajp13 
  69. worker.tomcat2.lbfactor = 1   
  70. worker.tomcat12.connection_pool_timeout=750      
  71. worker.tomcat12.socket_keepalive=0      
  72. worker.tomcat12.socket_timeout=3000      
  73. worker.tomcat12.connect_timeout=1000      
  74. worker.tomcat12.reply_timeout=3300    
  75.  
  76. #=======balance controller====     
  77. worker.controller.type=lb 
  78. worker.retries=3     
  79. worker.controller.balance_workers=tomcat1,tomcat2     
  80. worker.controller.sticky_session=1 
  81.  
  82. 相关参数说明:  
  83. worker.tomcat12.socket_keepalive=0#此属性将告诉操作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置,一般为120秒),这样将防止防火墙切断未激活的网络连接。       
  84. worker.tomcat12.socket_timeout=300000#此属性说明连接在未激活的状况下持续多久,web server将主动切断之。       
  85. worker.tomcat12.connect_timeout=10000# 此属性说明了web server等待PONG回应的时间(以ms为单位)。       
  86. worker.tomcat12.reply_timeout=330000#此属性告诉web server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间。       
  87. worker.tomcat12.reply_timeout=0#此属性说明了web server在检测到Tomcat失败后如何进行恢复工作(默认就是0,全部恢复)       
  88.  
  89. worker.loadbalancer.sticky_session=0#表述是否将对SESSION ID的请求路由回到相同的Tomcat worker。(默认是0,session不复制)  
  90.  
  91.  
  92. # cat uriworkermap.properties   
  93. /*=controller  
  94. !/*.jpg=controller 
  95. !/*.gif=controller 
  96. !/*.png=controller 
  97. !/*.bmp=controller 
  98. !/*.html=controller    
  99. !/*.htm=controller 
  100. !/*.swf=controller   
  101. !/*.css=controller   
  102. !/*.js=controller 
  103.  
  104. 完成以上所有之后,你会发现两台tomcat确实已经负载了,但是一个新的问题又产生,会话的问题。第一次提交和第二次提交不在同一台服务器,这基本上可以视为数据丢失。
  105. 如果仅仅只是浏览,那么问题可能不是很明显,当然如果你登录了,那么系统又会提示让你登录。于是,就有了tomcat的会话复制!  
  106. 目前关于tomcat的会话复制,有两种常见的方法:利用tomcat自身的简单集群功能,帮助复制会话。另外一种就是利用memcache这类缓存程序来缓存会话。  
  107.  
  108. 今天当然是首选第一种方法,利用tomcat的简单功能进行会话复制。 详见下篇! :)
  109. 利用memcache来保存tomcat的session会话: http://myhat.blog.51cto.com/391263/824159

 

本文出自 “潜入技术的海洋” 博客,请务必保留此出处http://myhat.blog.51cto.com/391263/785131