- 浏览: 4414545 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (163)
- 职场 && 心情 (22)
- Java/Basic (17)
- Java/Compression (7)
- Java/Security (20)
- Java/Maven (3)
- Java/Cache (11)
- Eclipse (4)
- Spring (19)
- ORM/Hibernate (2)
- ORM/iBatis (3)
- DB/NoSQL (11)
- DB/MySQL (7)
- DB/MS SQL Server (4)
- OS/Linux (11)
- OS/Mac (7)
- C/C++ (4)
- Server Architecture/Basic (13)
- Server Architecture/Distributed (17)
- Moblie/Andriod (2)
- WebService (3)
- Objective-C (1)
- Html (1)
- 设计模式 (1)
- Scala (0)
- Kafka (1)
最新评论
-
w47_csdn:
证书安装:在"浏览"选项中选择" ...
Java加密技术(九)——初探SSL -
w47_csdn:
spiritfrog 写道你好,我按照你的步骤,tomcat中 ...
Java加密技术(九)——初探SSL -
liuyachao111:
11楼说的对 用@ControllerAdvicepublic ...
Spring 注解学习手札(八)补遗——@ExceptionHandler -
irayslu:
作者你好, 我把你的源码放在jdk6, jdk7 中运行正常, ...
Java加密技术(五)——非对称加密算法的由来DH -
夏季浅忆-卖小子:
为什么不能解压rar格式的压缩包呢
Java压缩技术(三) ZIP解压缩——Java原生实现
Apache 和 Tomcat原本就是一家,更是一家亲!Apache与Tomcat整合,无非是将Apache作为前端根据请求路径、端口、代理分发给多个Tomcat,以到达转发和负载均衡的目的!同时,通过Apache和Tomcat相互作用,进行粘性会话,会话拷贝构建集群!这一切的最终结果就是“云服务”!不要说Session不重要,当下火爆的团购,如果离开Session还能快活多久?如何保证Session同步,仍然是不能回避的问题!
这里要说的是基于HTTP和AJP跳转方式的负载均衡实现,关于JK,由于效率问题一直成为诟病,并且mod_jk2模块已经不再被更新了,这里就不折腾它的复杂配置了!
至于说Apache+Tomcat+SSL,并不是难题!只要完成了Apache+SSL然后配置相应的负载均衡、反向代理等等就可以达到目的,相关Apache+SSL参考征服 Apache + SSL
Ubuntu Server 10.04版本,Apache选用2.2.14,Tomcat选用6.0.24。
相关内容:
征服 Apache + SSL
征服 Apache + SVN
征服 Apache + SVN + LDAP
征服 Apache + Tomcat
征服 Nginx
征服 Nginx + Tomcat
步骤:
1.安装Apache相关模块
负载均衡需要的主要是代理模块!
经过几次Apache配置尝试,在Ubuntu下配置Apache实在是太容易了。加载什么模块、取消什么模块两个命令搞定。
这里,我们需要让Apache提供代理服务,其中又包含基于http、ftp、ajp等等协议的代理功能,同时还需要负载均衡模块。我们可以通过命令逐个加载:
完成上述操作后,系统会提示重启Apache!
先不着急重启,现学现卖,了解下Apache的目录结构。在Ubuntu下配置Apache主要是在/etc/apache2目录下:
分述:
罗嗦了一堆,下面配置负载均衡部分。
执行修改:
上图红框中的内容是原始内容,白框中的内容是我新加的部分。
注意红框中的配置:
在默认配置中,Deny from all处于可用状态。当我们配置其他代理节点时,将导致杜绝访问!使用Allow from localhost ip6-localhost 限制仅允许本机访问!
再说,白框中的内容:
这里,我配置了一个负载均衡节点balancer://zlex,其中包含了两个服务http://localhost:8080/和http://192.168.49.1:8080/,一个是虚拟机上的Tomcat、一个是真机上的Tomcat。这里使用的Http的转发方式,当然,使用AJP未尝不可,稍后详述!
这里的节点次序会有一个先后关系,Apache会将请求按照FIFO的方式调度顺次分配到各个节点上!如果其中有一个节点挂掉,将跳过该节点顺次寻找可用节点。
再说代理和反向代理:
这里配置,如果要访问/zlex路径时,将跳转到balancer://zlex上,也就是享受负载均衡!
2.后台监控
我们如何知道某个节点负载多少,响应时间多久,服务是否正常呢?Apache提供了负载均衡监控平台:http://localhost/balancer-manager。但是,这个服务默认是不存在。
除了用于负载均衡配置、监控的balancer-manager还有http://localhost/server-status和http://localhost/server-info
我们需要添加info模块:
同时,为了能够使用balancer-manager,我们需要配置:
把这段代码放到哪?由于它同属系统信息配置,我把它放到了info.conf中,说白了就是照猫画虎:
注意,这段代码放到了<IfModule mod_info.c>和</IfModule>之间!
现在,我们重启Apache:
来看看管理界面http://localhost/balancer-manager:
我们再来看看服务器基本信息http://localhost/server-info:
上述两个服务需要加载info模块,而服务器状态(server-status)不需要http://localhost/server-status:
3.负载均衡简单测试
疯狂访问http://localhost/zlex,直到手酸眼烦!
我这里故意使用不同了Tomcat界面,来验证自己的配置是否生效。更疯狂的是,我甚至把节点指向了百度、搜狐,来测试负载均衡的效果。如果你细致观察,Apache是将请求顺次分配到各个节点上的。
如果其中一个节点发生问题(例如,强行关闭一个Tomcat,或配置一个错误节点)Apache将会经过几次尝试后,绕过这个问题节点,寻找可以成功访问的节点。如果这个节点恢复正常使用,Apache将在该Tomcat恢复正常工作后大约1分钟内将该节点标识为可用!
现在,再看看现在的后台(http://localhost/balancer-manager)啥样子:
如果我们控制一个节点的状态是否可用,该怎么做:
涉及到负载量,session同步等等,我们最后讨论!
4.配置Tomcat相关模块(AJP)
基于Http协议分发并不复杂,但AJP效果更好!一次诡异事件中,内网访问正常,外网访问多次失败,最后通过AJP方式完美解决了!
在Tomcat中配置AJP也很简单,修改server.xml开启AJP模块:
开启AJP配置:
注意使用的端口port="8009",字符集URIEncoding="UTF-8",这是输入框、请求字符集乱码的入口!
接下里就可以通过AJP方式进行节点分发了。修改/etc/apache2/mods-available/proxy.conf :
将http改为ajp,将8080改为8009:
重启Apache:
再看看管理界面http://localhost/balancer-manager
至此,我们完成了基本负载均衡的基本配置!
/etc/apache2/mods-available/proxy.conf还有一些属性:
noFailOver是否打开失败转移,On|Off,默认为Off,添加在ProxyPass后面,如:
如果这样配置,当提供给你服务的服务器发生异常,那么你将一直看着它返回给你503,直到系统恢复正常!
loadfactor表示后台服务器负载到由Apache发送请求的权值,默认值为1添加在BalancerMember后面:
可以实现三种策略:
5.Session唯一,粘性会话
Apache已经可以轻松将内容处理的工作分配给各个Tomcat了!
当然,这还不够,Session还是个问题!
WHY?
我们来做一系列修改,来检测Session到底出现了什么问题!
先来改造Tomcat,修改server.xml:
修改<Engine />节点,增加jvmRoute属性:
另一个Tomcat设置改为
通过jvmRoute,指定了Tomcat唯一标识!
然后修改/etc/apache2/mods-available/proxy.conf
如下:
这里需要通过修改route属性,将Apache与Tomcat关联起来!
注意,Tomcat中定义的jvmRoute需要与Apache定义的route相对应!
我们来看一下http://localhost/balancer-manager发生了什么变化:
我们注意到route字段有了新的标识,当然,我们也可以通过这个配置界面修改这些信息,但当前修改不会真的修改/etc/apache2/mods-available/proxy.conf文件,Apache重启后将丢失。
为了更细致的对比进过复杂均衡的结果,这里增加了zlex应用!主要是监控Session的变化!
只看核心代码:
将其做成一个名为zlex的web应用,分别部署到两个Tomcat上!
然后重启Apache:
不断刷新http://localhost/zlex,看看真正的结果:
第1次:
第2次:
第3次:
第4次:
仔细观察,每次请求都按照负载均衡配置的节点次序依次请求到不同的Tomcat上。尤其是当我们通过jvmRoute和route做了绑定之后,信息更加准确。但是,仔细观察,每次请求的SessionID都是不一样!对于纯Web应用,尤其是依靠SessionID区分唯一用户的应用,这将是一场噩梦——解决了服务器压力均衡问题,却带来了SessionID不唯一问题!这就需要SessionID绑定,或者说叫做“会话复制”。
如果这时候你在页面上提交表单,将键值对保持在session中,在页面刷新后,将无法获得该信息,因为Seesion丢失了!
接着修改/etc/apache2/mods-available/proxy.conf,让SeesionID保持唯一:
增加stickySession属性:
stickySession粘性会话,根据这一属性,浏览器将通过cookie绑定SeesionID。如果这个时候再次访问http://localhost/zlex,你会发现,页面不会来回跳转了!
sticky是什么?
提交一个Session设定看看http://localhost/zlex:
观察后台日志:
再看看返回页面,这相当于一次页面刷新,如果正常粘性会话,我们将获得当前SessionID对应的一切信息:
这说明粘性会话生效了!
我们得到了形如
如果,换一个浏览器打开该页面http://localhost/zlex,将会获得一个新的SessionID,并且,根据Apache中配置的负载均衡节点列表依次访问下一个节点!
如果这时候负载均衡节点列表中某一节点发生异常,那么Apache将按照惯例,跳转该节点,并在该节点恢复正常后约1分钟内重新将其纳入可用节点!
修改刚才的jsp页面,看看Http头中都有些什么:
sticky模式的根本在于浏览器支持cookie,如果浏览器不支持cookie,则需要修改server.xml文件中的<Context />节点,将cookie置为false,关闭cookie功能,让jsessionid显式传递!
6.Tomcat集群,Session复制
经过两天反复研究,两只互不相认的Tomcat终于在网络上“资源共享”了——Session复制成功!
关于Tomcat集群以及Session复制,网上已经有很多很多,但是否真的能用?!为了确认这一问题,周末还跑到书店翻了翻《Apache Tomcat 高级编程》,参考Clustering/Session Replication HOW-TO(有点小错误),经过两天苦战,克服种种小问题,终于拿下!
整理概念:
群集,是包含多个服务器实例的指定集合,这些服务器实例共享相同的应用程序、资源以及配置信息。您可以将不同计算机上的服务器实例分组到一个逻辑群集中并将其作为一个单元来管理。您可以使用 DAS 轻松控制多机群集的生命周期。
群集可以实现水平可伸缩性、负载平衡和故障转移保护。根据定义,群集中的所有实例都具有相同的资源和应用程序配置。当群集中的服务器实例或计算机出现故障时,负载平衡器检测到该故障,会将通信从出现故障的实例重定向至群集中的其他实例,并恢复用户会话状态。由于群集中所有实例上的应用程序和资源都相同,因此一个实例可以故障转移至群集中的任何其他实例。
Session复制核心内容主要是:
因此,Session复制的这两个潜在问题,致使复杂均衡节点最多不会超过4个。因为,当节点数大于4时,整个集群的吞吐量将不再上升!
为了搭建Tomcat集群,我将两个Tomcat分别部署到两台虚拟机上,确保网段一致。(这一步很关键,我最初将Tomcat1(192.168.49.132)部署在虚拟机上,将Tomcat2(192.168.49.128)部署在本机上,结果,网络总有问题,耽误了很多时间。
)
由于变换了IP,我需要修改Apache的/etc/apache2/mods-available/proxy.conf文件:
修改负载均衡节点如下:
对于windows系统,不需要考虑网络问题,广播地址(这里用到224.0.0.0和240.0.0.0)默认开放,对于linux则需要通过命令开放地址。
Ubuntu上开放广播地址(eth0网卡):
然后通过-v参数查看当前开放的广播地址:
注意,重启后,该路由设置将丢失!
在Ubuntu下,可以考虑修改/etc/networks文件!
如果有必要,Windows上开放广播地址(192.168.49.128本机地址):
然后通过print参数查看当前开放的广播地址:
然后,修改tomcat的server.xml文件:
在<Engine /> 节点中加入如下内容:
这里需要注意<Membership />和Receiver:<Membership />节点的address属性是广播地址;Receiver节点的address属性是本地绑定地址。当然,默认为auto。由于我在启动Tomcat时,Tomcat频频将地址指向127.0.0.1,无奈只好使用固定IP。
此外,为了降低Session复制的成本,Tomcat通过<Valve />节点,以过滤器的方式控制哪些请求可以忽略Session复制:
同时,在<Host>节点中加入如下内容:
在Tomcat的官方文档(Tomcat 6)中,对于<Deployer />节点的部署位置是错误的,通过观察Tomcat启动日志,确认该节点应当不属于<Host />节点中!
注意:Tomcat 6与Tomcat5在上述节点中使用的类包(包中名称由cluster变化为ha)有所不同,且结构有所调整。
先别急着重启,我们需要修改应用中的web.xml文件,将<distributable />节点部署到<web-app />节点中,开启分布式服务:
注意:如果没有设置该节点,SessionID将不能保持同步,不同的服务器将各自建立独立的SessionID!
监控Tomcat日志:
然后重启Tomcat1:
观察日志:
注意两处红框:
第一处,Cluster启动,并绑定192.168.49.132:4000上,进行TCP通讯,并等待其它成员(Member)。
第二处,在管理器中注册/zlex,绑定JvmRouteBinderValve。
至此,说明集群设置已经生效,但不能说明集群配置成功!
接着我们启动Tomcat2,观察其日志:
Cluster启动,并绑定192.168.49.128:4000上并发现成员[b]192.168.49.132![/b]
再看Tomcat1的日志:
Tomcat1发现其成员Tomcat2!这说明TCP通讯已建立,Tomcat成员可以进行Session同步!
同时,Tomcat成员直接会每隔一个时间段相互侦测/验证其他成员是否正常:
现在,开始访问http://localhost/zlex,并不断刷新当前页面:
除了两处标识主机来源的tomcatX不同外,session是完全一致的!
提交一次修改,并不断刷新当前页:
如果仔细观察,当前SessionID在不断交替变化,这说明负载均衡在起作用!
我们再来看看2个Tomcat后台日志都做了什么!
Tomcat1:
Tomcat2:
两只猫都打印了相同的内容(a=1)不同的细节在于,sessionID带有服务器标识!
如果我们强行关闭Tomcat2:
首先,Tomcat1会很快侦测到Tomcat2离线,因为这是TCP通讯,成员之间很容易检测到其他成员是否离线!Tomcat1后台日志如下:
其次,Apache会侦测到Tomcat2发生异常,将其余请求转交给其他节点,即交由Tomcat1处理!
继续刷新http://localhost/zlex当前页面,耐心等待几秒。你会发现,即便再次刷新页面,sessionID仍旧绑定在标识tomcat1服务器上。
然后,我们恢复Tomcat2服务,Tomcat1会马上侦测到Tomcat2已经恢复正常:
最后,我们再次刷新当前页,Apache已经将请求分发给Tomcat2了,从后台日志可以看到session信息会很快被同步了!
如果带有tomcatX标识的sessionID有很多不便之处,可以关闭粘性会话。简单的讲,就是取消Tomcat中[b]server.xml中<Engine/ >节点的jvmRoute属性![/b]然后,重启tomcat、apache!
页面提交一个b=3!
左边为Tomcat1,右边为Tomcat2!SessionID一致!
除了上述几种方案外,还有Terracotta模式。一种第三方集群组件,2009年收购了缓存组件EhCache,可以结合Tomcat、JBoss等多种服务器,提供多种负载均衡、集群等功能实现,且当负载均衡节点超过8个时,仍然能够保持集群吞吐量的线性增长。
Eclipse插件地址:
http://download.terracotta.org/eclipse/update
下载地址:
http://www.terracotta.org/dl/oss-download-catalog
至此,Apache + Tomcat成功完成,征服Apache系列暂告一段落!
作为开博以来的第100帖,算是很成功了!
测试应用见附件!
相关内容:
征服 Apache + SSL
征服 Apache + SVN
征服 Apache + SVN + LDAP
征服 Apache + Tomcat
征服 Nginx
征服 Nginx + Tomcat
为什么要设置为只有本地才能访问呢?这样其他用户不就不能使用这个代理服务了?那这个代理服务就没有意义了啊。
等全部内容整理完毕,我会共享PDF文件!

这里要说的是基于HTTP和AJP跳转方式的负载均衡实现,关于JK,由于效率问题一直成为诟病,并且mod_jk2模块已经不再被更新了,这里就不折腾它的复杂配置了!
至于说Apache+Tomcat+SSL,并不是难题!只要完成了Apache+SSL然后配置相应的负载均衡、反向代理等等就可以达到目的,相关Apache+SSL参考征服 Apache + SSL
Ubuntu Server 10.04版本,Apache选用2.2.14,Tomcat选用6.0.24。
相关内容:
征服 Apache + SSL
征服 Apache + SVN
征服 Apache + SVN + LDAP
征服 Apache + Tomcat
征服 Nginx
征服 Nginx + Tomcat
步骤:
- 安装Apache基本模块
- 后台监控
- 负载均衡简单测试
- 配置Tomcat相关模块(AJP)
- 保持Session唯一,粘性会话
- Tomcat集群,Session复制
1.安装Apache相关模块
负载均衡需要的主要是代理模块!
经过几次Apache配置尝试,在Ubuntu下配置Apache实在是太容易了。加载什么模块、取消什么模块两个命令搞定。
#启用模块 sudo a2enmod <model> #禁用模块 sudo a2dismod <model>
这里,我们需要让Apache提供代理服务,其中又包含基于http、ftp、ajp等等协议的代理功能,同时还需要负载均衡模块。我们可以通过命令逐个加载:
#代理核心模块 sudo a2enmod proxy #代理AJP模块 sudo a2enmod proxy_ajp #代理负载均衡模块 sudo a2enmod proxy_balancer #代理HTTP模块 sudo a2enmod proxy_http #代理FTP模块 sudo a2enmod proxy_ftp
完成上述操作后,系统会提示重启Apache!
先不着急重启,现学现卖,了解下Apache的目录结构。在Ubuntu下配置Apache主要是在/etc/apache2目录下:

分述:
- apache2.conf核心配置文件,一般不需要修改!
- conf.d目录,里面包含了一些字符集设置,文档等设置!
- dav_svn.authz和dav_svn.passwd是前面做SVN时,相关权限、密码文件。
- envvars定义了运行时的用户身份——www-data。
- httpd.conf是Apache留给我们自己折腾的配置文件,默认为空。apache2.conf会加载这个文件。
- ports.conf端口默认配置。apache2.conf会加载这个文件。
- magic为mod_mime_magic模块服务。
- mods-enabled和mods-available mods-enabled会被apache2.conf加载,里面包含*.load和*.conf文件。*.load文件中是加载相应的模块(位于/usr/lib/apache2/modules/中),而*.conf中是对应的基本配置。但这些文件其实都是链接到mods-available中相应的文件上。当我们通过a2enmod操作时,实际上正是操作了这些软链接。
- sites-available和sites-enabled 与 mods-enabled和mods-available的关系类似,只是其中包含的是站点内容。
罗嗦了一堆,下面配置负载均衡部分。
执行修改:
sudo vi /etc/apache2/mods-available/proxy.conf

上图红框中的内容是原始内容,白框中的内容是我新加的部分。
注意红框中的配置:
<Proxy *> AddDefaultCharset off Order deny,allow #Deny from all Allow from localhost ip6-localhost </Proxy>
在默认配置中,Deny from all处于可用状态。当我们配置其他代理节点时,将导致杜绝访问!使用Allow from localhost ip6-localhost 限制仅允许本机访问!
再说,白框中的内容:
<Proxy balancer://zlex> BalancerMember http://localhost:8080/ BalancerMember http://192.168.49.1:8080/ </Proxy>
这里,我配置了一个负载均衡节点balancer://zlex,其中包含了两个服务http://localhost:8080/和http://192.168.49.1:8080/,一个是虚拟机上的Tomcat、一个是真机上的Tomcat。这里使用的Http的转发方式,当然,使用AJP未尝不可,稍后详述!
这里的节点次序会有一个先后关系,Apache会将请求按照FIFO的方式调度顺次分配到各个节点上!如果其中有一个节点挂掉,将跳过该节点顺次寻找可用节点。
再说代理和反向代理:
ProxyPass /zlex balancer://zlex ProxyPassReverse /zlex balancer://zlex
这里配置,如果要访问/zlex路径时,将跳转到balancer://zlex上,也就是享受负载均衡!
2.后台监控
我们如何知道某个节点负载多少,响应时间多久,服务是否正常呢?Apache提供了负载均衡监控平台:http://localhost/balancer-manager。但是,这个服务默认是不存在。
除了用于负载均衡配置、监控的balancer-manager还有http://localhost/server-status和http://localhost/server-info
我们需要添加info模块:
#系统信息模块 sudo a2enmod info
同时,为了能够使用balancer-manager,我们需要配置:
<Location /balancer-manager> SetHandler balancer-manager Order Deny,Allow #Deny from all Allow from localhost ip6-localhost </Location>
把这段代码放到哪?由于它同属系统信息配置,我把它放到了info.conf中,说白了就是照猫画虎:
sudo vi /etc/apache2/mods-available/info.conf

注意,这段代码放到了<IfModule mod_info.c>和</IfModule>之间!
现在,我们重启Apache:
sudo /etc/init.d/apache2 restart
来看看管理界面http://localhost/balancer-manager:

我们再来看看服务器基本信息http://localhost/server-info:

上述两个服务需要加载info模块,而服务器状态(server-status)不需要http://localhost/server-status:

3.负载均衡简单测试
疯狂访问http://localhost/zlex,直到手酸眼烦!
我这里故意使用不同了Tomcat界面,来验证自己的配置是否生效。更疯狂的是,我甚至把节点指向了百度、搜狐,来测试负载均衡的效果。如果你细致观察,Apache是将请求顺次分配到各个节点上的。
如果其中一个节点发生问题(例如,强行关闭一个Tomcat,或配置一个错误节点)Apache将会经过几次尝试后,绕过这个问题节点,寻找可以成功访问的节点。如果这个节点恢复正常使用,Apache将在该Tomcat恢复正常工作后大约1分钟内将该节点标识为可用!
现在,再看看现在的后台(http://localhost/balancer-manager)啥样子:

如果我们控制一个节点的状态是否可用,该怎么做:

涉及到负载量,session同步等等,我们最后讨论!
4.配置Tomcat相关模块(AJP)
基于Http协议分发并不复杂,但AJP效果更好!一次诡异事件中,内网访问正常,外网访问多次失败,最后通过AJP方式完美解决了!
在Tomcat中配置AJP也很简单,修改server.xml开启AJP模块:
sudo vi /etc/tomcat6/server.xml
开启AJP配置:
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" redirectPort="8443" />
注意使用的端口port="8009",字符集URIEncoding="UTF-8",这是输入框、请求字符集乱码的入口!
接下里就可以通过AJP方式进行节点分发了。修改/etc/apache2/mods-available/proxy.conf :
sudo vi /etc/apache2/mods-available/proxy.conf
将http改为ajp,将8080改为8009:
<Proxy balancer://zlex> BalancerMember ajp://localhost:8009/ BalancerMember ajp://192.168.49.1:8009/ </Proxy>
重启Apache:
sudo /etc/init.d/apache2 restart
再看看管理界面http://localhost/balancer-manager

至此,我们完成了基本负载均衡的基本配置!

/etc/apache2/mods-available/proxy.conf还有一些属性:
noFailOver是否打开失败转移,On|Off,默认为Off,添加在ProxyPass后面,如:
ProxyPass /zlex balancer://zlex stickySession=JSESSIONID noFailOver=On
如果这样配置,当提供给你服务的服务器发生异常,那么你将一直看着它返回给你503,直到系统恢复正常!
loadfactor表示后台服务器负载到由Apache发送请求的权值,默认值为1添加在BalancerMember后面:
<Proxy balancer://zlex> BalancerMember ajp://localhost:8009/ BalancerMember ajp://192.168.49.1:8009/ </Proxy>
可以实现三种策略:
- 轮询均衡策略的配置
- 按权重分配均衡策略的配置
- 权重请求响应负载均衡策略的配置
5.Session唯一,粘性会话
Apache已经可以轻松将内容处理的工作分配给各个Tomcat了!
当然,这还不够,Session还是个问题!
WHY?
我们来做一系列修改,来检测Session到底出现了什么问题!
先来改造Tomcat,修改server.xml:
sudo vi /etc/tomcat6/server.xml
修改<Engine />节点,增加jvmRoute属性:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
另一个Tomcat设置改为
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
通过jvmRoute,指定了Tomcat唯一标识!
然后修改/etc/apache2/mods-available/proxy.conf
sudo vi /etc/apache2/mods-available/proxy.conf
如下:
<Proxy balancer://zlex> BalancerMember ajp://localhost:8009/zlex route=tomcat1 BalancerMember ajp://192.168.49.1:8009/zlex route=tomcat2 </Proxy> ProxyPass /zlex balancer://zlex ProxyPassReverse /zlex balancer://zlex
这里需要通过修改route属性,将Apache与Tomcat关联起来!
注意,Tomcat中定义的jvmRoute需要与Apache定义的route相对应!
我们来看一下http://localhost/balancer-manager发生了什么变化:

我们注意到route字段有了新的标识,当然,我们也可以通过这个配置界面修改这些信息,但当前修改不会真的修改/etc/apache2/mods-available/proxy.conf文件,Apache重启后将丢失。
为了更细致的对比进过复杂均衡的结果,这里增加了zlex应用!主要是监控Session的变化!
只看核心代码:
<b>当前SessionID:</b> <br /> <% String sessionID = session.getId(); out.println(sessionID); System.err.println("sessionID = " + sessionID); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && !dataName.isEmpty()) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } %> <br /> <br /> <b>Session属性列表:</b> <br /> <% Enumeration<String> e = (Enumeration<String>) session .getAttributeNames(); while (e.hasMoreElements()) { String name = e.nextElement(); String value = (String) session.getAttribute(name); out.println(name + " = " + value + "<br>"); System.err.println(name + " = " + value); } %> <form method="POST"> <ul style="list-style-type: none;"> <li><label for="dataName">键:</label><input size="20" id="dataName" name="dataName"></li> <li><label for="dataValue">值:</label><input size="20" id="dataValue" name="dataValue"></li> <li><input type="submit" value="提交" /></li> </ul> </form>
将其做成一个名为zlex的web应用,分别部署到两个Tomcat上!
然后重启Apache:
sudo /etc/init.d/apache2 restart
不断刷新http://localhost/zlex,看看真正的结果:
第1次:

第2次:

第3次:

第4次:

仔细观察,每次请求都按照负载均衡配置的节点次序依次请求到不同的Tomcat上。尤其是当我们通过jvmRoute和route做了绑定之后,信息更加准确。但是,仔细观察,每次请求的SessionID都是不一样!对于纯Web应用,尤其是依靠SessionID区分唯一用户的应用,这将是一场噩梦——解决了服务器压力均衡问题,却带来了SessionID不唯一问题!这就需要SessionID绑定,或者说叫做“会话复制”。
如果这时候你在页面上提交表单,将键值对保持在session中,在页面刷新后,将无法获得该信息,因为Seesion丢失了!
接着修改/etc/apache2/mods-available/proxy.conf,让SeesionID保持唯一:
sudo vi /etc/apache2/mods-available/proxy.conf
增加stickySession属性:
ProxyPass /zlex balancer://zlex stickySession=JSESSIONID
stickySession粘性会话,根据这一属性,浏览器将通过cookie绑定SeesionID。如果这个时候再次访问http://localhost/zlex,你会发现,页面不会来回跳转了!
sticky是什么?
引用
sticky模式
利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;
同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用 !
利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;
同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用 !
提交一个Session设定看看http://localhost/zlex:

观察后台日志:

再看看返回页面,这相当于一次页面刷新,如果正常粘性会话,我们将获得当前SessionID对应的一切信息:

这说明粘性会话生效了!
我们得到了形如
引用
50DAF14C6CDF8ACFBDC1095A5EE8E2CF.tomcat1
的SessionID。这样,我们就能知道当前访问的是哪台服务器了!
如果,换一个浏览器打开该页面http://localhost/zlex,将会获得一个新的SessionID,并且,根据Apache中配置的负载均衡节点列表依次访问下一个节点!
如果这时候负载均衡节点列表中某一节点发生异常,那么Apache将按照惯例,跳转该节点,并在该节点恢复正常后约1分钟内重新将其纳入可用节点!
修改刚才的jsp页面,看看Http头中都有些什么:
<b>Cookie信息:</b> <br /> ${header["cookie"]} <br /> <b>Host信息:</b> <br /> ${header["host"]} <br />

sticky模式的根本在于浏览器支持cookie,如果浏览器不支持cookie,则需要修改server.xml文件中的<Context />节点,将cookie置为false,关闭cookie功能,让jsessionid显式传递!
6.Tomcat集群,Session复制
经过两天反复研究,两只互不相认的Tomcat终于在网络上“资源共享”了——Session复制成功!

关于Tomcat集群以及Session复制,网上已经有很多很多,但是否真的能用?!为了确认这一问题,周末还跑到书店翻了翻《Apache Tomcat 高级编程》,参考Clustering/Session Replication HOW-TO(有点小错误),经过两天苦战,克服种种小问题,终于拿下!
整理概念:
引用
群集,是包含多个服务器实例的指定集合,这些服务器实例共享相同的应用程序、资源以及配置信息。您可以将不同计算机上的服务器实例分组到一个逻辑群集中并将其作为一个单元来管理。您可以使用 DAS 轻松控制多机群集的生命周期。
群集可以实现水平可伸缩性、负载平衡和故障转移保护。根据定义,群集中的所有实例都具有相同的资源和应用程序配置。当群集中的服务器实例或计算机出现故障时,负载平衡器检测到该故障,会将通信从出现故障的实例重定向至群集中的其他实例,并恢复用户会话状态。由于群集中所有实例上的应用程序和资源都相同,因此一个实例可以故障转移至群集中的任何其他实例。
引用
Session复制,主要是指集群环境下,多台应用服务器之间同步Session,确保Session保持一致,且Session中的内容保持一致,对外透明——看起来就像是一台应用服务器!
如果其中一台服务器发生故障,根据负载均衡的原理,Apache会遍历寻找可用节点,分发请求。与此同时,当前用户Session不能发生数据丢失,其余各节点服务器应保证用户Session数据同步。
如果其中一台服务器发生故障,根据负载均衡的原理,Apache会遍历寻找可用节点,分发请求。与此同时,当前用户Session不能发生数据丢失,其余各节点服务器应保证用户Session数据同步。
Session复制核心内容主要是:
- Session内容序列化(serialize),会消耗系统性能。
- Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。
因此,Session复制的这两个潜在问题,致使复杂均衡节点最多不会超过4个。因为,当节点数大于4时,整个集群的吞吐量将不再上升!
为了搭建Tomcat集群,我将两个Tomcat分别部署到两台虚拟机上,确保网段一致。(这一步很关键,我最初将Tomcat1(192.168.49.132)部署在虚拟机上,将Tomcat2(192.168.49.128)部署在本机上,结果,网络总有问题,耽误了很多时间。

由于变换了IP,我需要修改Apache的/etc/apache2/mods-available/proxy.conf文件:
sudo vi /etc/apache2/mods-available/proxy.conf
修改负载均衡节点如下:
<Proxy balancer://zlex> BalancerMember ajp://192.168.49.128:8009/zlex route=tomcat1 BalancerMember ajp://192.168.49.132:8009/zlex route=tomcat2 </Proxy>
对于windows系统,不需要考虑网络问题,广播地址(这里用到224.0.0.0和240.0.0.0)默认开放,对于linux则需要通过命令开放地址。
Ubuntu上开放广播地址(eth0网卡):
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
然后通过-v参数查看当前开放的广播地址:
route -v

注意,重启后,该路由设置将丢失!

在Ubuntu下,可以考虑修改/etc/networks文件!
如果有必要,Windows上开放广播地址(192.168.49.128本机地址):
route add 224.0.0.0 mask 240.0.0.0 192.168.49.128
然后通过print参数查看当前开放的广播地址:
route print

然后,修改tomcat的server.xml文件:
sudo vi /etc/tomcat6/server.xml
在<Engine /> 节点中加入如下内容:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="224.0.0.0" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.49.1" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
这里需要注意<Membership />和Receiver:<Membership />节点的address属性是广播地址;Receiver节点的address属性是本地绑定地址。当然,默认为auto。由于我在启动Tomcat时,Tomcat频频将地址指向127.0.0.1,无奈只好使用固定IP。
此外,为了降低Session复制的成本,Tomcat通过<Valve />节点,以过滤器的方式控制哪些请求可以忽略Session复制:
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
同时,在<Host>节点中加入如下内容:
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/>
在Tomcat的官方文档(Tomcat 6)中,对于<Deployer />节点的部署位置是错误的,通过观察Tomcat启动日志,确认该节点应当不属于<Host />节点中!
注意:Tomcat 6与Tomcat5在上述节点中使用的类包(包中名称由cluster变化为ha)有所不同,且结构有所调整。
先别急着重启,我们需要修改应用中的web.xml文件,将<distributable />节点部署到<web-app />节点中,开启分布式服务:

注意:如果没有设置该节点,SessionID将不能保持同步,不同的服务器将各自建立独立的SessionID!
监控Tomcat日志:
tail -f /var/lib/tomcat6/logs/catalina.out
然后重启Tomcat1:
sudo /etc/init.d/tomcat6 restart
观察日志:

注意两处红框:
第一处,Cluster启动,并绑定192.168.49.132:4000上,进行TCP通讯,并等待其它成员(Member)。
第二处,在管理器中注册/zlex,绑定JvmRouteBinderValve。
至此,说明集群设置已经生效,但不能说明集群配置成功!
接着我们启动Tomcat2,观察其日志:

Cluster启动,并绑定192.168.49.128:4000上并发现成员[b]192.168.49.132![/b]
再看Tomcat1的日志:

Tomcat1发现其成员Tomcat2!这说明TCP通讯已建立,Tomcat成员可以进行Session同步!

同时,Tomcat成员直接会每隔一个时间段相互侦测/验证其他成员是否正常:

现在,开始访问http://localhost/zlex,并不断刷新当前页面:

除了两处标识主机来源的tomcatX不同外,session是完全一致的!
提交一次修改,并不断刷新当前页:

如果仔细观察,当前SessionID在不断交替变化,这说明负载均衡在起作用!
我们再来看看2个Tomcat后台日志都做了什么!
Tomcat1:

Tomcat2:

两只猫都打印了相同的内容(a=1)不同的细节在于,sessionID带有服务器标识!
如果我们强行关闭Tomcat2:
首先,Tomcat1会很快侦测到Tomcat2离线,因为这是TCP通讯,成员之间很容易检测到其他成员是否离线!Tomcat1后台日志如下:

其次,Apache会侦测到Tomcat2发生异常,将其余请求转交给其他节点,即交由Tomcat1处理!
继续刷新http://localhost/zlex当前页面,耐心等待几秒。你会发现,即便再次刷新页面,sessionID仍旧绑定在标识tomcat1服务器上。
然后,我们恢复Tomcat2服务,Tomcat1会马上侦测到Tomcat2已经恢复正常:

最后,我们再次刷新当前页,Apache已经将请求分发给Tomcat2了,从后台日志可以看到session信息会很快被同步了!
如果带有tomcatX标识的sessionID有很多不便之处,可以关闭粘性会话。简单的讲,就是取消Tomcat中[b]server.xml中<Engine/ >节点的jvmRoute属性![/b]然后,重启tomcat、apache!

页面提交一个b=3!

左边为Tomcat1,右边为Tomcat2!SessionID一致!
除了上述几种方案外,还有Terracotta模式。一种第三方集群组件,2009年收购了缓存组件EhCache,可以结合Tomcat、JBoss等多种服务器,提供多种负载均衡、集群等功能实现,且当负载均衡节点超过8个时,仍然能够保持集群吞吐量的线性增长。
Eclipse插件地址:
http://download.terracotta.org/eclipse/update
下载地址:
http://www.terracotta.org/dl/oss-download-catalog
至此,Apache + Tomcat成功完成,征服Apache系列暂告一段落!
作为开博以来的第100帖,算是很成功了!

测试应用见附件!

相关内容:
征服 Apache + SSL
征服 Apache + SVN
征服 Apache + SVN + LDAP
征服 Apache + Tomcat
征服 Nginx
征服 Nginx + Tomcat
- zlex.war (1.8 KB)
- 下载次数: 197
评论
11 楼
laj12347
2014-11-04
分享。辛苦了.敬佩楼主的钻研
10 楼
icewall
2014-03-26
引用
Allow from localhost ip6-localhost 限制仅允许本机访问!
为什么要设置为只有本地才能访问呢?这样其他用户不就不能使用这个代理服务了?那这个代理服务就没有意义了啊。
9 楼
this_super
2013-10-17
good

8 楼
LaxLee
2012-09-27
钦佩!!!
7 楼
xierenjing
2011-12-25
感谢楼主的无私奉献,写的很详细

6 楼
qq443507232
2011-03-18
很给力 读了之后 感受颇深
5 楼
snowolf
2010-08-27
calvinlyc 写道
LZ 写的真的很详细,受教了,一直想找类似这样文章学习一下,谢谢LZ分享
等全部内容整理完毕,我会共享PDF文件!

4 楼
calvinlyc
2010-08-27
LZ 写的真的很详细,受教了,一直想找类似这样文章学习一下,谢谢LZ分享
3 楼
yinishao
2010-08-26
太详细了!!!

2 楼
liuyes
2010-08-24
太强大了

1 楼
programdolt
2010-08-24
敬佩楼主的钻研和分享精神,

发表评论
-
Linux环境基本配置
2014-11-14 15:23 3378一、JAVA_HOME 有日子没配过lin ... -
征服ZooKeeper之基本配置
2014-11-14 14:28 36137人,总免不了有心结,限制着自己,难以前行。对于ZooKee ... -
GitLab 安装问题小记
2013-03-21 11:35 6202GitLab是个好东西,但就是安装起来忒费劲。 参考官方 ... -
Linux环境小问题——Get HostName Error
2012-08-06 12:55 7466之前使用mysql的时候,在配置文件中,已经指明了ip访问,但 ... -
Maven零散笔记——配置Nexus
2012-07-24 17:51 28331应朋友需要,整理Nexus相关资料,做一些简要整理,方便他人! ... -
用JIRA管理你的项目——(三)基于LDAP用户管理
2011-01-25 10:49 43007JIRA提供了基于LDAP方式的用户管理,也就是用户密码的管理 ... -
征服 Apache + SVN + LDAP
2011-01-23 21:20 22247最近跟LDAP干上了,几乎所有的系统都要跟LDAP整合。一开始 ... -
用JIRA管理你的项目——(二)JIRA语言包支持及插件支持
2011-01-16 19:10 48943昨天兴奋地把JIRA环境搭 ... -
用JIRA管理你的项目——(一)JIRA环境搭建
2011-01-16 00:24 251367JIRA,大家应该都已经不陌生了! 最初接触这个工具的时候, ... -
征服 Apache + SVN
2010-08-18 17:14 24407实在是不知道这个帖子 ... -
征服 Apache + SSL
2010-08-17 17:55 13018在Tomcat下配置数字证书,搭建SSL模块,构建HTTPS平 ... -
Tomcat 整理
2007-12-04 10:25 216551.apr 许多朋友可能在启动tomcat的时候都会看到类似这 ...
相关推荐
3. **Tomcat 5以上**: Apache Tomcat是一个开源的Servlet容器,用于部署Java Web应用。 4. **Eclipse 3.0**: 集成开发环境,支持Java和JavaScript开发,便于构建和调试Ajax应用。 **四、学习资源** 本资源可能包含...
8. 《Tomcat 权威指南》:做 Java Web 的一般都必须学习这个,为 Apache 的开源项目。 9. 《Head First Servlets & Jsp》:Servlet 和 Jsp 是 JavaEE 程序员必须要掌握好的。 10. 《Head First HTML与 CSS.XHTML 》...
Alibaba_Java_Coding_Guidelines-2.2.3.0x
【ABB机器人】-IRB460机器人维护信息V1.pdf
内容概要:本文详细介绍了新能源汽车VCU(车辆控制单元)控制器的开源项目,涵盖从应用层代码到底层代码、原理图、PCB设计、通信协议及控制策略等多个方面。应用层代码展示了如何根据电池电量调整车辆行驶模式,底层代码涉及硬件驱动如GPIO控制和ADC采样配置。硬件设计部分包括详细的原理图和PCB布局,确保系统的稳定性和可靠性。通信协议采用CAN网络,确保数据可靠传输,控制策略则涵盖了能量回收、扭矩控制等关键技术。丰富的文档资料和测试用例为开发人员提供了宝贵的学习和开发资源。 适合人群:新能源汽车开发人员、硬件工程师、嵌入式软件工程师、学生及研究人员。 使用场景及目标:帮助开发人员深入了解新能源汽车VCU控制器的工作原理和技术细节,加速项目开发进程,降低开发难度。无论是初学者还是有经验的专业人士,都可以从中受益。 其他说明:该项目不仅提供了完整的源代码和硬件设计文件,还包括详细的测试用例和故障处理方案,使得VCU开发变得更加透明和可复现。
详解DeepSeek的十个安全问题.pdf
《网络传播技术与实务》第10章-握在手中的网络——移动通信与无线网络技术.ppt
《计算机专业英语》chapter9-Communication-by-Avatars.ppt
性能测试工具Xrunner的使用手册
内容概要:本文深入探讨了基于自抗扰控制(ADRC)的永磁同步电机(PMSM)矢量控制调速系统的仿真方法及其优势。首先介绍了模型搭建,包括DC直流电压源、三相逆变器、永磁同步电机、采样模块、Clark、Park、Ipark以及SVPWM等关键组件。接着详细解析了ADRC在电流环和转速环中的应用,展示了其通过扩张状态观测器(ESO)实现的高精度扰动观测与补偿机制。文中还提供了部分MATLAB代码示例,如SVPWM模块和ADRC控制器的具体实现。仿真结果显示,ADRC相比传统PI控制器,在突加负载时表现出更好的稳定性和更快的响应速度,且不存在积分饱和问题。此外,文章讨论了一些实际应用中的注意事项和技术挑战。 适合人群:从事电机控制领域的研究人员、工程师及高校相关专业师生。 使用场景及目标:适用于希望深入了解和掌握现代先进电机控制技术的研究人员和工程师。目标是通过仿真平台验证ADRC的有效性,并为实际工程项目提供理论支持和技术指导。 其他说明:尽管ADRC具有诸多优点,但在实际应用中仍需注意参数选择和硬件条件限制等问题。
《网络设备安装与调试(锐捷版)》项目1-配置交换机设备-优化网络传输.pptx
内容概要:本文详细介绍了如何使用Fortran语言在ABAQUS中开发UMAT(用户材料子程序)和VUMAT(显式用户材料子程序),以实现材料损伤断裂弹塑性的自定义建模。文章首先阐述了材料损伤断裂弹塑性的重要性和应用场景,强调了自定义材料子程序在处理复杂材料行为方面的优势。接着,分别展示了UMAT和VUMAT的基本代码结构及其核心计算步骤,如材料参数读取、弹性刚度矩阵初始化、塑性应变增量计算以及应力更新等。此外,还讨论了DISP模型的应用,提供了具体的损伤演化和应力折减方法,并分享了一些实用的调试技巧和注意事项。 适合人群:具备一定ABAQUS使用经验和Fortran编程基础的研究人员和技术人员,尤其是从事材料力学、结构工程等领域的工作人士。 使用场景及目标:适用于需要对特定材料进行精确建模的工程项目,如航空航天、土木建筑等。通过自定义UMAT和VUMAT子程序,能够更好地模拟材料在复杂载荷条件下的损伤演化与断裂过程,提高结构安全性和可靠性评估的准确性。 其他说明:文中不仅提供了详细的代码示例,还分享了许多实践经验,帮助开发者避免常见错误并优化性能。同时提醒读者关注材料参数的正确配置、雅可比矩阵的对称性等问题,确保计算稳定可靠。
V1_3_example.ipynb
安川机器人DX100操作要领书 通用-搬运用途-E.0.pdf
这个是完整源码 SpringBoot + vue 实现 【java毕业设计】SpringBoot+Vue图书馆(图书借阅)管理系统 源码+sql脚本+论文 完整版 数据库是mysql 随着社会的发展,计算机的优势和普及使得阿博图书馆管理系统的开发成为必需。阿博图书馆管理系统主要是借助计算机,通过对图书借阅等信息进行管理。减少管理员的工作,作,同时也方便广大用户对所需图书借阅信息的及时查询以及管理。 阿博图书馆管理系统的开发过程中,采用B / S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。使用Mysql数据库和Eclipse开发环境。该阿博图书馆馆管理系统的开发过程中,采用B / S架构,主要使用Java技术进行开发,结合最新流行的spri管理系统包括用户和管理员。其主要功能包括管理员:首页、个人中心、用户管理、图书分类管理、图书信息管理、图书借阅管理、图书归还管理、缴纳罚金管理、留言板管理、系同时也方便广大用户对所需图书借阅信息的及时查询以及管理。 阿博图书馆管理系统的开发过程中,采用B / S架构,主要使用Java技术进行开发,结合最新流行的springboot框架。使用Mysql数据库和Eclipse开发环境。该阿博图书馆管理系统包括用户和管理员。其主要功能包括管理员:首页、个人中心、用户管理、图书分类管理、图书信息管理、图书借阅管理、图书归还管理、缴纳罚金管理、留言板管理、系统管理,用户:首页、个人中心、图书借阅管理、图书归还管理、缴纳罚金管理、我的收藏管理,前台首页;首页、图书信息、公告信息、留言反馈、个人中心、后台管理等功能。 本论文对阿博图书馆管理系统的发展背景进行详细的介绍,并且对系统开发技术进行介绍,然后对系统进行需求分析,对阿博图书馆管理系统业务流程、系统结构以及数据都进行详细说明。用户可根据关键字进行查找自己想要的信息等。
内容概要:本文详细介绍了一个基于YALMIP和MATLAB的微电网优化调度模型,旨在帮助新手理解和应用微电网优化调度的基本概念和技术。模型综合考虑了蓄电池管理、市场购电售电约束以及功率平衡等因素,以实现系统总费用最低为目标。文中提供了详细的MATLAB代码示例,涵盖变量定义、约束条件建立、目标函数设定及优化求解过程,并附带了调试建议和可视化方法。此外,还讨论了一些常见的错误及其解决办法,如充放电互斥约束、功率平衡约束等。 适合人群:对微电网优化调度感兴趣的初学者,尤其是有一定MATLAB基础的学生或研究人员。 使用场景及目标:适用于希望快速掌握微电网优化调度基本原理的学习者,通过动手实践加深对相关理论的理解。具体应用场景包括但不限于:学术研究、课程作业、个人兴趣项目等。 其他说明:该模型不仅有助于理解微电网的工作机制,还可以为进一步探索复杂的微电网优化问题奠定坚实的基础。
内容概要:本文详细介绍了如何利用MATLAB搭建卷积神经网络(CNN),用于处理具有10个输入特征和3个输出变量的数据预测任务。首先进行数据预处理,包括数据读取、归一化以及训练集和测试集的划分。接着设计了一个包含多个卷积层、批量归一化层、ReLU激活函数层和全连接层的网络架构,确保能够有效提取特征并完成多输出预测。训练过程中采用Adam优化算法,并设置了合理的超参数如最大迭代次数、批次大小和初始学习率等。最终通过预测和反归一化步骤得到模型性能评价指标MAE和R²,展示了良好的预测效果。 适合人群:具有一定MATLAB编程基础和技术背景的研究人员或工程师,尤其是那些从事数据分析、机器学习领域的专业人士。 使用场景及目标:适用于需要解决多输入多输出预测问题的实际项目中,比如工业生产过程监控、设备故障诊断等领域。目的是帮助用户掌握使用MATLAB实现CNN的方法论,从而提高工作效率和解决问题的能力。 其他说明:文中提供了完整的代码片段供读者参考实践,同时针对可能出现的问题给出了实用性的建议,如调整批量大小、降低学习率等方法来应对训练不稳定的情况。此外还提到了一些改进方向,例如改变卷积核尺寸或者引入空洞卷积以增强模型表现。
机器人概要(外形图、目录的阅读方法)20120428.ppt
《计算机程序设计(C语言)》第7章-第2节-函数的定义.ppt