最近对集群产生了兴趣,打算从零开始一步一步深入进去,以此篇文章为起点开始探索。
1、 为什么需要集群?
a) 实现负载均衡
b) 实现灾备、故障恢复
2、 需要的知识点
a) 反向代理实现负载均衡,参考链接如下:
http://yahoon.blog.51cto.com/13184/162922/
b) 黏性Session和非黏性Session
黏性Session:此模式下同一会话中的请求都被派送到同一个tomcat实例上,这样我们就无须在多台服务器之间实现session共享了,这是其好处,不好的地方就是不能实现 failureover了,一但用户访问的机器挂掉,那么其session就会丢失。
非黏性Session:又名复制Session,此模式下同一会话中的请求可以被分配到不同的tomcat实例上进行处理,此时就需要在不同服务器之间同步、复制session,这样一来即使一台服务器挂掉了,请求在其它服务器上照样可以访问到session信息,其缺点在于Session复制需要系统资源和网络开销。
3、集群架构原理图
4、 Apache集成Tomcat并进行集群配置,步骤如下:
a) 下载、安装Apache服务器(本实验所用版本为2.2.14),下载地址:
http://httpd.apache.org/download.cgi#apache22
b) 下载zip版的Tomcat(因为实验时需要在一台机器上部署多个Tomcat节点,所以不要下载安装版,本实验所用版本为7.0.37),下载地址:
http://tomcat.apache.org/download-70.cgi
c) Apache集成Tomcat有三种方式,分别是JK,http_proxy和ajp_proxy,相关参考链接如下:
http://www.codesky.net/article/201106/148884.html
http://www.blogjava.net/pengo/archive/2011/04/15/348331.html
此实验中采用第一种方式,步骤如下:
<1> 下载JK,JK是一款 Apache/IIS用来连接后台Tomcat的模块,支持集群和负载均衡,下载时需注意JK和Apache对应版本需保持一致,下载地址:
http://tomcat.apache.org/download-connectors.cgi
<2> 将下载的mod_jk.so放到Apache的modules文件夹内,并在conf/httpd.conf配置文件中增加如下配置:
#加载mod_jk模块
LoadModule jk_module modules/mod_jk.so
#指定workers.properties文件的路径
JkWorkersFile conf/workers.properties
#指定mod_jk的日志文件的路径
JkLogFile logs/mod_jk.log
#指定mod_jk的日志级别
JkLogLevel debug
#记录Tomcat Worker名称、网址和每个请求的时间
JkRequestLogFormat “%w %U %T”
#指定哪些请求交给Tomcat处理,loadbalancer为在workers.properties中配置的分发器名
JkMount /*.do loadbalancer
JkMount /*.jsp loadbalancer
<3> 在conf目录下新建workers.properties文件,其内容如下:
#server列表
worker.list = loadbalancer
#========tomcat1========
#ajp13端口号
worker.tomcat1.port=11009
#tomcat的主机地址
worker.tomcat1.host=localhost
#连结tomcat所用的协议类型
worker.tomcat1.type=ajp13
#负载平衡因数(只有启动了负载平衡才有用),值越高,分得的请求越多
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=12009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========tomcat3========
worker.tomcat3.port=13009
worker.tomcat3.host=192.168.0.80
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor = 1
#========tomcat4========
worker.tomcat4.port=14009
worker.tomcat4.host=192.168.0.80
worker.tomcat4.type=ajp13
worker.tomcat4.lbfactor = 1
#========controller,负载均衡控制器========
#指定控制器类型
worker. loadbalancer.type=lb
#指定参与负载均衡的tomcat名称列表
worker. loadbalancer.balanced_workers=tomcat1,tomcat2,tomcat3,tomcat4
#sticky_session:指明session是否是黏性的。其默认值为1(true),表示使用黏性session,即一个会话中的请求始终由一个tomcat进行处理;为0时表示使用非黏性session,即同一会话中的请求可由不同的tomcat处理,各tomcat之间需同步Session
worker. loadbalancer.sticky_session=0
# sticky_session_force:指明session的黏性是否是绝对的、强制的。其默认值为0(false),表示非强制,当集群中某台服务器多次请求没响应时,则将请求转发到其它tomcat处理;为1时表示强制,即使某台服务器宕机也不会将请求转发到其它服务器。
worker. loadbalancer.sticky_session_force=0
--------------------------------------------------------------------------------------------------------------------
注:当sticky_session和sticky_session_force组合时特性下篇文章有叙述
<4> 对4个Tomcat进行配置(server.xml),以tomcat1为例,其它同理:
4.1修改Server Port(非必需,只有当一台机器上需部署多个tomcat是才需要修改以达到端口互斥)
<Server port="11005" shutdown="SHUTDOWN">
4.2 修改类型为http1.1的Connector的端口(或者直接将该Connector的配置注释掉,该步骤也是非必需的,其原因和4.1一样)
<Connector port="11080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
4.3 配置Ajp13的Port
<Connector port="11009" protocol="AJP/1.3" redirectPort="8443" />
4.4 配置JvmRoute,其值必须和workers.properties中的对应名称保持一致
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
4.5 配置Cluster(将原有Cluster的注释放开即可)
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
说明:4.4和4.5这两步即使省略掉,对下面<5>的测试结果也毫无影响,因为mod_jk最主要的作用是分发请求和负载均衡,它不关心Tomcat之间怎样集群、Session怎样同步,如果只是用mod_jk将一台apache和一台tomcat整合起来,显然4.4和4.5没必要配置。
<5> 进行测试
在四个tomcat的webapps目录下建立balancing文件夹,在该文件夹下创建
test1.jsp,内容如下:
<% out.println(“hello world”) ; %>
<% System.out.println("==========="); %>
启动apache,然后启动四个tomcat,在浏览器中输入http://localhost/balancing/test1.jsp,回车后,界面回显hello world,测试成功。
连续快速刷新该页面,会发现在四个tomcat的控制台上都会输出“==========”,此处表明服务器已经实现了负载均衡。
总结:本篇到此结束,下篇对Tomcat的集群机制和Session同步机制进行分析。