目录
1.测试环境概述
2、ajp实现lb的方式
3.lb是通过http实现的
4.问题和总结
1.测试环境概述
这个测试采用三台主机,其中两台提供tomcat服务。在之前的博文中,已经配置了tomcat环境,其中一个提供了httpd来实现tomcat上的负载均衡效果。
服务器规划:
1台服务器IP:192.168.0.200主机名“lb”
2服务器IP:192.168.0.201主机名“tomcat1”
3服务器IP:192.168.0.202主机名“tomcat2”
后端tomcat安装配置此时不再可用。请参考之前的博文http://zhaochj.blog.51cto.com/368705/1639740.httpd是百胜安装的,版本是:
[root@lb ~]# rpm -qa httpd httpd-2.2.15-39.el6.centos.x86_64安装此版本后,检查已编译的模块,以确保以下模块可用于完成此测试:
[root@lb ~]# httpd -M proxy_module (shared) proxy_balancer_module (shared) proxy_http_module (shared) proxy_ajp_module (shared)2、ajp实现lb的方式
修改配置为虚拟主机的httpd的配置文件。
[root@lb ~]# vim /etc/httpd/conf/httpd.conf .....省略.... #DocumentRoot "/var/www/html" #注释中心主机 ..... ProxyRequests Off #关闭正向代理 <Proxy balancer://lbcluster1> BalancerMember ajp://192.168.0.201:8009 loadfactor=2 route=tomcata BalancerMember ajp://192.168.0.202:8009 loadfactor=2 route=tomcatb ProxySet lbmethod=byrequests #ProxySet lbmethod=bytrffic #ProxySet lbmethod=bybusyness #ProxySet stickysession=JSESSIONID #一定要写成大写的jsessionid ProxySet nofailover=On </Proxy> <VirtualHost *:80> #启用虚拟主机 DocumentRoot /tomcat/webapps/test ServerName www.test.com ErrorLog logs/test.com-error.log CustomLog logs/test.com-access.log common <Location /status> SetHandler balancer-manager ProxyPass ! Order allow,deny Allow from 192.168.0.0/24 </Location> ProxyPass / balancer://lbcluster1/ ProxyPa***everse / balancer://lbcluster1/ </VirtualHost>上述说明的描述:
ProxyRequests{On|Off}:是否打开apache的转发代理功能。启用此选项时,必须启用mod_proxy_http模块才能代理http协议。同时,如果为apache设置了ProxyPass,则ProxyRequests必须设置为Off。
ProxyPass命令的语法是ProxyPass[path]!|url[key=valuekey=value...]]:将后端服务器的url与当前服务器的虚拟路径相关联,作为提供服务的路径,其中路径是当前服务器上的虚拟路径,URL是后端服务器上的URL路径。使用此指令时,ProxyRequests的值必须设置为Off。请注意,如果path以“/”结尾,则相应的url也必须以“/”结尾,反之亦然。"!"否。表示此虚拟路径不代理到后端,而是在本地处理,用于动态和静态分离。
此外,mod_proxy模块在httpd2.1版本之后支持与后端服务器的连接池功能,连接是按需创建的,可以保存在连接池中以备后用。连接池大小或其他设置可以通过在ProxyPass中使用key=value来定义。的常用键如下:
Min:连接池的最小容量。这个值与实际的连接数无关,只是表示空之间要初始化的连接池的最小大小。
Max:连接池的最大容量,每个MPM都有自己独立的容量;值都与MPM本身有关,比如Prefork的总是1,而其他的则取决于ThreadsPerChild指令的值。
Loadfactor:用于负载均衡集群配置,定义对应后端服务器的权重,取值范围为1-100。
重试:当apache向后端服务器发送请求并得到错误响应时,等待多长时间再重试。以秒为单位。
如果代理规范以balancer://开头,也就是说,当它用于负载平衡集群时,它还可以接受一些特殊参数,如下所示:
Lbmethod:apache对负载均衡的调度方式默认为byrequests,即统计请求数基于权重进行调度,bytraffic基于权重进行流量计数调度,bybusyness则考虑各后端服务器的当前负载进行调度。
Maxattempts:放弃请求前实现故障转移的次数。默认值为1,最大值不应大于节点总数。
Nofailover:值为On或Off。当后端服务器出现故障时,用户不会被故障转移到其他节点,导致用户无法正常访问网站。如果设置为Off,表示允许故障转移,即用户访问的节点出现故障,将转移到其他节点。如果在后端服务器无法复制或共享会话时将此值设置为On,则用户可能无法访问网站。如果设置为Off,则用户的会话。
Stickysession:值是调度器的stickysession的名称,根据web编程语言的不同,它的值是JSESSIONID或PHPSESSIONID。
以上指令可以在banlancer://或者ProxyPass中设置,也可以使用ProxySet指令直接设置,就像我上面设置的一样。
在配置文件中
<代理平衡器://lbcluster1>;
平衡器成员ajp://192.168.0.201:8009loadfactor=2route=Tomcata
balancermemberajp://192.168.0.202:8009loadfactor=2route=tomcatb
本节中的名称route=tomcata和route=tomcatb是tomcat服务配置文件的引擎容器中jvmRoute的配置,如下所示:
<enginename="Catalina"defaulthost="localhost"JVMroute="tomcatb">;
配置完成后,启动httpd服务并测试它:
[root@lb ~]# service httpd start后端tomcat上提供的测试页面是两个jsp测试文件,可以记录用户每次访问的会话信息。这些文件的内容如下:
[root@tomcat1 ~]# vim /tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA </h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>在tomcat2上,只需将这个测试文件中的TomcatA替换为TomcatB,这样用户的访问就可以通过不断刷新主页在两个节点上不断切换,如下图所示:
每次页面刷新,用户的会话信息都会改变。
3.lb是通过http实现的
确保后端tomcat服务器监听http的某个端口。我将在这里保留默认的8080,并将
<代理平衡器://lbcluster1>;
平衡器成员ajp://192.168.0.201:8009loadfactor=2route=Tomcata
balancermemberajp://192.168.0.202:8009loadfactor=2route=tomcatb
修改为:
<代理平衡器://lbcluster1>;
balancermemberhttp://192.168.0.201:8080loadfactor=2route=Tomcata
balancermemberhttp://192.168.0.202:8080loadfactor=2route=tomcatb
这就完成了配置。
在配置文件中配置了一个特殊位置,如下所示:
<位置/状态>
SetHandler平衡器管理器
ProxyPass!
订单允许、拒绝
允许从192.168.0.0/24开始
</Location>;
这是proxy_module模块中的一个接口,可以输出分布式集群环境中各个节点的状态信息,具有一定的管理功能。因此,该接口被配置为基于用户访问控制或调试后直接禁用。该界面的输出页面如下:
4.问题和总结
如上所述,页面不断刷新时,两个节点会不断切换,用户的会话信息也在不断变化。如果在生产环境中保存用户的会话信息很重要,如果tomcat后端没有会话复制或共享机制,那么,我们可以在httpd配置文件中启用参数“proxysetstickysession=jssessionid”,这意味着当用户访问集群系统时,绑定用户的会话信息被调度到一个节点,后续的连接也会被调度到这个节点,这样会话信息就不会被调度到其他节点而发生变化。但这在一定程度上违背了负载均衡的思想,但这种机制也确实可以解决会话信息不断变化的问题。这里还有一个必须面对的问题,就是当用户访问的节点宕机时,用户发起的下一次连接是否会被调度到其他正常节点?这由“nofailover={On|Off}”控制,默认为Off,这意味着故障转移将自动执行,以便用户可以正常访问站点。但是,由于会话信息丢失,网站会让用户重新登录。如果设置为on,则意味着不会发生故障转移。用户访问的节点出现故障后,用户将无法访问该站点。这需要管理员平衡和设置这两个参数。不过,我们有更好的解决方案来解决这个问题,比如在tomcat集群中启用session的内存复制功能,或者采用msm(MemcachedSessionManager)方案来解决这个测试集群的缺陷,我会在下面的博文中呈现。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)