1.了解
1.1集群相关
集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。如一个提供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也可以单独提供
服务。
特点:在现有网络结构之上,负载均衡提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。集群系统(Cluster)主
要解决下面几个问题:
1高可靠性(HA):利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
2高性能计算(HP):即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。
3负载平衡:即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
总体来说,在负载均衡的思路下,多台服务器为对等方式,每台服务器都具有同等的地位,可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术,将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上,而接收到请求的服务器都独立
回应客户机的请求。
提供服务的一组服务器组成了一个应用服务器集群(cluster),集群下的对等多机环境可以增加系统的并发处理能力,和单台机器出现故障系统的错误冗余能力;同时实现了负
载均衡和系统高可靠性。
2.常用负载均衡技术
2.1. 基于DNS的负载均衡
通过DNS服务中的随机名字解析来实现负载均衡,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时 得到其中一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,他们也就访问不同地址上的Web服务器,从而达到负载均衡的目的。
主要优点
第一,技术实现比较灵活、方便,简单易行,成本低,适用于大多数TCP/IP应用。不需要网络专家来对之进行设定,或在出现问题时对之进行维护。
第二,对于Web应用来说,不需要对代码作任何的修改。事实上,Web应用本身并不会意识到负载均衡配置,即使在它面前。
第三,Web服务器可以位于互联网的任意位置上。
主要缺点
第一,不能够按照Web服务器的处理能力分配负载。DNS负载均衡采用的是简单的轮循负载算法,不能区分服务器之间的差异,不能反映服务器的当前运行状态。所以DNS服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况。如果后台的Web服务器的配置和处理能力不同,最慢的 Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用。不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。
第二,不支持高可靠性,DNS负载均衡技术没有考虑容错。如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS请求分配到这台故障服务器上,导致不能响应客户端。
第三,可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
第四,一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。
http://blog.csdn.net/flynetcn/article/details/3733574
2.2. 反向代理负载均衡 (如Apache+JK2+Tomcat)
反向代理(ReverseProxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种带理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。
主要优点
第一,反向代理负载均衡能以软件方式来实现,如apache mod_proxy、netscape proxy等,也可以在高速缓存器、负载均衡器等硬件设备上实现。反向代理负载均衡可以将优化的负载均衡策略和代理服务器的高速缓存技术结合在一起,提升静态网页的访问速度,提供有益的性能
第二,由于网络外部用户不能直接访问真实的服务器,具备额外的安全性(同理,NAT负载均衡技术也有此优点)。
主要缺点
第一,反向代理是处于OSI参考模型第七层应用的,所以就必须为每一种应用服务专门开发一个反向代理服务器,这样就限制了反向代理负载均衡技术的应用范围,现在一般都用于对web服务器的负载均衡。
第二,针对每一次代理,代理服务器就必须打开两个连接,一个对外,一个对内,因此在并发连接请求数量非常大的时候,代理服务器的负载也就非常大了,在最后代理服务器本身会成为服务的瓶颈。
2.3. 基于NAT(NetworkAddress Translation)的负载衡技术(如Linux Virtual Server,简称LVS)
网络地址转换为在内部地址和外部地址之间进行转换,以便具备内部地址的计算机能访问外部网络,而当外部网络中的计算机访问地址转换网关拥有的某一外部地址时,地址转换网关能将其转发到一个映射的内部地址上。因此如果地址转换网关能将每个连接均匀转换为不同的内部服务器地址,此后外部网络中的计算机就各自与自己转换得到的地
址上服务器进行通信,从而达到负载分担的目的。
主要优点和缺点
基于NAT的负载衡技术与基于DNS的负载均衡都是通过改变一定范围内地址,因此与DNS类似,只是基于NAT的负载衡技术是通过改变地址转换网关实现,而基于DNS的负载均衡通过改变DNS的域名和IP地址关系实现的。因此与基于DNS的负载均衡的优缺点类似。
3.搭建工具
Apache介绍: apache是(http://www.mamicode.com/info-detail-1156329.html)
http://blog.csdn.net/xifeijian/article/details/17385741
3.1搭建原理
这里Apache+JK+Tomcat这种组合实现负载均衡。原理图如下
3.2 准备软件
JDK:选用版本为 jdk1.8.0_11.tar.gz下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Apache:选用版本 httpd-2.4.27.tar.gz,下载地址:https://httpd.apache.org/download.cgi
Tomcat:选用版本apache-tomcat-8.5.16.tar.gz,安装包下载地址:https://tomcat.apache.org/download-80.cgi
JK:选用版本tomcat-connectors-1.2.42-src.tar.gz安装包下载地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/
Apache依赖插件有apr,apr-util和pcre。
参考地址http://jingyan.baidu.com/article/ab0b5630b632dbc15afa7dc4.html,
http://blog.csdn.net/heyongluoyao8/article/details/51341014?locationNum=2&fps=1
4.搭建过程
4.1 apache介绍
apache 是一个 web 服务器环境程序,可以作为web 服务器使用。Apache对并发请求的处理能力较tomcat强,对静态页面(html)的处理上比tomcat更为迅速,但apache不支持动态网页(需借助tomcat)。
实际应用中可以搭建apache+tomcat负载均衡集群,一个apache 作为 Web 服务器,为网站的静态页面请求提供服务;并使用tomcat 服务器作为一个 Servlet/JSP 插件,用于处理网站的动态页面。当用户通过浏览器发出请求时,客户请求首先会发送到 apache,如果请求是静态文本则由 apache 解析,并把结果返回给客户端;如果是动态的请求,如 jsp,apache 会把解析工作交给 tomcat,由 tomcat 进行解析(这首先要两者现实整合),tomcat 解析完成后,结果仍是通过 apache 返回给客户端。这样就可以达到分工合作,实现负载均衡,提高系统的性能!
Apache web服务器软件拥有以下特性:
支持最新的HTTP/1.1通信协议
拥有简单而强有力的基于文件的配置过程
支持通用网关接口
支持基于IP和基于域名的虚拟主机
支持多种方式的HTTP认证
集成Perl处理模块
集成代理服务器模块
支持实时监视服务器状态和定制服务器日志
支持服务器端包含指令(SSI)
支持安全Socket层(SSL)
提供用户会话过程的跟踪
支持FastCGI
http://baike.baidu.com/link?url=xsz21RDHsUn3o9oGcUW_1wBmFrD72L7kfG1HOQZZUFwBwRz7kVyzC6CS_SMXG1SCuATmCQwu-G3PUO3s0lOh8K
4.2总体结构
如下图4-1,集群由三虚拟机(linux系统centOS6.3版本)组成,其中一台安装apache和tomcat提供给apache的中间件jk(主要实现apache和tomcat的通讯等功能),另外两台机器安装tomcat服务器(和jdk)。网络请求通过http请求到apache服务器,再由apache服务器通过ajp协议传递一个session(会话)给一个tomcat(根据均衡配置选择tomcat)服务器,这个tomcat处理请求返回session给apache,再由apache服务器返回结果。(也可以在tomcat配置让网络请求还可以通过http协议直接访问)
图4-1总体结构图
4.3安装过程
1.先在三台机器安装CentOS6.3。
2.安装jdk(机器Jvm1,jvm2)
先用java –version命令检测是否有jdk
如果有删除
在安装下载的jdk(如jdk1.8.0_11.tar.gz)到/usr/java/目录(如果目录不存在创建目录)
安装成功配置环境变量
具体安装过程可以参考http://www.th7.cn/system/lin/201408/68420.shtml
3.安装tomcat
(1)将安装包从/software目录拷贝到/usr/local目录下
#cp apache-tomcat-8.5.16 .tar.gz /usr/local
(2)定位到文件夹/usr/local/。
#cd /usr/local
(3)解压安装包到当前目录。
#tar -zxvf apache-tomcat-8.5.16 .tar.gz
(4)修改配置文件,增加java的环境变量信息。在/usr/local/apache-tomcat-8.5.16/bin下有文件catalina.sh在文件头部增加下列信息:
export JAVA_HOME=/usr/local//Java/apache-tomcat-8.5.16
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
(5)启动tomcat
进入目录/usr/local/tomcat/apache-tomcat-8.5.16/bin
执行启动命令
#./startup.sh
在/usr/local/tomcat/apache-tomcat-8.5.16/bin下有可执行程序。
(1)启动tomcat服务:
#./startup.sh
# ./catalina.sh start
(2)关闭tomcat服务:
# ./shutdown.sh
#./catalina.sh stop
java web项目发布
(1)用eclipse将编译好的Java Web项目导出成war包。
(2)将war包放置到linux服务器上的tomcat的webapps目录下。如本次配置放在/usr/local/tomcat/apache-tomcat-8.5.16/webapps下。
(3)启动tomcat后,tomcat会自动将war包解压并运行Java Web项目。
(4)打开浏览器,输入http://ip(tomcat机器ip)/name(项目名),就可以访问项目。
3.Apache安装(apache机器)
http://blog.csdn.net/u013142781/article/details/50753534
4.mod_jk安装(apache机器)
mod_jk的作用:连接apache和tomcat集群的中间件。
mod_jk的安装包:tomcat-connectors-1.2.42-src.tar.gz。
安装步骤如下:
(1)将安装包从/software目录拷贝到/usr/local目录下(图形界面下直接“复制”-“粘贴”即可)。
#cp /software/tomcat-connectors-1.2.37-src.tar.gz/usr/local
(2)定位到文件夹/usr/local/。
#cd /usr/local
(3)解压安装包到当前目录。
# tar -zxvf tomcat-connectors-1.2.42-src.tar.gz
(4)编译安装mod_jk。
#cd /tomcat-connectors-1.2.42-src/native
# chmod 755 buildconf.sh
# ./buildconf.sh
# ./configure --with-apxs=/usr/local/apache/bin/apxs
# make
# make install
(5)将/ tomcat-connectors-1.2.42-src /apache-2.0下的mod_jk.so文件拷贝到apache安装目录下的modules文件夹下面。
# cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/
5.负载均衡集群配置
(1)修改Tomcat/conf路径下的server.xml
修改< Connector>节点值,使用ajp连接apache和tomcat时的配置。修改成如下形式:
<Connectorport="8009" protocol="AJP/1.3" redirectPort="8443" />
去掉<Engine>注释修改jvmRoute的值为“tomcat实例名”(不同的tomcat赋予不同值,此处安装了两个tomcat,分别命名为jvm1和jvm2)
<Enginename="Catalina" defaultHost="localhost"jvmRoute="jvm1">
在<Engine>元素(或者<host>)下添加以下内容(到tomcat官网下载必须和tomcat版本对应官网地址http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html)
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
2.项目配置
使用Eclipse创建Maven webapp程序eID-APIService,在WEB-INF的web.xml中加上<distributable/>
元素,要放在servlet元素前面(不然不报错),然后打成war包分别拷贝到jvm1与jvm2的webapps下。
3Apache配置
修改 httpd.conf
- 编辑在apache httpd安装目录的conf目录下(此处是apache/conf)的httpd.conf文件,在文件追加以下内容:
# Load mod_jkmodule
LoadModule jk_module modules/mod_jk.so
# Specify jklog file.
JkLogFile /var/log/mod_jk.log
# Specify jklog level [debug/error/info]
JkLogLevel info
# Specifyworkers.properties, this file tell jk:
# how manynodes and where they are.
<Directory />
Options IndexesFollowSymLinks
AllowOverrideNone
</Directory>
<Directory />
Options IndexesFollowSymLinks ExecCGI
AllowOverrideNone
</Directory>
JkWorkersFile /usr/local/apache/conf/workers.properties(自己创建)
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat"[%a %b %d%H:%M:%S %Y]"
#JkOptionsindicate to send SSL KEYSIZE,
JkOptions +ForwardKeySize+ForwardURICompat -ForwardDirectories
#JkRequestLogFormat set the requestformat
JkRequestLogFormat "%w %V %T %q %U%R"
#JkShmFileto put logs
JkShmFile/usr/local/apache/logs/mod_jk.shm
</IfModule>
JkMount /* controller (逻辑服务器与workers.properties对应)
编辑workers.properties(controller与httpd.conf的controller对应,jvm1,jvm2信息与机jvm1,jvm2,的server.Xml配置信息对应)
worker.list=controller,jvm1,jvm2
worker.jvm1.host=192.168.133.139
worker.jvm1.port=8009
worker.jvm1.type=ajp13
worker.jvm1.lbfactor = 1
worker.jvm2.host=192.168.133.140
worker.jvm2.port=8009
worker.jvm2.type=ajp13
worker.jvm2.lbfactor = 1
worker.controller.type=lb
worker.controller.balance_workers=jvm1,jvm2
worker.controller.sticky_session=True
6.启动
启动jvm1,和jvm2的tomcat服务器和apache
在浏览器访问apache所在的主机IP地址如http://192.168.1141/student/rest/getname?name=ddd
Apache就会选择一个tomcat交换,并返回tomcat服务器的处理结果
参考资料
[0] http://jingyan.baidu.com/article/ab0b5630b632dbc15afa7dc4.html
[1] http://blog.csdn.net/bluishglc/article/details/6867358
[2] tomcat官方关于tomcat集群配置的文档:
http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
[3] tomcat官方关于Apache TomcatConnector的文档
http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
[4] apache官方关于apache的安装文档
http://httpd.apache.org/docs/2.4/en/install.html
[5] apache官方关于configure参数的文档
http://httpd.apache.org/docs/2.4/en/programs/configure.html#installationdirectories