您现在的位置是:首页 > web开发 > Apache负载 均衡

Apache负载 均衡

web开发作者:dayu日期:10天前点击:4

使用http方式,配置文件

Java代码技术分享

  1. <Connectorexecutor="tomcatThreadPool"port="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"/>
  2. <Enginename="Catalina"defaultHost="localhost"jvmRoute="tomcat1">

使用ajp方式,配置文件

Java代码技术分享

  1. <Connectorport="8009"protocol="AJP/1.3"redirectPort="8443"/>
  2. <Enginename="Catalina"defaultHost="localhost"jvmRoute="tomcat1">

2.2 mod_proxy

mod_proxy_balancer是apache httpd自带的负载平衡支持。其优点可以根据实际的运行时机器的环境来决定负载均衡的策略。实现Session在node上进行共享传递。

2.2.1 加载so库

Java代码技术分享

  1. #mod_proxy_blancer
  2. LoadModuleproxy_modulemodules/mod_proxy.so
  3. LoadModuleproxy_ajp_modulemodules/mod_proxy_ajp.so
  4. LoadModuleproxy_ftp_modulemodules/mod_proxy_ftp.so
  5. LoadModuleproxy_http_modulemodules/mod_proxy_http.so
  6. LoadModuleproxy_connect_modulemodules/mod_proxy_connect.so
  7. LoadModuleproxy_balancer_modulemodules/mod_proxy_balancer.so

2.2.2 http方式

Java代码技术分享

  1. <Proxybalancer://mycluster>
  2. BalancerMemberhttp://127.0.0.1:8080loadfactor=3
  3. BalancerMemberhttp://127.0.0.1:7080loadfactor=3
  4. ProxySetlbmethod=byrequests
  5. </Proxy>
  6. ProxyRequestsOff
  7. ProxyPass/testbalancer://mycluster/stickysession=JSESSIONIDnofailover=Off
  8. ProxyPassReverse/testbalancer://mycluster/

实现负载均衡的原理为:假设Apache接收到http://127.0.0.1 /test请求,由于该请求满足ProxyPass条件(其URL前缀为“/"),该请求会 被分发到后台某一个BalancerMember。譬如该请求可能会转发到http://127.0.0.1:8080/进行处理。当第二个满足条件的URL请求过来时,该请求可能会被分发到另外一台BalancerMember,譬如,可能会转发到 http://127.0.0.1:7080/如此循环反复,便实现了负载均衡的机制。

loadfactor表示:后台服务器负载到由Apache发送请求的权值,该值默认为1,可以将该值设置为1到100之间的任何值。以上面的配置为例,进行4此请求时,则有3次连续的这样请求被负载到BalancerMember为http://127.0.0.1:8080/的服务器;有1次被负载到BalancerMember为http://127.0.0.1:7080/的服务器。

lbmethod表示:负载载均衡策略。

lbmethod=byrequests 按照请求次数均衡(默认)

lbmethod=bytraffic 按照流量均衡

lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

ProxyPass表示:所有的test请求都会重定向到balancer://mycluster/处理。balancer是内置负载。

ProxyPassReverse表示:反向代理,也就是将所有的请求反向代理到负载均衡后的应用url路径中。

stickysession表示:进行Session复制使用。

2.2.3 AJP方式

tomcat提供了ajp协议和httpd通信。当不想tomcat的8080端口开放时,可以使用此方式,配置文件:

Java代码技术分享

  1. <Proxybalancer://mycluster>
  2. BalancerMemberajp://127.0.0.1:8009loadfactor=2route=tomcat1
  3. BalancerMemberajp://127.0.0.1:7009loadfactor=2route=tomcat2
  4. ProxySetlbmethod=byrequests
  5. </Proxy>
  6. ProxyRequestsOff
  7. ProxyPass/testbalancer://mycluster/stickysession=JSESSIONIDnofailover=Off
  8. ProxyPassReverse/testbalancer://mycluster/

2.2.4 热备份

热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:

此时请求总是流向 8080这个url ,一旦8080挂掉, Apache会检测到错误并把请求分流给7080。Apache会每隔几分钟检测一下8080的状况,如果8080恢复,就继续使用8080。

Java代码技术分享

  1. <Proxybalancer://mycluster>
  2. BalancerMemberhttp://127.0.0.1:8080
  3. BalancerMemberhttp://127.0.0.1:7080status=+H
  4. ProxySetlbmethod=byrequests
  5. </Proxy>
  6. ProxyRequestsOff
  7. ProxyPass/testbalancer://mycluster/stickysession=JSESSIONIDnofailover=Off
  8. ProxyPassReverse/testbalancer://mycluster/

2.2.5 虚拟主机

配置文件

Java代码技术分享

  1. <VirtualHost*:80>
  2. ServerAdminlimingnihao@iteye.com
  3. ServerNamelocalhost
  4. ServerAliaslocalhost
  5. <Proxybalancer://mycluster>
  6. BalancerMemberajp://127.0.0.1:8009loadfactor=1route=tomcat1
  7. BalancerMemberajp://127.0.0.1:7009loadfactor=1route=tomcat2
  8. ProxySetlbmethod=bytraffic
  9. </Proxy>
  10. ProxyRequestsOff
  11. ProxyPass/testbalancer://mycluster/stickysession=JSESSIONIDnofailover=Off
  12. ProxyPassReverse/testbalancer://mycluster/
  13. ErrorLog"logs/error.log"
  14. CustomLog"logs/access.log"common
  15. </VirtualHost>

2.2.6 监控功能

可添加以下配置,可以查看监控页面。通过访问:http://127.0.0.1/balancer-manager。

配置文件

Java代码技术分享

  1. <Location/balancer-manager>
  2. SetHandlerbalancer-manager
  3. OrderAllow,Deny
  4. Allowfromall
  5. </Location>

2.3 mod_jk

Tomcat提供了专门的JK插件来负责Tomcat和HTTP服务器的通信。应该把JK插件安置在对方的HTTP服务器上。当HTTP服务器接收到客户请求时,它会通过JK插件来过滤URL,JK插件根据预先配置好的URL映射信息,决定是否要把客户请求转发给Tomcat服务器处理。例如预先配置好所有"/*.jsp"形式的URL都由Tomcat服务器来处理

Tomcat提供了不同的JK插件的实现模块。常用的JK插件有:

与Apache HTTPD服务器集成:mod_jk.so

与Windows IIS服务器集成:isapi_redirect.dll

2.3.1 Workers.properties

Workers实际上属于Tomcat的链接器(Connector),代表了一个Tomcat实例,这个实例代表了由某种web服务器来执行 servelet程序。举例来说,我们可以使用某个服务器,例如apache 来把servelet请求转递Tomcat进程(worker)来进行后台处理。

这样我们就可以通过配置多个 Worker,让不同的请求能够被不同的Worker处理,这些Worker可以提供不同的开发环境,使得所有开发者可以共享一个服务器而每个人都拥有自己的Worker。

想要提供负载平衡,只要在同一台机器上运行多个Tomcat Worker并且能够在这些Worker之间分布Web请求。

Tomcat Workers都定义在一个叫做workers.properties属性文件之中,并且workers的说明告诉应该如何使用它们。

2.3.1.1 全局配置项

指令 默认 说明
worker.list ajp13 由逗号分离开的worker名称列表.
worker.maintain 60 辅助连接池保持间隔,以秒为单位。

2.3.1.2 链接指令

可配置一个通用的,然后每个work进行继承。

指令 默认 说明
type ajp13 指定Tomcat服务器 与Apache之间的通信协议
host localhost Tomcat主机名或 IP 地址。
port 8009 Tomcat侦听端口号。AJP13的默认端口是8009.
socket_connect_timeout socket_timeout*1000 套接字超时时间(毫秒为单位)。
socket_keepalive false 在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置,一般为120秒)
ping_mode -

探测tomcat的状态策略。

C(content):链接模式,最后一次链接判断是否超时。connect_timeout定义时间。若未定义使用ping_timeout。

P(prepost):请求模式,通过每次请求判断是否超时。prepost_timeout定义时间。若未定义使用ping_timeout。

I(interval):间隔模式,定期检测链接是否超时。connection_ping_interval间隔时间。ping_timeout超时时间。

A:以上所有的探测策略都将开启。

connection_pool_size JK会维护多个长连接做为一个池。它被用来设置每个WebServer(Apache)子进程的最大连接数。
connection_pool_minsize (pool+1)/2 连接池中维护最小的连接数。
connection_pool_timeout 0 在连连池中维护的非活动连接连续多少秒后被释放。如果为0,则不释放。
connection_acquire_timeout retries*retry_interval 获取接连的超时。
lbfactor 1 负载平衡器权值

2.3.1.3 负载均衡设置

指令 默认 说明
balance_workers 逗号分隔的worker列表
sticky_session true 负载喷发采用Session粘贴机制,按SessionID喷发请求。为了保障同一SessionID的请求被分发到同一台服务器上。
sticky_session_force false 如果为True, SessionID并不合法时则返回500错误,否则,丢掉Session并转发到另外的机器上。

2.3.1.4 实例

Java代码技术分享

  1. #Definetwostatusworker:
  2. #-jk-statusforread-onlyuse
  3. #-jk-managerforread/writeuse
  4. worker.list=jk-status
  5. worker.jk-status.type=status
  6. worker.jk-status.read_only=true
  7. worker.list=jk-manager
  8. worker.jk-manager.type=status
  9. #Wedefinealoadbalancerworker
  10. #withname"balancer"
  11. worker.list=balancer
  12. worker.balancer.type=lb
  13. worker.balancer.error_escalation_time=0
  14. worker.balancer.max_reply_timeouts=10
  15. worker.balancer.sticky_session=true
  16. worker.balancer.sticky_session_force=true
  17. #NowweaddmemberstotheloadbalancerFirstmemberis"tomcat1",mostattributesareinheritedfromthetemplate"worker.template".
  18. worker.balancer.balance_workers=tomcat1
  19. worker.tomcat1.reference=worker.template
  20. worker.tomcat1.host=127.0.0.1
  21. worker.tomcat1.port=8009
  22. worker.tomcat1.activation=A
  23. #Secondmemberis"tomcat2",mostattributesareinheritedfromthetemplate"worker.template".
  24. worker.balancer.balance_workers=tomcat2
  25. worker.tomcat2.reference=worker.template
  26. worker.tomcat2.host=127.0.0.1
  27. worker.tomcat2.port=7009
  28. worker.tomcat2.activation=A
  29. #Finallyweputtheparameters
  30. worker.template.type=ajp13
  31. worker.template.socket_connect_timeout=5000
  32. worker.template.socket_keepalive=true
  33. worker.template.ping_mode=A
  34. worker.template.ping_timeout=10000
  35. worker.template.connection_pool_minsize=0
  36. worker.template.connection_pool_timeout=600
  37. worker.template.reply_timeout=300000
  38. worker.template.recovery_options=3

2.3.2 uriworkermap.properties

Java代码技术分享

  1. /*.do=balancer
  2. /*.jsp=balancer
  3. #/*.gif=balancer
  4. #/*.jpg=balancer
  5. #/*.png=balancer
  6. #/*.css=balancer
  7. #/*.js=balancer
  8. #/*.htm=balancer
  9. #/*.html=balancer
  10. #/*.txt=balancer
  11. #Optionallyfilteroutall.jpegfilesinsidethatcontext
  12. #Fornomappingtheurlhastostartwithexclamation(!)
  13. !/servlets-examples/*.jpeg=lb
  14. #
  15. #Mountjkstatusto/jkmanager
  16. #Forproductionserversyouwillneedto
  17. #securetheaccesstothe/jkmanagerurl
  18. #
  19. /jk-manager=jk-manager
  20. /jk-status=jk-status

2.3.3 httpd.conf

需要在中添加httpd的配置文件中加载jk的配置文件。

Java代码技术分享

  1. #加载jk配置文件
  2. #Includeconf/mod_jk.conf

2.3.4 mod_jk.conf

Java代码技术分享

  1. #aversionedfilename.
  2. LoadModulejk_modulemodules/mod_jk_2.2_32.so
  3. <IfModulejk_module>
  4. JkWorkersFileconf/workers.properties
  5. JkLogFilelogs/mod_jk.log
  6. JkLogLevelinfo
  7. JkShmFilelogs/mod_jk.shm
  8. #JkOptions+RejectUnsafeURI
  9. #JkStripSessionOn
  10. JkWatchdogInterval60
  11. <Location/jk-status>
  12. #InsideLocationwecanomittheURLinJkMount
  13. JkMountjk-status
  14. Orderdeny,allow
  15. Denyfromall
  16. Allowfrom127.0.0.1
  17. </Location>
  18. <Location/jk-manager>
  19. #InsideLocationwecanomittheURLinJkMount
  20. JkMountjk-manager
  21. Orderdeny,allow
  22. Denyfromall
  23. Allowfrom127.0.0.1
  24. </Location>
  25. JkMountFileconf/uriworkermap.properties
  26. JkMount/*balancer
  27. #JkUnMount/myapp/static/**
  28. #JkUnMount/myapp/images/*balancer
  29. #SetEnvIfREQUEST_URI"\.(htm|html|css|gif|jpg|js)$"no-jk
  30. #SetEnvIfRequest_URI"/transactions/"JK_REPLY_TIMEOUT=600000
  31. #SetEnvIfRequest_URI"/reports/"JK_REPLY_TIMEOUT=0
  32. </IfModule>

2.3.5 编译Linux版本JK

在linux自行编译jk时,需要以下步骤:

1.解压tomcat-connectors-1.2.37-src.tar.gz

2.指定httpd的apxs文件。他会自动将mod_jk.do生成到httpd的modules下。

Java代码技术分享

  1. ./configure--with-apxs=/opt/apache/httpd/bin/apxs

2.4 Session同步方式

2.4.1 sticky模式

前端balancer可实现sticky模式的session同步功能。利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用。

2.4.2 复制模式

利用Tomcat session复制的机制使得所有session在所有Tomcat节点中保持一致。当一个节点修改一个session数据的时候,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点。这样当下一个用户请求被负载均衡器分配到另外一个节点的时候,那个节点上有完备的 session信息可以用来服务该请求。这种做法的问题是对session哪怕有一点点修改,也要把整个sessions数据全部序列化 (serialize),还要广播给集群中所有节点,不管该节点到底需不需要这个session。这样很容易会造成大量的网络通信,导致网络阻塞。一般采 用这种方式,当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了;

此方式是通过tomcat本身提供的功能,只需要修改server.xml文件

(1)修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

(2)去掉<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 的注释符

(3)web.xml中增加 <distributable/>

2.5 Linux部署常见问题

1.Failed to lookup provider ‘shm‘ for ‘slotmem‘: is mod_slotmem_shm loaded??

加载mod_slotmem_shm.so就可以了。

2.BalancerMember Can‘t find ‘byrequests‘ lb method

三种模式,需要加载三个so:

mod_lbmethod_bybusyness.so

mod_lbmethod_byrequests.so

mod_lbmethod_bytraffic.so



Apache负载 均衡

原文地址:http://www.cnblogs.com/songyunxinQQ529616136/p/7203295.html


下一篇       上一篇