天天看点

使用Apache搭建Sticky模式的Tomcat集群

集群原理

Web集群分成两个方面:

负载分发

一方面是水平扩展,通过接入代理进行负载分发,分发到后台多个实际的业务处理逻辑单元上。这种接入代理可以是nginx,Apache等软件负载,也可以是类似F5等硬件负载。具体方式参见nginx负载或Apache负载等。

Session处理

另一方面就是多个业务逻辑单元之间的Session处理,处理方式有两种,一种是Session sticky模式,另外一种是Session共享模式。

Session处理方式 Session Sticky Session共享
处理逻辑 把同一个用户的Session一直发送到同一个逻辑单元处理 所有的后端处理逻辑单元共享Session或者Session更新时通知其它逻辑单元
主要实现方式 指定负载的分发组件(如Apache),把请求中包含特定属性的请求发到同一个连接,如指定jsessionid一致的请求到同一个请求,或者在负载组件中给每个响应增加一个头部属性,指定下次的分发目的地

1.       各自维护Session,当请求处理结束后,通知其它组件单元更新Session,包括异步和同步模式

2.       统一维护Session,如把Session放在memcached或者共享文件系统中,可以在容器级别或者应用级别做这个事情

3.       利用cache server

优势 本地维护Session,不需要访问网络存取或者通知其它处理单元变更 完全的随机分发,可以根据服务忙闲调整分发策略,高可用性
劣势 一台服务器宕机后,当前Session断掉 网络存取操作等耗时,影响处理效率(根据选用的策略不同造成影响不同)

搭建步骤

本文档所阐述场景:使用Apache modproxy模式进行负载分发,Session使用Session Sticky模式。

安装部署Tomcat

略。

注意:多台Tomcat之间毫无关联,不需要做任何配置。

安装Apache HttpServer

略。

注意:Apache需要使用2.2以上的版本,支持mod proxy模式。

配置负载分发

以下配置修改都是在Apache的conf/httpd.conf配置文件中完成

1.    修改加载mod proxy需要的模块

找到配置中被注释掉的几行,删除注释,使Apache在启动的时候加载如下模块

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule headers_module modules/mod_headers.so

LoadModule status_module modules/mod_status.so

2.    给HTTP请求头部添加路由标识

直接在loadModule模块下面增加即可

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

3.    配置负载均衡后端的业务逻辑单元处理地址

注意本步骤标红的需要与上面步骤中的ROUTEID一致。

<Proxy balancer://mycluster>

BalancerMember http://192.168.77.213:9005 route=1

BalancerMember http://192.168.77.213:9004 route=2

BalancerMember http://192.168.77.213:9002 route=3

BalancerMember http://192.168.77.213:9003 route=4

ProxySet stickysession=ROUTEID

</Proxy>

4.    配置mod proxy路由规则

ProxyPass / balancer://mycluster/

注意“/”不要少加,mycluster与上面的后端处理集群的名字一致。这里的意思是把所有的请求都转发给上面的集群进行处理

5.    2,3,4步骤的最终配置如下:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy balancer://mycluster>

BalancerMember http://192.168.77.213:9005 route=1

BalancerMember http://192.168.77.213:9004 route=2

BalancerMember http://192.168.77.213:9002 route=3

BalancerMember http://192.168.77.213:9003 route=4

ProxySet stickysession=ROUTEID

</Proxy>

ProxyPass / balancer://mycluster/

验证

打开地址http://192.168.13.242:7080/smsshall/welcome.do进行验证(注意Apache是监听192.168.13.242:7080地址的)。

使用firebug查看cookies信息,多次刷新,cookies中的ROUTEID是一致的。

重新打开多个浏览器,刷新,尝试,看ROUTEID,同一个浏览器的ROUTEID是不会变化的。