咱们曾经介绍过三种Tomcat集群方式的优缺点分析。本文将介绍Tomcat集群与负载均衡技术具体实施过程。前端
在进入集群系统架构探讨以前,先定义一些专门术语:web
1. 集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间经过网络实现进程间的通讯。应用程序能够经过网络共享内存进行消息传送,实现分布式计算机。算法
2. 负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一块儿的计算机,从外部看它是一个系统,各节点能够是不一样的操做系统或不一样硬件构成的计算机。如一个提供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也能够单独提供服务。浏览器
3. 特色:在现有网络结构之上,负载均衡提供了一种廉价有效的方法扩展服务器带宽和增长吞吐量,增强网络数据处理能力,提升网络的灵活性和可用性。集群系统 (Cluster)主要解决下面几个问题:高可靠性(HA):利用集群管理软件,当主服务器故障时,备份服务器可以自动接管主服务器的工做,并及时切换过去,以实现对用户的不间断服务。高性能计算(HP):即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,一般用于科学计算领域,好比基因分析,化学分析等。负载平衡:即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,下降对主服务器的硬件和软件要求。tomcat
目前比较经常使用的负载均衡技术主要有:服务器
1. 基于DNS的负载均衡网络
经过DNS服务中的随机名字解析来实现负载均衡,在DNS服务器中,能够为多个不一样的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时获得其中一个地址。所以,对于同一个名字,不一样的客户机会获得不一样的地址,他们也就访问不一样地址上的Web服务器,从而达到负载均衡的目的。架构
2. 反向代理负载均衡 (如Apache+JK2+Tomcat这种组合)负载均衡
使用代理服务器能够将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不一样,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,所以也被称为反向代理模式。分布式
3. 基于NAT(Network Address Translation)的负载均衡技术 (如Linux Virtual Server,简称LVS)
网络地址转换为在内部地址和外部地址之间进行转换,以便具有内部地址的计算机能访问外部网络,而当外部网络中的计算机访问地址转换网关拥有的某一外部地址时,地址转换网关能将其转发到一个映射的内部地址上。所以若是地址转换网关能将每一个链接均匀转换为不一样的内部服务器地址,此后外部网络中的计算机就各自与本身转换获得的地址上服务器进行通讯,从而达到负载分担的目的。
介绍完上面的集群技术以后,下面就基于Tomcat的集群架构方案进行说明:
上面是采用了Apache httpd做为web服务器的,即做为Tomcat的前端处理器,根据具体状况而定,有些状况下是不须要Apache httpd做为 web 服务器的,如系统展示没有静态页面那就不须要Apache httpd,那时能够直接使用Tomcat做为web 服务器来使用。使用Apache httpd主要是它在处理静态页面方面的能力比Tomcat强多了。
一、 用户的网页浏览器作完本地 DNS和企业受权的DNS之的请求/响应后,这时候企业受权的DNS(即21cn BOSS DNS)会给用户本地的DNS服务器提供一个NAT请求分配器(即网关)IP。
二、 NAT分配器,它会根据特定的分配算法,来决定要将链接交给哪一台内部 Apache httpd来处理请求。大多数的NAT请求分配器提供了容错能力:根据侦测各类WEB服务器的失效情况,中止将请求分配给已经宕掉的服务器。而且有些分配器还能够监测到WEB服务器机器的负载状况,并将请求分配给负载最轻的服务器等等。Linux Virtual Server是一个基于Linux操做系统上执行的VS-NAT开源软件套件,并且它有丰富的功能和良好的说明文件。商业硬件解决方案 Foundry Networks的ServerIron是目前业界公认最佳的请求分配器之一。
三、 Apache httpd + Mod_JK2在这里是做为负载均衡器,那为何要作集群呢?若是集群系统要具有容错能力,以便在任何单一的硬件或软件组件失效时还能100%可用,那么集群系统必须没有单点故障之忧。因此,不能只架设一台有mod_jk2的Apache httpd,由于若是 httpd或mod_jk2失效了,将不会再有请求被会送交到任何一个Tomcat 实例。这种状况下,Apache httpd就是瓶劲,特别在访问量大的网站。
四、 Mod_JK2负载均衡与故障复原,决定把Apache httpd当成web服务器,并且使用mod_jk2将请求传送给Tomcat,则可使用mod_jk2的负载均衡与容错功能。在集群系统中,带有 mod_jk2的Apache httpd能够作的事情包括:
A、 将请求分配至一或多个Tomcat实例上你能够在mod_jk2的workers.properties文件中,设定许多Tomcat实例,并赋于每一个实例一个lb_factor值,以做为请求分配的加权因子。
B、 侦测Tomcat实例是否失败当Tomcat实例的链接器服务再也不响应时,mod_jk2会及时侦测到,并中止将请求送给它。其余的Tomcat实例则会接受失效实例的负载。
C、 侦测Tomcat实例在失效后的什么时候恢复因链接器服务失效,而中止将请求分配给Tomcat实例以后,mod_jk2会周期性地检查是否已恢复使用性,并自动将其加入现行的Tomcat实例池中。
五、 Tomcat中的集群原理是经过组播的方式进行节点的查找并使用TCP链接进行会话的复制。这里提示一下就是,对每一个请求的处理,Tomcat都会进行会话复制,复制后的会话将会慢慢变得庞大。
六、 Mod_jk2同时支持会话亲和和会话复制。在tomcat 5中如何实现会话亲和和会话复制?把server.xml中的标签去掉就实现会话亲和,把标签加上就实现会话复制。
七、 会话亲和:就是表示来自同会话的全部请求都由相同的Tomcat 实例来处理,这种状况下,若是Tomcat实例或所执行的服务器机器失效,也会丧失Servlet的会话数据。即便在集群系统中执行更多的Tomcat实例,也永远不会复制会话数据。这样是提升集群性能的一种方案,但不具有有容错能力了。
八、 使用会话复制,则当一个Tomcat实例宕掉时,因为至少还有另外一个Tomcat实例保有一份会话状态数据,于是数据不会丧失。但性能会有所下降。