型的企业应用天天都须要承受巨大的访问量,在着巨大访问量的背后有数台服务器支撑着,若是一台服务器崩溃了,那么其余服务器可使企业应用继续运行,用户对服务器的运做是透明化的,如何实现这种透明化呢?由以下问题须要解决。
一.Session的复制
二.如何将请求发送到正常的服务器
针对以上问题,可使用群集和负载均衡来解决,总体架构以下:
php
中间由一台服务器作负载均衡(Load Balancer),它将全部请求,根据必定的负载均衡规则发送给指定的群集服务器(Cluster),群集服务器拥有着相同的状态和相同的应用程序,而且他们的Session是相互复制的,这样,无论访问哪台服务器都具备相同的结果,即便一台服务器崩溃掉之后,能够由其余集群服务器继续负责应用程序的运行。
Tomcat中如何配置群集咱们假设有以下场景,一台负载均衡服务器负责请求的均衡,群集服务器A和群集服务器B组成一个群集,当某个群集服务器崩溃后,另一台继续负责应用程序的运行。
一. 配置Tomcat5.5.12群集服务器A
修改Tomcat配置文件server.xml
1.群集服务器A的端口号与B不冲突,即便Server Port,Connector,Coyote/JK2 AJP Connector的端口号惟一
2.在Host元素下增长如下内容:
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessi
useDirtyFlag="true"
notifyListeners>
<!--每一个群集服务器都须要有相同的Membership配置-->
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<!--tcpListenAddress:本机IP地址服务器将此地址广播给其余群集服务器-->
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="10.10.13.145"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicati
ackTimeout="15000"
waitForAck="true"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
3.修改Web应用程序配置文件web.xml
在web.xml文件中<web-app>元素下增长如下内容:
<!--此应用将与群集服务器复制Session-->
<distributable/>
二. 配置Tomcat5.5.12群集服务器B
与群集服务器A配置基本相同,惟一不一样的地方就是server.xml文件中
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="10.10.13.145"
tcpListenPort="4002"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
tcpListenAddress应为本机地址,若是两台群集服务器在一台机器上,则端口号要不一样
注意:B的其余端口不要与A冲突。
三. 群集服务器具体配置结果
Mcast*用于广播,全部群集服务器须要填写相同的配置
tcpListen*本机的IP,群集服务器启动时,会将本身的IP和端口号广播出去,其余群集服务器收到后,响应广播发出者。
四. 测试群集
启动群集服务器A,再启动群集服务器B会显示群集服务器的信息,表示群集服务器配置成功
五.配置负载均衡服务器Apache2.2.3
如今虽然群集已经有了相同的状态,但须要不一样的IP地址才能访问到服务器A与B,如今咱们配置一台负载均衡服务器来实现统一的入口访问,和负载的均衡。
下载Apache服务器2.2.3。
修改httpd.conf文件
将如下Module的注释去掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
并增长如下元素
ProxyRequests Off
ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On
<Proxy balancer://mycluster>
BalancerMember http://10.10.13.145:9080/helloworld
BalancerMember http://10.10.13.145:10080/helloworld smax=1 loadfactor=20
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from all
</Location>
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from all
</Location>
其中
ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On
<Proxy balancer://mycluster>
BalancerMember http://10.10.13.145:9080/helloworld
BalancerMember http://10.10.13.145:10080/helloworld smax=1 loadfactor=20
</Proxy>
ProxyPass为代理转发的Url,即将全部访问/helloworld的请求转发到群集balancer://mycluster
BalancerMember为群集的成员,即群集服务器A或B,负载均衡服务器会根据均衡规则来将请求转发给BalancerMember。
(能够同时配置几个站点)
配置好后,启动Apahce服务器,访问localhost/hellworld就会看到群集服务器中应用返回的结果。恭喜你,负载均衡和群集已经配置成功了。 css
1、集群和负载均衡的概念html
(一)集群的概念java
集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合,为用户提供网络服务或应用程序(包括数据库、Web服务和文件服务等)的单一客户视图,同时提供接近容错机的故障恢复能力。集群系统通常经过两台或多台节点服务器系统经过相应的硬件及软件互连,每一个群集节点都是运行其本身进程的独立服务器。这些进程能够彼此通讯,对网络客户机来讲就像是造成了一个单一系统,协同起来向用户提供应用程序、系统资源和数据。除了做为单一系统提供服务,集群系统还具备恢复服务器级故障的能力。集群系统还可经过在集群中继续增长服务器的方式,从内部增长服务器的处理能力,并经过系统级的冗余提供固有的可靠性和可用性。
(二)集群的分类
一、高性能计算科学集群:
以解决复杂的科学计算问题为目的的IA集群系统。是并行计算的基础,它能够不使用专门的由十至上万个独立处理器组成的并行超级计算机,而是采用经过高速链接来连接的一组1/2/4 CPU的IA服务器,而且在公共消息传递层上进行通讯以运行并行应用程序。这样的计算集群,其处理能力与真正超级并行机相等,而且具备优良的性价比。
二、负载均衡集群:
负载均衡集群为企业需求提供更实用的系统。该系统使各节点的负载流量能够在服务器集群中尽量平均合理地分摊处理。该负载须要均衡计算的应用程序处理端口负载或网络流量负载。这样的系统很是适合于运行同一组应用程序的大量用户。每一个节点均可以处理一部分负载,而且能够在节点之间动态分配负载,以实现平衡。对于网络流量也如此。一般,网络服务器应用程序接受了大量入网流量,没法迅速处理,这就须要将流量发送给在其它节点。负载均衡算法还能够根据每一个节点不一样的可用资源或网络的特殊环境来进行优化。
三、高可用性集群:
为保证集群总体服务的高可用,考虑计算硬件和软件的容错性。若是高可用性群集中的某个节点发生了故障,那么将由另外的节点代替它。整个系统环境对于用户是一致的。web
实际应用的集群系统中,这三种基本类型常常会发生混合与交杂。算法
(三)典型集群
科学计算集群:
一、Beowulf
当谈到 Linux 集群时,许多人的第一反映是 Beowulf。那是最著名的 Linux科学软件集群系统。实际上,它是一组适用于在 Linux 内核上运行的公共软件包的通称。其中包括流行的软件消息传递 API,如“消息传送接口”(MPI) 或“并行虚拟机”(PVM),对 Linux 内核的修改,以容许结合几个以太网接口、高性能网络驱动器,对虚拟内存管理器的更改,以及分布式进程间通讯 (DIPC) 服务。公共全局进程标识空间容许使用 DIPC 机制从任何节点访问任何进程。
二、MOSIX
Beowulf相似于给系统安装的一个支持集群的外挂软件,提供了应用级的集群能力。而MOSIX是完全修改Linux的内核,从系统级提供了集群能力,它对应用而言是彻底透明的,原有的应用程序,能够不经改动,就能正常运行在MOSIX系统之上。集群中的任何节点均可以自由地加入和移除,来接替其它节点的工做,或是扩充系统。MOSIX 使用自适应进程负载均衡和内存引导算法使总体性能最大化。应用程序进程能够在节点之间实现迁移,以利用最好的资源,这相似于对称多处理器系统能够在各个处理器之间切换应用程序。因为MOSIX经过修改内核来实现集群功能,因此存在兼容性问题,部分系统级应用程序将没法正常运行。数据库
负载均衡/高可用性集群
三、LVS(Linux Virtual Server)
这是一个由国人主持的项目。
它是一个负载均衡/高可用性集群,主要针对大业务量的网络应用(如新闻服务、网上银行、电子商务等)。
LVS是创建在一个主控服务器(一般为双机)(director)及若干真实服务器(real-server)所组成的集群之上。real-server负责实际提供服务,主控服务器根据指定的调度算法对real-server进行控制。而集群的结构对于用户来讲是透明的,客户端只与单个的IP(集群系统的虚拟IP)进行通讯,也就是说从客户端的视角来看,这里只存在单个服务器。
N54537Real-server能够提供众多服务,如ftp, http, dns, telnet, nntp, smtp 等。主控服务器负责对Real-Server进行控制。客户端在向LVS发出服务请求时,Director会经过特定的调度算法来指定由某个Real-Server来应答请求,而客户端只与Load Balancer的IP(即虚拟IP,VIP)进行通讯。apache
其余集群:
如今集群系统可谓五花八门,绝大部分的OS开发商,服务器开发商都提供了系统级的集群产品,最典型的是各种双机系统,还有各种科研院校提供的集群系统。以及各种软件开发商提供的应用级别的集群系统,如数据库集群,Application Server 集群,Web Server集群,邮件集群等等。windows
(四)负载均衡浏览器
一、概念
因为目前现有网络的各个核心部分随着业务量的提升,访问量和数据流量的快速增加,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本没法承担。在此状况下,若是扔掉现有设备去作大量的硬件升级,这样将形成现有资源的浪费,并且若是再面临下一次业务量的提高时,这又将致使再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能知足当前业务量增加的需求。
针对此状况而衍生出来的一种廉价有效透明的方法以扩展示有网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性的技术就是负载均衡(Load Balance)。
二、特色和分类
负载均衡(Server Load Balance)通常用于提升服务器的总体处理能力,并提升可靠性,可用性,可维护性,最终目的是加快服务器的响应速度,从而提升用户的体验度。
负载均衡从结构上分为本地负载均衡(Local Server Load Balance)和地域负载均衡(Global Server Load Balance)(全局负载均衡),一是指对本地的服务器群作负载均衡,另外一是指对分别放置在不一样的地理位置、有不一样的网络及服务器群之间做负载均衡。
地域负载均衡有如下的特色:
(1)解决网络拥塞问题,服务就近提供,实现地理位置无关性
(2)对用户提供更好的访问质量
(3)提升服务器响应速度
(4)提升服务器及其余资源的利用效率
(5)避免了数据中心单点失效
三、负载均衡技术主要应用
(1)DNS负载均衡 最先的负载均衡技术是经过DNS来实现的,在DNS中为多个地址配置同一个名字,于是查询这个名字的客户机将获得其中一个地址,从而使得不一样的客户访问不一样的服务器,达到负载均衡的目的。DNS负载均衡是一种简单而有效的方法,可是它不能区分服务器的差别,也不能反映服务器的当前运行状态。
(2)代理服务器负载均衡 使用代理服务器,能够将请求转发给内部的服务器,使用这种加速模式显然能够提高静态网页的访问速度。然而,也能够考虑这样一种技术,使用代理服务器将请求均匀转发给多台服务器,从而达到负载均衡的目的。
(3)地址转换网关负载均衡 支持负载均衡的地址转换网关,能够将一个外部IP地址映射为多个内部IP地址,对每次TCP链接请求动态使用其中一个内部地址,达到负载均衡的目的。
(4)协议内部支持负载均衡 除了这三种负载均衡方式以外,有的协议内部支持与负载均衡相关的功能,例如HTTP协议中的重定向能力等,HTTP运行于TCP链接的最高层。
(5)NAT负载均衡 NAT(Network Address Translation 网络地址转换)简单地说就是将一个IP地址转换为另外一个IP地址,通常用于未经注册的内部地址与合法的、已获注册的Internet IP地址间进行转换。适用于解决Internet IP地址紧张、不想让网络外部知道内部网络结构等的场合下。
(6)反向代理负载均衡 普通代理方式是代理内部网络用户访问internet上服务器的链接请求,客户端必须指定代理服务器,并将原本要直接发送到internet上服务器的链接请求发送给代理服务器处理。反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的链接请求,而后将请求转发给内部网络上的服务器,并将从服务器上获得的结果返回给internet上请求链接的客户端,此时代理服务器对外就表现为一个服务器。反向代理负载均衡技术是把未来自internet上的链接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。
(7)混合型负载均衡 在有些大型网络,因为多个服务器群内硬件设备、各自的规模、提供的服务等的差别,咱们能够考虑给每一个服务器群采用最合适的负载均衡方式,而后又在这多个服务器群间再一次负载均衡或群集起来以一个总体向外界提供服务(即把这多个服务器群当作一个新的服务器群),从而达到最佳的性能。咱们将这种方式称之为混合型负载均衡。此种方式有时也用于单台均衡设备的性能不能知足大量链接请求的状况下。
2、搭建集群和实现负载平衡
(一)前期准备
个人系统用的是windowsXP专业版,我要作的是,用一个apache和多个(这里以两个做为示例)tomcat,经过jk方式,构造一个集群。如下是要首先准备的东西:
一、jdk,我用的版本是jdk1.5.0_06,下载地址是http://192.18.108.216/ECom/EComTicketServlet/BEGIND597A309654D73D910E051D73D539D5F/-2147483648/2438196255/1/852050/851882/2438196255/2ts+/westCoastFSEND/jdk-1.5.0_13-oth-JPR/jdk-1.5.0_13-oth-JPR:3/jdk-1_5_0_13-windows-i586-p.exe
二、apache,我用的版本是2.2.4,下载地址是http://apache.justdn.org/httpd/binaries/win32/apache_2.2.4-win32-x86-openssl-0.9.8d.msi
三、tomcat,我用的版本是5.5的解压版本,这里要注意:不能用安装的版本,由于一台机器上装两个同样的tomcat,是会出错误的。下载地址是http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25.zip
四、jk,这个jk的版本,原本有两个的,可是版本2已经被废弃掉了,目前可用的jk版本是1.2.25。每一个apache的版本,都会有一个特定的jk与之对应,因此这里要用的jk也必须是为apache-2.2.4开发的那个才行。它的下载地址是http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.25/mod_jk-apache-2.2.4.so
有了这四样东西,咱们就能够开始作集群了。
(二)安装
一、相信须要看这篇文章的人,JDK的安装必定不会陌生,这里不在赘述。只是须要提醒一下:环境变量别忘记配置了。
二、安装apache也没有什么难度,就是在安装过程当中要配置域名、网址和管理员邮箱之类的信息,这个信息彻底能够按照提示,而后修改下填入便可,以后想修改的话直接到配置文件中改就好了。除了这个地方,还要保证机器上的80端口没有被其余程序占用。至于安装路径,彻底取决于我的爱好。其余的默认就好了。安装成功后,系统右下角的托盘区会有个图标,咱们能够经过这个启动apache,若是那个小红点变成绿色,说明服务已经正常启动了(若是服务没有启动起来,说明安装过程当中的配置有错误,建议卸载后重装)。若是按照默认,端口是80的话,那打开浏览器,输入:http://localhost/ ,应该能够看到 " It works “的字样。这样就能够进入下一步了。
三、解压缩tomcat,记得要作两份。这里不妨将两个tomcat命名为:tomcat-5.5.25_1和tomcat-5.5.25_2,其实这两个文件夹中的东西是彻底同样的。可是我为了在同一台机器上作集群,那就要保证两个tomcat运行起来不会在端口上起冲突。进入tomcat-5.5.25_1/conf目录,用文本编辑器打开并修改server.xml,将该tomcat的默认8080端口改成8088(其实不必改,我改这个是由于我机器上还有其余tomcat占用着8080端口)。而后进入tomcat-5.5.25_2/conf目录,一样将8080修改掉,至于改为多少没多大关系,只要不占用其余程序的端口,应该不会出什么问题。这样,tomcat就算安装好了。
四、jk这东西是一个链接模块,不用安装,直接将mod_jk-apache-2.2.4.so这个文件拷贝到apache安装目录下的modules文件夹下面就好了。
这样,安装完成,下面开始配置。
(三)配置
这个地方才是搭建集群的关键所在,我也会尽个人可能写的详细点。
一、配置tomcat
为防止冲突,进入第二个tomcat主目录,而后进入conf目录,打开server.xml修改配置。主要是修改端口,我这里把全部的端口信息,都在原有基础上加1000,即原端口是8009,我改成9009。固然,你没必要和我同样,只要保证不冲突就OK!这些配置在apache的配置中可能会用到。
二、配置apache
(1)进入apache的主目录,而后进入conf文件夹,用文本编辑器打开httpd.conf,在该文件末尾加上以下几行:
### 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk-apache-2.2.4.so
### 配置 mod_jk
JkWorkersFile conf/workers.properties #加载集群中的workers
JkMountFile conf/uriworkermap.properties #加载workers的请求处理分配文件
JkLogFile logs/mod_jk.log #指定jk的日志输出文件
JkLogLevel warn #指定日志级别
(2)不要改变目录,新建一个文件:workers.properties,该文件用来配置web容器的信息。该文件的内容以下:
# worker列表
worker.list=controller, status
#第一个server的配置,server名为s1
#ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.s1.port=8009
#tomcat的主机地址,如不为本机,请填写ip地址
worker.s1.host=localhost
worker.s1.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.s1.lbfactor=1
#第二个server的配置,server名为s2
worker.s2.port=9009
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.lbfactor=1
#server名为controller,用于负载均衡
worker.controller.type=lb
worker.retries=3 #重试次数
#指定分担请求的server列表,用逗号分隔
worker.controller.balanced_workers=s1,s2
#设置用于负载均衡的server的session能否共享 有很多文章说设置为1是能够的,可是我是设置为0才能够的
worker.controller.sticky_session=0
#worker.controller.sticky_session_force=1
worker.status.type=status
(3)不要改变目录,新建一个文件:uriworkermap.properties,文件内容以下:
/*=controller #全部请求都由controller这个server处理
/jkstatus=status #全部包含jkstatus请求的都由status这个server处理
!/*.gif=controller #全部以.gif结尾的请求都不禁controller这个server处理,如下几个都是同样的意思
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller
这里的"!”相似于java中的"!”,是“非”的意思。
这样,apache一块就配置好了。
三、再修改tomcat配置:这里两个tomcat都要配置。
仍然是打开第一步中的那个server.xml文件,找到<Engine name="Catalina" defaultHost="localhost">这一行,在里面加上一句:jvmRoute="s1",即把该句改成:<Engine name="Catalina" defaultHost="localhost" jvmRoute="s1">。这里的s1就是第二步中配置的用于负载均衡的server的名称。若是该tomcat的端口是第二步中s1用的端口,那这里就写s1,第二个tomcat就应该是s2了。
这样,配置就完成了。
(四)运行
进入两个tomcat的bin目录,执行两个tomcat的startup.bat启动这两个tomcat,而后将apache从新启动后,运行起来看看效果吧。若是不出意外,两个tomcat的窗口应该是你一次我一次的打印日志信息了,并且此时session也是共享了的。
到这里,集群搭建好了,负载均衡也实现了。