使用Apache通过JK实现多Tomcat负载均衡集群实现总结及自己的感悟

          第一次玩负载均衡集群,使用的是Apache、Tomcat,通过JK来实现。由于没有这方面经验,自己摸索了好多天,直到今天才基本完全搞定了。也了解了里面的一些相关原理,自己也亲自动手验证了一些原理。现将自己的经历过程和一些感悟总结分享一下,也以便自己日后查阅。

         首先是下载Apache、Tomcat、JK,这没什么说的,主要注意一下需要的Apache的版本,然后是Apache、Tomcat集群相应的JK版本。版本不对的话会有问题。我自己在这里没遇到多大问题。

         第一步,先做负载均衡,网上这方面的配置很多,随便找一个照着做,主要是针对Apache和Tomcat的配置文件的配置,这里我主要遇到的一个问题就是:Apache不能将请求分发给Tomcat处理(即Apache反向代理不成功)的问题关于这个问题详细解决方法及说明可以参照我之前写的一遍博文http://blog.csdn.net/fuxiaohui/article/details/45425985 ,这个不算什么大问题,就是Apache的一个配置没有配置好,但困扰了我很多天。希望可以帮到遇到同样的小伙伴们。这个问题解决了,就OK,负载均衡搞定。代码及相关配置我就不贴了,网上相关信息太多。

         第二步,集群,也是照着网上的配置做了一遍,同样也遇到个问题,就是session不能共享,没有复制。搞了好几个小时,不知道哪里有问题,最后发现在新建tomcat的工程下的WEB-INF文件夹的时候错将WEB-INF文件夹名写成了WEN-INF,哎!粗心害死人啊,就是因为这一个小小的字母写错了,浪费了我好几个小时,最后还是偶然发现的。不多说了,配置方面的东西一定要认真认真再认真。吸取教训。这个问题搞定了,也就OK了。

         至此负载均衡集群的全部工作总算完成了。但我想详细了解一下sticky_session和sticky_session_force这个配置的意义,所以网上找了相关文章看了看,自己照着试验了一下,现将网上了解的和自己总结的一些关于这两个配置的说明写一下:

sticky_session           sticky_session_force           结论

0(false)                                  0(false)                                           session无黏性,session会复制(共享)

0(false)                                  1(true)                                           session无黏性,session会复制(共享)

1(true)                                   0(false)                                            session有粘性(非强制)session会复制(共享)

1(true)                                   1(true)                                            session有粘性(强制)session没必要再复制共享

          以上这张表格是我从网上看到别人总结的,现我把自己的一些理解和感悟写一下:

1、当sticky_session为0(false)时,表示session无黏性,session会复制共享,也就是这个时候用户发出的request请求(不管是不是来自同一个用户和会话),都会根据负载均衡策略分发给不同的server处理,这个时候为了做到负载均衡集群,理所当然session肯定得共享。这个时候sticky_session_force参数的配置无关紧要,相当于失效了。  所以两个配置情况就明了。

2、当sticky_session为1(true)时,session有粘性,该种方式下,当用户发出第一个request后,负载均衡器动态的把该用户分配到某个节点,并记录该节点的jvm路由,以后该用户的所有request都会被绑定这个jvm路由,用户只会与该server发生交互,这种策略被称为粘性session(session sticky)。由此可以理解无粘性session(session sticky)。此时如果 sticky_session_force 为0(false) ,表示session有粘性,但是非强制的,session会复制共享。这个时候apache将某个请求分发给其中一台server,以后这个用户所有请求均会由于这个server来处理,但是如果当该server由于种种原因停掉了,不能再处理这个用户请求了,那么会由集群中另外的一个server来接手处理这个用户的请求(由于session复制共享了,此时理所当然session也应该复制共享,否则不能集群了),个人感觉这才是集群的经典用例。一般情况下我们配置集群通常也就使用该种配置比较好。而如果 sticky_session_force 为1(true),表示session有粘性,而且是强制的,session不会复制共享。这个时候就有点类似于apache将某个请求分发给其中一台server,然后这个请求就一直与这个server玩,当该server由于种种原因停掉了,不能再处理这个用户请求了,集群中另外的server也不会来接手处理这个用户的请求,也就是跟集群中另外server没太大关系了。个人感觉这种没太大意思,有点脱离了集群的本意了,负载均衡还可以算得上有点。本人亲测这个配置的时候,发出一个请求,如果请求被分配到server1上处理,此将server1停掉,再在这个请求下访问时,会报500。 

以上这些总结都是经过本人亲测检验过的。希望对小伙伴们有帮助。本人文笔不材,表达不当及有错误之处欢迎拍砖。欢迎评论指正交流。




概念: AJP是Apache提供的完成与其它服务器通讯的一种协议。在Apache中通过mod_proxy_ajp模块发送AJP数据,另外一端的服务器需要实现AJP协议,能够接受mod_proxy_ajp模块发送的AJP协议数据,在接受到AJP协议数据后做适当处理,并能够将处理结果以AJP协议方式发送回给mod_proxy_ajp模块。 配置过程: 1 安装apache 2 测试apache是否安装成功:http://localhost 出现It works! 3 解压、安装tocmat 4 测试tocmat是否安装成功:http://localhost:8080 5 配置tocmat的jdk: 打开startup.bat添加: rem ----------------------------------------------------JDK目录 SET JAVA_HOME=D:\progam\jdk160_05 rem ----------------------------------------------------解压后Tomcat的目录 6 复制tocmat,名字为tomcat2 7 apache 整合tomcat 1)modules目录下添加模块:jk mod_jk-1.2.26-httpd-2.2.4.so 2)修改conf/httpd.conf 最后一行添加: include conf/mod_jk.conf 3)在conf目录下创建mok_jk.conf 内容: #加载mod_jk Module LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so #指定 workers.properties文件路径 JkWorkersFile conf/workers.properties #指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名 JkMount /*.jsp controller 4)在confi目录下创建workers.properties 内容为: worker.list = controller,tomcat1,tomcat2 #========tomcat1======== worker.tomcat1.port=8009 worker.tomcat1.host=192.168.9.210 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #加权因子 越大执行的请求越多 #========tomcat2======== worker.tomcat2.port=9009 worker.tomcat2.host=192.168.9.210 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========controller,负载均衡控制器======== worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 worker.controller.sticky_session=1 5 修改tomcat的端口号(3处) <Server port="8005" shutdown="SHUTDOWN"> 改为: <Server port="9005" shutdown="SHUTDOWN"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> 改为: <Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> 改为: <Connector port="9009" protocol="AJP/1.3" redirectPort="8443"/> 注意:该处需要与worker.tomcat2.port=9009对应 6 修改jvmRoute 备注与worker.list = controller,tomcat1,tomcat2的tomcat1或tocmat2对应 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值