青野 发表于 2018-11-21 11:11:14

apache以mod_proxy实现负载均衡集群

  目录
  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方式安装,版本为:
# rpm -qa httpd
httpd-2.2.15-39.el6.centos.x86_64  此版本安装好后,查看所编译的模块,得保证有以下模块才能完成此次的测试:
# httpd -M
proxy_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)
proxy_ajp_module (shared)  2、ajp方式实现lb
  修改httpd的配置文件,这里以虚拟主机的方式配置
# vim /etc/httpd/conf/httpd.conf
.....省略....
#DocumentRoot "/var/www/html"   #注释中心主机
.....
ProxyRequests Off#关闭正向代理

      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

#启用虚拟主机
DocumentRoot /tomcat/webapps/test
ServerName www.test.com
ErrorLog logs/test.com-error.log
CustomLog logs/test.com-access.log common

      SetHandler balancer-manager
      ProxyPass !
      Order allow,deny
      Allow from 192.168.0.0/24

ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
  对以上各指令的说明:
  ProxyRequests {On|Off}:是否开启apache正向代理的功能,启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off
  ProxyPass指令的语法为ProxyPass!|url]:将后端服务器某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指令直接进行设置,就像上边我设置的一样。
  

  配置文件中的
  
  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的配置,如下:
  
  

  配置好后,启动httpd服务,进行测试:
# service httpd start  在后端两tomcat上提供的测试页面是两个能记录用户每次访问的session信息的jsp测试文件,文件内容如下:
# vim /tomcat/webapps/test/index.jsp


TomcatA

TomcatA

   
    Session ID

   
   
   
    Created on
   
   


  在tomcat2上只是把此测试文件中的TomcatA更换成TomcatB即可,这样不断刷新主页就可观察到用户的访问在两个节点上不断的切换,如下图:


  每次刷新页面后,用户的session信息都会改变。
  3、http方式实现lb
  保证后端tomcat服务器监听在http的某个端口,我这里保持默认的8080,把httpd配置文件中的
  
  BalancerMember ajp://192.168.0.201:8009 loadfactor=2 route=tomcata
  BalancerMember ajp://192.168.0.202:8009 loadfactor=2 route=tomcatb
  修改为:
  
  BalancerMember http://192.168.0.201:8080 loadfactor=2 route=tomcata
  BalancerMember http://192.168.0.202:8080loadfactor=2 route=tomcatb
  这样即完成配置。
  在配置文件中配置了一个特殊的Location,如下:
  
  SetHandler balancer-manager
  ProxyPass !
  Order allow,deny
  Allow from 192.168.0.0/24
  
  这是一个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)方案来解决此次测试集群的缺陷,我将在后边的博文中呈现。



页: [1]
查看完整版本: apache以mod_proxy实现负载均衡集群