一.基础知识
1.1高可用方案的2个基本问题
(1) Load Balance
需要注意负载均衡问题, 使得请求可以较好分配。
它有2种表现形式
(a) 访问地址不同
例如, 网站www.hello.com. 当访问www.hello.com/us, 由Node1做出响应. 当访问www.hello.com/cn, 由Node2做出相应
(b) 任务分发
例如, 网站www.hello.com. 当有50000个request到达时候, 将这些request按照2:1的比例分发给Node1和Node2
(2) High Availability
需要注意Session状态转移问题, 即在某个Server Node发生故障时保持Session连接。例如,当Apache将某个request分发给Node1后, 并且进行了某些操作,这时候Node1突然crash或者Node1出现了网络故障, 这时要保证Session不会丢失, Session ID唯一和保留在Session中的内容不会丢失。
1.2基本原理介绍
<!--[if !vml]--><!--[endif]-->
<!--[if !vml]-->如图1 所示,Node 1和Node 2所是Apache的两个worker。当有request到达时, 由Apache通过Ajp13 协议动态的将请求分发给Node 1和Node 2。 例如, 当发送的request送给Node 1时,由Node 1处理发送来的request, 进行处理后将response按照原路径返回,交给Apache。此后Apache再将收到的response返回给client端。
两个worker,Node 1和Node 2是真正负责处理client端发送来的请求。为了保持Session的一致性和稳定性,两个Node需要进行同步,即Session的复制,才能保证数据的统一。
二、举例说明配置
2.1环境说明
【机器A】
操作系统: Window Home Edition
IP地址: 192.168.0.42
JBoss 服务器: Apache, 2.2.4
JBoss 4.2 (Node 1)
JDK版本: 1.5.0
【机器B】
操作系统: FreeBSD
IP: 192.168.0.180
Server: JBoss 4.2 (Node 2)
JDK: 1.5.0
2.2配置流程
<!--[if !supportLists]-->(1) <!--[endif]-->%Apache_HOME%目录下
<!--[if !supportLists]-->(a) <!--[endif]-->到www.apache.com下载mod_jk.so到modules目录
<!--[if !supportLists]-->(b) <!--[endif]-->在conf目录下的httpd.conf文件最后写入
# Include mod_jk's specific configuration file
Include conf/mod-jk.conf
<!--[if !supportLists]-->(c) <!--[endif]-->在conf目录下创建mod-jk.conf文件、uriworkermap.properties文件、workers.properties文件,文件的内容见附录一。其目的是为Apache设置2个worker为其服务。
<!--[if !supportLists]-->(2) <!--[endif]-->Node1%JBOSS_HOME%\server\all目录下
<!--[if !supportLists]-->(a) <!--[endif]-->修改访问地址, 使得外部可以以主机IP地址进行访问
在deploy\jboss-web.deployer目录下的server.xml
<Connector port="8080" address= {jboss.bind.address}…>改为<Connector port="8080" address="0.0.0.0"…>;
<Connector port="8009" address= {jboss.bind.address}…>改为<Connector port="8009" address="0.0.0.0"…>。
<!--[if !supportLists]-->(b) <!--[endif]-->使得JBoss知道自己为Node1结点
在deploy\jboss-web.deployer目录下的server.xml
<Engine name="jboss.web" defaultHost = "localhost">
改为
<Engine name="jboss.web" defaultHost= "localhost" jvmRoute="node1">。
<!--[if !supportLists]-->(c) <!--[endif]-->通知Node 1添加一个jvmRoute值到会话cookies中,以便mod_jk可以路由随后的请求
在deploy\jboss-web.deployer\META-INF目录下的jboss-service.xml
<attribute name="UseJK">false</attribute>改为
<attribute name="UseJK">true</attribute>。
<!--[if !supportLists]-->(d) <!--[endif]-->定义重定向地址
在deploy\jboss-web-cluster.sar\META-INF目录下的jboss-service.xml
<TCP bind_addr = "thishost" start_port = "7810" loopback= "true"…>
改为
<TCP bind_addr = "192.168.0.42" start_port= "7810" loopback="true"…>;
<TCPPING initial_hosts= "thishost[7810], otherhost[7810]" port_range="3"…>
改为
<TCPPING initial_hosts= "192.168.0.42[7810], 192.168.0.180[7810]" port_range="3"…>。
<!--[if !supportLists]-->(3) <!--[endif]-->Node2%JBOSS_HOME%\server\all目录下
<!--[if !supportLists]-->(a) <!--[endif]-->修改访问地址, 使得外部可以以主机IP地址进行访问
在deploy\jboss-web.deployer目录下的server.xml
<Connector port="8080" address= {jboss.bind.address}…>改为<Connector port="8080" address="0.0.0.0"…>;
<Connector port="8009" address= {jboss.bind.address}…>改为<Connector port="8009" address="0.0.0.0"…>。
<!--[if !supportLists]-->(b) <!--[endif]-->使得JBoss知道自己为Node2结点
在deploy\jboss-web.deployer目录下的server.xml
<Engine name="jboss.web" defaultHost = "localhost">
改为
<Engine name="jboss.web" defaultHost= "localhost" jvmRoute="node2">。
<!--[if !supportLists]-->(c) <!--[endif]-->通知Node 2添加一个jvmRoute值到会话cookies中,以便mod_jk可以路由随后的请求
在deploy\jboss-web.deployer\META-INF目录下的jboss-service.xml
<attribute name="UseJK">false</attribute>改为
<attribute name="UseJK">true</attribute>。
<!--[if !supportLists]-->(d) <!--[endif]-->定义重定向地址
在deploy\jboss-web-cluster.sar\META-INF目录下的jboss-service.xml
<TCP bind_addr = "thishost" start_port = "7810" loopback= "true"…>
改为
<TCP bind_addr = "192.168.0.180" start_port= "7810" loopback="true"…>;
<TCPPING initial_hosts= "thishost[7810], otherhost[7810]" port_range="3"…>
改为
<TCPPING initial_hosts= "192.168.0.180[7810], 192.168.0.42[7810]" port_range="3"…>。
<!--[if !supportLists]-->(4) <!--[endif]-->在自己的应用程序中
<!--[if !supportLists]-->(a) <!--[endif]-->设置使得自己的应用程序使用集群
在WEB-INF目录下的web.xml文件中<web-app>下添加
<distributable/>
<!--[if !supportLists]-->(b) <!--[endif]-->在设置Jboss配置信息
在WEB-INF目录下创建jboss-web.xml文件,文件内容见附录二
三、实验方案
【实验一】验证负载分配
实验步骤:
<!--[if !supportLists]-->(1) <!--[endif]-->在浏览器中输入http://l92.168.0.42/jmx-console/
<!--[if !supportLists]-->(2) <!--[endif]-->另开一个浏览器窗口, 输入http://l92.168.0.42/jmx-console/,可能会出现另外一个node的jmx-console
【实验二】验证负载分配和Session ID保持
实验步骤:
<!--[if !supportLists]-->(1) <!--[endif]-->创建文件test.jsp, 在test.jsp中打印node的IP地址, session id和singleton实例的某一自增变量
<!--[if !supportLists]-->(2) <!--[endif]-->在一个浏览器窗口中访问test.jsp, 显示单一node的IP地址, session id和singleton实例的某一自增变量, 点击刷新按钮, 看见同一IP地址和Session id
<!--[if !supportLists]-->(3) <!--[endif]-->另开一个浏览器窗口访问test.jsp, 可能会显示另一node的IP地址, session id和singleton实例的某一自增变量, 点击刷新按钮, 看见一IP地址和Session id. 在这里每个singleton变量的自增值是分别增加的.
<!--[if !supportLists]-->(4) <!--[endif]-->仅保留一个浏览器窗口, 若ip显示42机器, 则把42机器上的jboss停止掉. 否则把180上的jboss停止掉. 刷新浏览器窗口. 可以看见ip值发生变化, 但session id保持不变
【实验三】验证Session内容
<!--[if !supportLists]-->(1) <!--[endif]-->创建文件first.jsp, 在first.jsp中输入一个值, 将其存入session中, 以post方法在second.jsp中显示session中存在的值和打印值到控制台.
<!--[if !supportLists]-->(2) <!--[endif]-->刷新second.jsp, 显示session中存在的值
<!--[if !supportLists]-->(3) <!--[endif]-->停止掉刚刚在控制台打印信息的node结点server
<!--[if !supportLists]-->(4) <!--[endif]-->刷新second.jsp, 显示session中存在的值
【实验四】数据统计, 查看性能
在%APACHE_HOME%\bin目录有应用程序ab, 利用ab做数据统计
分别向服务器发送500个请求,每次发送20个,查看最终的数据统计结果
ab -n 500 -c 20 http://192.168.0.42:8080/web-console/
ab -n 500 -c 20 http://192.168.0.180:8080/web-console/
ab -n 500 -c 20 http:// 192.168.0.42/web-console/
四、注意事项
8080端口问题
有时可能出现JBOSS端口冲突问题, 可以将%JBOSS_HOME%\all\deploy\jboss-web.deployer\Server.xml中定义的默认端口8080改为其他不用端口
ALL 模式运行问题
JBOSS以ALL模式在windows运行的命令为%JBOSS_HOME%\bin\run.bat –c all, 在FreeBSD运行的命令为%JBOSS_HOME%\bin\run.sh –c all
端口冲突问题
JBoss以ALL模式启动时候, 有时可能与某些应用程序冲突. 例如Firefox和MSN(曾遇到以上2这个应用程序端口冲突). 利用netstat –ano 来查看现在访问网络端口的应用程序的PID. 然后利用任务管理器去查找相应的程序,结束即可.
FreeBSD安装问题
在FreeBSD下安装JBoss后, ALL模式并不能正常运行. 需要调整几个参数, 才能运行.进入%JBOSS_HOME%server/all/deploy目录.
<!--[if !supportLists]-->(1) <!--[endif]-->cluster-service.xml文件
<UDP …enable_bundling="false" max_bundle_size="64000 max_bundle_timeout="30"…>
改为
<UDP …enable_bundling="false" max_bundle_size="8000 max_bundle_timeout="30"…>;
<TCP enable_bundling="false" max_bundle_size="64000" max_bundle_timeout="30">
改为
<TCP enable_bundling="false" max_bundle_size="8000" max_bundle_timeout="30">
<!--[if !supportLists]-->(2) <!--[endif]-->ejb3-clustered-sfsbcache-service.xml文件
<UDP …enable_bundling="false" max_bundle_size="64000 max_bundle_timeout="30"…>
改为
<UDP …enable_bundling="false" max_bundle_size="8000 max_bundle_timeout="30"…>
<!--[if !supportLists]-->(3) <!--[endif]-->ejb3-entity-cache-service.xml文件
<UDP …enable_bundling="false" max_bundle_size="64000 max_bundle_timeout="30"…>
改为
<UDP …enable_bundling="false" max_bundle_size="8000 max_bundle_timeout="30"…>
<!--[if !supportLists]-->(4) <!--[endif]-->jboss-web-cluster.sar/META-INF/jboss-service.xml文件
<UDP …enable_bundling="false" max_bundle_size="64000 max_bundle_timeout="30"…>
改为
<UDP …enable_bundling="false" max_bundle_size="8000 max_bundle_timeout="30"…>;
<TCP enable_bundling="false" max_bundle_size="64000" max_bundle_timeout="30">
改为
<TCP enable_bundling="false" max_bundle_size="8000" max_bundle_timeout="30">
附录
附录一
mod-jk.conf文件
//加载mod_jk模块
LoadModule jk_module modules/mod_jk.so
//设置worker配置文件
JkWorkersFile conf/workers.properties
//设置日志记录位置
JkLogFile logs/mod_jk.log
//设置日志记录级别
JkLogLevel info
//设置日志记录格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
//设置提交SSL KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
//设置请求格式
JkRequestLogFormat "%w %V %T"
//设置负载转发请求
JkMount /ClusterTest/* loadbalancer
//设置负载转发文件
JkMountFile conf/uriworkermap.properties
uriworkermap.properties文件
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer
workers.properties文件
# 定义workers 列表
worker.list=loadbalancer, node1, node2
# 定义 Node1
# 修改主机IP地址等参数
worker.node1.port=8009
worker.node1.host=localhost
worker.node1.type=ajp13
worker.node1.lbfactor=1
# 定义 Node2
# 修改主机IP地址等参数
worker.node2.port=8009
worker.node2.host=192.168.0.180
worker.node2.type=ajp13
worker.node2.lbfactor=1
# 设置Load-balancing 行为
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1, node2
worker.loadbalancer.sticky_session=1
附录二
jboss-web.xml文件
<jboss-web>
<replication-config>
<replication-trigger>
SET_AND_NON_PRIMITIVE_GET
</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>
true
</replication-field-batch-mode>
</replication-config>
</jboss-web>
文章出处:http://www.diybl.com/course/3_program/java/javajs/2007923/73054.html
分享到:
相关推荐
- **高可用性配置**: 包括负载均衡、故障转移机制等,确保服务稳定运行。 - **安全性配置**: 如何配置认证、授权机制,保护应用免受攻击。 - **性能优化**: 提供了一系列提高JBoss性能的方法,包括缓存策略、连接...
- 集群配置:对于需要高可用性和负载均衡的应用场景,还需要对JBoss进行集群配置。 4. **启动与验证**:启动JBoss服务并验证其是否正常运行。通常情况下,可以通过执行`./run.sh`脚本来启动JBoss服务。 #### 五、...
7. 集群支持:提供集群解决方案,增强系统的扩展性和可用性。 安装与配置 JBoss 涉及以下步骤: 1. 设置 `%JAVA_HOME%` 为本地 JDK 目录。 2. 运行 `%JBoss_HOME%\bin\run.bat` 启动 JBoss。 3. 关闭 JBoss,可以...
- **高可用性(HA)服务**:如HA-JNDI和HA-RMI,确保服务的连续可用。 - **负载均衡策略**:支持多种负载均衡算法,确保资源的有效利用。 #### 三、JBoss集群部署概览 **1. 分区与子分区** - **分区**:用于组织和...
第六章至第九章分别涉及JBoss Web服务器的配置、企业应用的配置、JBoss Messaging服务以及Web服务的配置。这些章节不仅提供了具体的配置步骤,还讲解了背后的原理与最佳实践,帮助读者掌握如何构建高性能、高可用的...
9. **集群与高可用性**:讨论JBOSS集群的概念,如何设置负载均衡和故障转移,提高应用的可用性和可扩展性。 10. **性能优化**:提供关于JBOSS性能监控、调优和问题排查的技巧,包括内存管理和线程分析。 11. **...
### JBoss Application Server 4.2 集群指南知识点...这部分内容讨论了如何在集群环境中部署和管理 Singleton 类型的服务,包括 HASingleton Deployer 服务、MBean 部署以及使用 Barrier 等技术手段来实现高可用性。
1. **安装到配置流程**:本书从安装JBoss开始,逐步引导读者完成各种配置,直至能够进行生产环境下的开发工作。 2. **高级特性的深入探讨**:与其他JBoss相关的资料不同,本书更侧重于介绍服务器的高级功能和配置...
- **登录配置优化**:对`.jboss/server/default/conf/login-config.xml`文件进行调整,优化用户验证流程,减少不必要的内存开销。 #### 三、总结 通过对JBoss 3.2.1的性能优化实践,可以看出合理的配置和参数调整...
首先,**HornetQ**是JBoss的一个开源消息传递系统,它提供了高性能、高可用性和可扩展性的消息队列服务。在分布式事务处理中,HornetQ常作为异步通信的核心,通过消息中间件实现服务间的解耦,并保证消息的可靠传输...
JBPM4.4是JBoss Business Process Management (BPM)平台的一个版本,它是一个开源的企业级BPM解决方案,用于设计、执行和管理业务流程。在这个完整的审批流程工程中,我们看到它采用Maven进行项目构建和依赖管理,...
JBoss AS支持集群部署,能够将应用分布在多个服务器上,提高可用性和负载均衡。通过集群,可以实现故障转移,当一个节点出现问题时,应用可以无缝地切换到其他节点,保证服务不中断。 **6. Web服务** JBoss AS集成...
- **编写客户端测试程序**:为了验证服务的可用性与正确性,需要编写客户端代码进行测试,这包括发送请求、接收响应、检查结果是否符合预期。 #### 结论 JBoss ESB作为一款功能强大的企业级服务总线工具,提供了...
- **集群支持**:通过HA(高可用性)和负载均衡,确保服务的持续性和性能。 - **持久化**:集成JPA,支持多种数据库,如MySQL、Oracle等,提供数据持久化解决方案。 - **Web服务**:支持WS-*标准,包括SOAP和...
当遇到"JBoss JTA configuration trouble shooting"的问题时,开发者通常需要深入理解JTA的工作原理以及如何在JBoss应用服务器中正确配置它。以下是对这个主题的详细讲解: 首先,JTA是一个Java标准,定义了API来...
- **集群特性**:了解 JBoss 集群能够提供的服务,如高可用性和可扩展性。 - **集群 JNDI**:掌握如何在集群环境中配置 JNDI 条目,使它们在所有节点间可见。 - **故障排除**:学习如何诊断和解决集群配置中常见的...
**选择插件**:在可用插件列表中找到并选中“JBoss ESB Tools”以及其他相关的JBoss Tools模块,然后按照提示完成安装过程。 ##### 2.2 创建ESB项目 在安装了JBoss ESB Tools后,可以通过Eclipse创建一个新的ESB...
JBoss集群是通过将多个JBoss实例组合起来形成一个逻辑上的单一实体来实现高可用性和负载均衡的技术方案。这种集群可以有效地提高系统的稳定性和性能,尤其是在处理大量并发请求时。 #### 二、JBoss集群的关键特性 ...
- 它支持查看流程的状态、启动新的流程实例以及终止正在进行的任务等功能。 ##### 2.3 jBPM核心库 - **核心库** 包含了执行业务流程所需的所有基础类和接口。 - 它提供了处理流程实例、任务、事件等功能的API。 ##...
集群配置是实现高可用性和可伸缩性的重要方法,尤其在处理高并发和关键业务时,Linux下的Apache负载均衡集群与JBoss结合提供了高效、稳定的服务解决方案。通过合理的配置和维护,企业可以构建出强大且可靠的IT基础...