目录

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/
ProxyPa***everse / 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即可,这样不断刷新主页就可观察到用户的访问在两个节点上不断的切换,如下图:

wKiom1VReUTD1HqGAADFApWx1_4635.jpg

wKiom1VReWzTe-8yAACni1_1p8g415.jpg

每次刷新页面后,用户的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模块中能输出分布式集群环境中各节点的状态信息,并还有一定的管理功能的接口,所以此接口就配置成基于用户的访问控制或者调试好后直接禁用,此接口输出页面如下图:

wKioL1VRewaRBglIAAL_dC9mTFk524.jpg

4、问题及总结

上边提到过在不断刷新页面时会在两个节点不断的切换,用户的session信息也在不断的发生改变,如果在生产环境下保持用户的session信息是比较重要的,如果tomcat的后端没有session复制或共享的机制,那我们可以在httpd配置文件中启用“ProxySet stickysession=JSESSIONID”这个参数,表示绑定用户的session信息,当用户访问集群系统时被调度到了一个节点上,那其后边的连接也会都会调度到此节点上,这样session信息就不会被调度到其他节点而发生变化,但这样在一定程度上与负载均衡的思想相悖,不过这样的机制也能真正的解决session信息不断变化的问题。这里还有一个问题必须面临,那就是当用户访问的节点宕机了,那用户下次用户发起的连接是否会被调度到其他正常的节点,这是由“nofailover={On|Off}”来控制的,默认是Off,表示会自动进行故障转移,这样用户能正常访问站点,但因session信息丢失,站点会让用户再次进行登陆,如果设置成On,表示不会进行故障转移,那用户访问的节点发生故障后,用户将不能访问站点,这个需要管理员来权衡设置这两个参数。不过我们有更好的方案来解决这个问题,在tomcat集群中启用session的内存复制功能,或采用msm(Memcached Session Manager)方案来解决此次测试集群的缺陷,我将在后边的博文中呈现。