目录
1、测试环境概述
2、ajp方式实现lb
3、http方式实现lb
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采用yum方式安装,版本为:
[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/ ProxyPassReverse / balancer://lbcluster1/ </VirtualHost>
对以上各指令的说明:
ProxyRequests {On|Off}:是否开启apache正向代理的功能,启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off
ProxyPass指令的语法为ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 “!”号表示此虚拟路径不被代理到后端,而是在本地处理,在做动静分离时使用。
另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:
min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。
loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。
如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:
lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户不会被故障转移到其他节点,这样用户就不能正常访问网站,如果设置成Off,表示允许发生故障转移,即用户访问的节点发生故障,会被转移到其他节点,如果在后端服务器没有解决session复制或共享时,将此值设置为On,那用户可能访问不到网站,如果设置成Off,那用户的session会丢失。
stickysession:取值为调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,就像上边我设置的一样。
配置文件中的
<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
这部份中的route=tomcata与route=tomcatb这两个名称是在tomcat服务的配置文件中的Engine容器中jvmRoute的配置,如下:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatb">
配置好后,启动httpd服务,进行测试:
[root@lb ~]# service httpd start
在后端两tomcat上提供的测试页面是两个能记录用户每次访问的session信息的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即可,这样不断刷新主页就可观察到用户的访问在两个节点上不断的切换,如下图:
每次刷新页面后,用户的session信息都会改变。
3、http方式实现lb
保证后端tomcat服务器监听在http的某个端口,我这里保持默认的8080,把httpd配置文件中的
<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
修改为:
<Proxy balancer://lbcluster1>
BalancerMember http://192.168.0.201:8080 loadfactor=2 route=tomcata
BalancerMember http://192.168.0.202:8080loadfactor=2 route=tomcatb
这样即完成配置。
在配置文件中配置了一个特殊的Location,如下:
<Location /status>
SetHandler balancer-manager
ProxyPass !
Order allow,deny
Allow from 192.168.0.0/24
</Location>
这是一个proxy_module模块中能输出分布式集群环境中各节点的状态信息,并还有一定的管理功能的接口,所以此接口就配置成基于用户的访问控制或者调试好后直接禁用,此接口输出页面如下图:
4、问题及总结
上边提到过在不断刷新页面时会在两个节点不断的切换,用户的session信息也在不断的发生改变,如果在生产环境下保持用户的session信息是比较重要的,如果tomcat的后端没有session复制或共享的机制,那我们可以在httpd配置文件中启用“ProxySet stickysession=JSESSIONID”这个参数,表示绑定用户的session信息,当用户访问集群系统时被调度到了一个节点上,那其后边的连接也会都会调度到此节点上,这样session信息就不会被调度到其他节点而发生变化,但这样在一定程度上与负载均衡的思想相悖,不过这样的机制也能真正的解决session信息不断变化的问题。这里还有一个问题必须面临,那就是当用户访问的节点宕机了,那用户下次用户发起的连接是否会被调度到其他正常的节点,这是由“nofailover={On|Off}”来控制的,默认是Off,表示会自动进行故障转移,这样用户能正常访问站点,但因session信息丢失,站点会让用户再次进行登陆,如果设置成On,表示不会进行故障转移,那用户访问的节点发生故障后,用户将不能访问站点,这个需要管理员来权衡设置这两个参数。不过我们有更好的方案来解决这个问题,在tomcat集群中启用session的内存复制功能,或采用msm(Memcached Session Manager)方案来解决此次测试集群的缺陷,我将在后边的博文中呈现。