在单一的服务器上执行WEB应用程序有一些重大的问题当网站成功建成并开始接受大量请求时单一服务器终究无法满足需要处理的负荷量所以就有点显得有点力不从心了
另外一个常见的问题是会产生单点故障如果该服务器坏掉那么网站就立刻无法运作了不论是因为要有较佳的扩充性还是容错能力我们都会想在一台以上的服务器计算机上执行WEB应用程序所以这时候我们就需要用到集群这一门技术了
在进入集群系统架构探讨之前先定义一些专门术语
集群(Cluster)是一组独立的计算机系统构成一个松耦合的多处理器系统它们之间通过网络实现进程间的通信应用程序可以通过网络共享内存进行消息传送实现分布式计算机
负载均衡(Load Balance)先得从集群讲起集群就是一组连在一起的计算机从外部看它是一个系统各节点可以是不同的操作系统或不同硬件构成的计算机如一个提供Web服务的集群对外界来看是一个大Web服务器不过集群的节点也可以单独提供服务
特点在现有网络结构之上负载均衡提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量加强网络数据处理能力提高网络的灵活性和可用性集群系统(Cluster)主要解决下面几个问题
高可靠性(HA)利用集群管理软件当主服务器故障时备份服务器能够自动接管主服务器的工作并及时切换过去以实现对用户的不间断服务
高性能计算(HP)即充分利用集群中的每一台计算机的资源实现复杂运算的并行处理通常用于科学计算领域比如基因分析化学分析等
负载平衡即把负载压力根据某种算法合理分配到集群中的每一台计算机上以减轻主服务器的压力降低对主服务器的硬件和软件要求
目前比较常用的负载均衡技术主要有
基于DNS的负载均衡
通过DNS服务中的随机名字解析来实现负载均衡在DNS服务器中可以为多个不同的地址配置同一个名字而最终查询这个名字的客户机将在解析这个名字时得到其中一个地址因此对于同一个名字不同的客户机会得到不同的地址他们也就访问不同地址上的Web服务器从而达到负载均衡的目的
反向代理负载均衡 (如Apache+JK+Tomcat这种组合)
使用代理服务器可以将请求转发给内部的Web服务器让代理服务器将请求均匀地转发给多台内部Web服务器之一上从而达到负载均衡的目的这种代理方式与普通的代理方式有所不同标准代理方式是客户使用代理访问多个外部Web服务器而这种代理方式是多个客户使用它访问内部Web服务器因此也被称为反向代理模式
基于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(即cn BOSS DNS)会给用户本地的DNS服务器提供一个NAT请求分配器(即网关)IP
NAT分配器它会根据特定的分配算法来决定要将连接交给哪一台内部 Apache httpd来处理请求大多数的NAT请求分配器提供了容错能力根据侦测各种WEB服务器的失效状况停止将请求分配给已经宕掉的服务器并且有些分配器还可以监测到WEB服务器机器的负载情况并将请求分配给负载最轻的服务器等等Linux Virtual Server是一个基于Linux操作系统上执行的VSNAT开源软件套件而且它有丰富的功能和良好的说明文件商业硬件解决方案 Foundry Networks的ServerIron是目前业界公认最佳的请求分配器之一
Apache httpd + Mod_JK在这里是作为负载均衡器那为什么要做集群呢?如果集群系统要具备容错能力以便在任何单一的硬件或软件组件失效时还能%可用那么集群系统必须没有单点故障之忧所以不能只架设一台有mod_jk的Apache httpd因为如果 httpd或mod_jk失效了将不会再有请求被会送交到任何一个Tomcat 实例这种情况下Apache httpd就是瓶劲特别在访问量大的网站
Mod_JK负载均衡与故障复原决定把Apache httpd当成web服务器而且使用mod_jk将请求传送给Tomcat则可以使用mod_jk的负载均衡与容错功能在集群系统中带有mod_jk的Apache httpd可以做的事情包括
A 将请求分配至一或多个Tomcat实例上
你可以在mod_jk的workersproperties文件中设定许多Tomcat实例并赋于每个实例一个lb_factor值以作为请求分配的加权因子
B侦测Tomcat实例是否失败
当Tomcat实例的连接器服务不再响应时mod_jk会及时侦测到并停止将请求送给它其他的Tomcat实例则会接受失效实例的负载
C侦测Tomcat实例在失效后的何时恢复
因连接器服务失效而停止将请求分配给Tomcat实例之后mod_jk会周期性地检查是否已恢复使用性并自动将其加入现行的Tomcat实例池中
Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制这里提示一下就是对每个请求的处理Tomcat都会进行会话复制复制后的会话将会慢慢变得庞大
Mod_jk同时支持会话亲和和会话复制在tomcat 中如何实现会话亲和和会话复制?把serverxml中的标签去掉就实现会话亲和把标签加上就实现会话复制
会话亲和就是表示来自同会话的所有请求都由相同的Tomcat 实例来处理这种情况下如果Tomcat实例或所执行的服务器机器失效也会丧失Servlet的会话数据即使在集群系统中执行更多的Tomcat实例也永远不会复制会话数据这样是提高集群性能的一种方案但不具备有容错能力了
使用会话复制则当一个Tomcat实例宕掉时由于至少还有另一个Tomcat实例保有一份会话状态数据因而数据不会丧失但性能会有所降低