- 浏览: 777592 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Fanatic357:
同问,请问这个 曲线 是用什么工具 监测得到的?
RocketMQ性能压测分析 -
sunshine_love:
8核 16G, 单master TPS 4w+,2m-2s- ...
RocketMQ性能压测分析 -
assertmyself:
很好,,获益良多!
jstack和线程dump分析 -
zhaoxiaoxiao:
非常赞,帮助理解了问题。今天也是遇到了这样的问题
hessian序列化bug -
wjg_java:
打不开 宕机了
博客停止更新
一、材料准备:
1、JBoss 4.0.2
JBoss各个版本之间差异比较大,即使同为jboss 4.x的版本,内部组件的版本也不一致,所以请尽量使用同一版本的server。目前已经证明可以配置cluster的版本多为jboss 3.2.6和jboss 4.0.2。
2、Apache 2.0.54
3、Apache mod_jk-1-2-13-apache-2-0-54
二、安装:
1、jboss4.0.2与apache 2.0.54的安装请自行搞定。假设jboss的安装目录为%jboss%,apache安装目录为%apache%。
2、mod_jk的安装。
从apache.org获得文件mod_jk-1-2-13-apache-2-0-54.so,将该文件拷贝到%apache%\ modules。
三、jboss cluster入门
Jboss 支持如下类型的cluster:EJB、web、JNDI、JMS,我们主要了解web cluster。
Web cluster实际上可以划分为两个话题:负载均衡 (load balance) 和状态同步。它们是互相独立的,单独配置。
负载均衡的概念比较简单,重要的是负载均衡的粒度。可以选择针对每个request的均衡,或者是针对每个用户的均衡。选择不同的粒度,需要不同的状态同步方式。
1、基于request的负载均衡
该种方式下,负载均衡器 (load balancer)会根据各个node的状况,把每个http request进行分发。使用这样的均衡策略,就必须在多个node之间复制用户的session,实时保持整个cluster的用户状态同步,这种操作被称为session复制 (session replication)。Jboss的实现原理是使用拦截器(interceptor),根据用户的同步策略拦截request,做同步处理后再交给server产生响应。该方法的优点是客户不会被绑定都具体的node,只要还有一个node存活,用户状态都不会丢失,cluster都能够继续工作。缺点是node之间通信频繁,响应速度有影响,多并发、高频操作的情况下性能下降比较厉害。
2、基于用户的负载均衡
该种方式下,当用户发出第一个request后,负载均衡器动态的把该用户分配到某个节点,并记录该节点的jvm路由,以后该用户的所有request都会被绑定这个jvm路由,用户只会与该server发生交互,这种策略被称为粘性session(session sticky)。该方法的优点是响应速度快,多个节点之间无须通信。缺点也很明显,某个node死掉以后,它负责的所有用户都会丢失session。
四、实战
1、负载均衡
Jboss的负载均衡目前有两种方案,一是使用apache的mod_jk,二是使用jboss自带的负载均衡模块。下面分别讲解这两种配置。
mod_jk的配置
1、请确认%apache%\modules下已经有mod_jk-1-2-13-apache-2-0-54.so文件。
2、修改%apache%\conf\httpd.conf 在文件末尾添加: Include conf/mod_jk2.conf
3、在%apache%\conf下新建文件 mod_jk2.conf 文件内容如下:
# Load mod_jk module. Specify the filename # of the mod_jk lib you’ve downloaded and # installed in the previous section LoadModule jk_module modules/mod_jk-1-2-13-apache-2-0-54.so # Where to find workers.properties JkWorkersFile conf/workers2.properties # Where to put jk logs JkLogFile logs/mod_jk.log # Set the jk log level [debug/error/info] JkLogLevel info # Select the log format JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " # JkOptions indicate to send SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat "%w %V %T" JkMount /* loadbalancer
其中JkMount /* loadbalancer的意思是,把所有的请求都发给loadbalancer处理。可以通过修改url来控制发送某些request。
4、在%apache%\conf下新建文件 workers2.properties 其内容为:
worker.list=loadbalancer,server1,server2 # Define the first node... worker.server1.port=8009 worker.server1.host=172.16.0.116 worker.server1.type=ajp13 worker.server1.lbfactor=1 worker.server1.local_worker=1 worker.server1.cachesize=10 # Define the first node... worker.server2.port=8009 worker.server2.host=172.16.32.88 worker.server2.type=ajp13 worker.server2.lbfactor=1 worker.server2.local_worker=1 worker.server2.cachesize=10 # Now we define the load-balancing behaviour worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=server1,server2 worker.loadbalancer.sticky_session=1
其中对于node的命名规则是worker.节点名.xxxx。所以上述文件定义了两个节点:server1和server2。8009端口是jboss默认的ajp端口,另外需要注意的是worker.server2.lbfactor参数,它是节点的负载加权,它的值越大,获得负载的机会就越大。可以根据node的硬件性能进行调整。worker.loadbalancer.sticky_session参数是指定是否使用粘性session。
所有需要负载均衡的节点,都必须在worker.loadbalancer.balanced_workers参数中列举出来。
请记住所有node的名称和它对应着哪台机器,后面的配置中会使用。
尝试启动apache:%apache\bin\apache.exe,正常情况下没有任何提示。如果你使用的jk是2.0的,那么配置文件的写法完全不同,由于mod_jk2已经停止开发,所以apache并没有提供任何讲解,对于配置文件的编写也没有任何指导。
Jboss自带均衡器的配置
将文件夹%jboss%\docs\examples\varia\loadbalancer\loadbalancer.sar拷贝到%jboss%\ server\all\deploy下,并且修改loadbalancer.sar\loadbalancer.sar\META-INF\jboss- service.xml,在<host>标签中类出所有节点,在<sticky-session>标签中指定是否使用粘性 session。配置完成。
该均衡器的缺点是负载能力相对不高,配置参数太少,比如无法指定不同节点的负载加权,所以后面都以mod_jk为例,不再讲解jboss自带的负载均衡器的内容。
负载均衡的配置基本完成,启动jboss,其中过程中会列出DefaultPatition中所有的节点:
run.bat -c all
任何节点的关闭与启动都会在cluster中广播,比如加如一个新节点后,其他节点会得到以下提示:
2、session sticky配置
apache 应该会以粘性session的方式分发请求。部署一个应用测试一下,你会发现粘性session没有起作用。因为我们还没有给jboss配置jvm路由 ( jvmRoute),apache就无法知道究竟哪些session是属于哪个节点的。我们继续往下:
修改server1机器上的jboss的配置文件:%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ META-INF\ jboss-service.xml
在110行有:<attribute name="UseJK">false</attribute>,将它改为true。值得注意的是在这行标签上面有一段注释,要求你在server.xml中必须有:
Engine name="jboss.web" jmvRoute="Node1" defaultHost="localhost"
请注意这里有一个气死人不偿命的小bug,jboss的官方文档把 jvmRoute写成了jmvRoute,就是v和m两个字母的颠倒让我郁闷了三天,翻遍了jboss.com和theserverside.com。都是直接拷贝的错,吐血吐到脱水啊。
下面需要修改server1上的%jboss%\server\all\deploy\jbossweb-tomcat55.sar\ server.xml,在32行左右有:
<Engine name="jboss.web" defaultHost="localhost">
给它增加一个jvmRoute属性:
<Engine jvmRoute="server1" name="jboss.web" defaultHost="localhost">
请注意,jvmRoute的值必须和mod_jk中的节点名字正确对应,否则无法正确路由。Cluster中的所有节点都应该做相应的配置。
Jboss的配置完成了,下面需要在你的web应用中修改配置文件,让它支持集群。
在WEB-INF\web.xml中加入属性: <distributable/>
Ok,基于用户的cluster完成了,每个用户会绑定都某个节点上进行交互。这种绑定是如何完成的呢?原来apache把客户分发到节点后,该节点会在用户的session id后面加上此节点的路由名称,变成这个样子:
Efdfxxd98daja87daj76da2dka**,server1
有了这个标志,就能分辨该session属于哪个节点。
3、session replication配置
下面要做的是基于request的cluster,也就让各个节点之间互相复制session状态。有两种复制模式,同步与异步。使用同步的方式, jboss会把session复制的操作和对request的响应放到一个应用事务(application transaction),session 复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request,session复制则会稍有延迟。但是在多框架的 web页面中,这样的集群方式会有问题。由于frame在同一时间发出多个request,会造成一些混乱,这也是采用基于用户的集群方式的原因之一。
JBoss 4.0.2 中采用了Jboss cache来实现session复制,实际上就是一个分布式缓存,由于session id中包含了jvm route,所以能够分辨session属于哪个节点。Session的更新类似于hibernate中的乐观锁,有了更新之后就让session的版本号增加,其他节点通过对比版本号来决定是否同步session状态。
配置session replication首先需要编辑
%jboss% server\all\deploy\jbossweb-tomcat55.sar\META-INF\ jboss-service.xml,88行左右有:
<attribute name="SnapshotMode">instant</attribute>
这就是刚才提到的复制模式,instant为立即复制,如果设为interval 那么系统会在延迟一段时间再进行复制,时间长度在< attribute name="SnapshotInterval">2000</attribute>中指定,单位是毫秒。
单独配置这一个地方还不够,在%jboss% server\all\deploy\ tc5-cluster-service.xml中有:
<attribute name="CacheMode">REPL_ASYNC</attribute>
这里才真正决定复制是同步的还是异步的,可以指定为REPL_ASYNC(异步)或者REPL_SYNC(同步)。
在这个文件下面一点,还有一个config标签,里面指定了各个节点在进行session复制的时候如何通信,有udp和tcp两种可选,如果使用udp方式,那么应该将udp的lookback属性指定为true,因为windows上有一个叫做media sense的东西会影响 udp multicast。注意如果你不了解multi address的ip规则,请不要随便修改mcast_addr的值。如果采用tcp方式的话,应该指定bind_addr的值为本机ip,并且在TCPPING标签的initial_hosts属性中列出所有节点,格式是”机器名[端口号]”,比如在我们的例子中,就应该这样配置tcp(以其中一个节点为例):
<config> <TCP bind_addr="172.16.0.116" start_port="7810" loopback="true"/> <TCPPING initial_hosts="172.16.0.116[7810],172.16.32.88[7810]" port_range="3" timeout="3500" num_initial_members="3" up_thread="true" down_thread="true"/> <MERGE2 min_interval="5000" max_interval="10000"/> <FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" /> <VERIFY_SUSPECT timeout="1500" down_thread="false" up_thread="false" /> <pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100" retransmit_timeout="3000"/> <pbcast.STABLE desired_avg_gossip="20000" down_thread="false" up_thread="false" /> <pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false" print_local_addr="true" down_thread="true" up_thread="true"/> <pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/> </config>
JBoss的clustering版主建议尽量使用udp。不过在Sobey内部,建议使用tcp方式,经测试可能有不明物体在影响udp通信,导致Timeout异常。
在%jboss%\ server\all\deploy\ cluster-service.xml中也有关于udp和tcp的配置信息,在4.0以前版本的jboss中,会以这个文件为主配置,4.0以后都以tc5-cluster-service.xml为主配置。
Jboss的配置完成了,最后需要在web应用中增加配置信息,控制session复制的粒度。在WEB-INF\ jboss-web.xml中增加以下内容:
<replication-config> <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger> <replication-granularity>SESSION</replication-granularity> </replication-config>
其中replication-trigger是指定哪些操作引发session的版本更新,它的取值有:
SET_AND_GET SET_AND_NON_PRIMITIVE_GET SET
replication-granularity是复制粒度,可以取session或attribute。如果取为attribute有可能导致复制失败,这是目前版本的jboss cache的一个bug,等待修正。
部署项目,测试,如果配置没有问题,可以在%jboss%\0server\all\log\server.log中发现类似于这样的信息:
DEBUG [org.jboss.web.tomcat.tc5.session.JBossCacheManager] check to see if needs to store and replicate session with id Im9-qpuaXppMS+xXwE3M+Q**.server1 DEBUG [org.jboss.web.tomcat.tc5.session.ClusteredSession] processSessionRepl(): session is dirty. Will increment version from: 20 and replicate.
Session replication配置的成功率比较低,情况也很复杂,请仔细操作。
五、分布式热部署(distributable hot deploy)
在一个节点很多的cluster中,如果部署应用的时候必须把程序文件拷贝到每个机器上的话,那实在太愚蠢了,幸好通过all启动的jboss自动支持分布式热部署。把支持cluster的应用(通常需要打包成war文件),放到%jboss%\server\all\farm下,那么处于同一 cluster中的其他节点会自动下载并且部署,jboss把这个称为Farm deploy。如下图:
End 2005-7-11 Released by bromon
发表评论
-
RocketMQ topic路由
2014-07-25 16:21 23806原创文章,转载请注明出处:http://jame ... -
dubbo服务化实施整理
2014-07-25 15:49 19722原创文章,转载请注明出处:http://jameswxx. ... -
RocketMQ性能压测分析
2014-07-18 17:20 28113原创文章,转载请注明出处:http://jameswxx. ... -
RocketMQ命令整理
2014-07-14 17:42 66133原创文章,转载请注明出处:http://jameswxx. ... -
RocketMQ的一些特性
2014-07-14 17:36 43528原创文章,转载请注明出处:http://jameswxx. ... -
metaq架构原理
2014-03-20 18:32 41098原创文章,转载请注明出处:http://jameswxx. ... -
Redis主从复制
2011-06-17 16:26 3837Redis的主从复制的配置很简洁,而且支持多 ... -
tomcat接收多字节参数为null问题分析
2010-12-26 22:25 4874前段时间,在项目中遇到一个很奇怪的问题,服务器端接收中文参数为 ... -
hadoop分布式计算demo实践
2010-09-07 16:49 4026真正的分布式计算实验需要好多台服务器,因此 ... -
apahce+tomcat集群
2008-10-09 16:00 409, 环境说明 Apache :apache_ ... -
web集群服务的负载均衡方案选择与实现
2008-10-09 15:37 3517web 应用服务器集群系统,是由一群同时运 ... -
jboss4.0.5集群
2008-10-09 14:54 2844概述 集群允许一个应用同时运行在多个并发的服务器。负载分布在不 ... -
jboss性能优化
2008-10-09 14:37 8282为了优化jboss的性能, ...
相关推荐
这个是转载Bromon原创的重量级:jboss 4.0.2 集群 配置
JBoss 4.0.2可以通过配置实现集群,提高应用程序的可用性和可伸缩性。集群中的节点可以共享负载,提供故障转移功能。 7. **JMX(Java Management Extensions)** JBoss 4.0.2利用JMX进行管理系统监控和管理,允许...
《JBoss 4.0.2 Guide》是针对JBoss应用服务器版本4.0.2的详尽指南,深入解析了该版本的功能、配置及管理技术。本文章将基于此文档,提炼并扩展其核心知识点,包括JBoss的最新特性、安装与构建流程、以及JMX微内核...
**JBoss 4.0.2:一个稳定且全面的Java应用服务器** JBoss,作为开源的Java应用服务器,是Red Hat公司推出的一款基于J2EE(Java 2 Enterprise Edition)标准的重要产品。JBoss 4.0.2是该系列的一个版本,以其稳定性...
Apache2.2+JBOSS 5 集群配置主要涉及在Linux环境下构建高可用性和负载均衡的服务器集群,以提升应用服务的稳定性和处理能力。以下是详细的知识点: 1. **JBoss集群架构**: JBoss 集群可以采用两种架构:客户端...
【JBoss4.2.2集群配置指南(02)】是针对JBoss应用服务器4.2.2版本的一个深入教程,旨在帮助初学者理解和掌握如何配置JBoss以实现高可用性和性能优化的企业级集群环境。这篇指南的核心内容涵盖了以下几个关键知识点: ...
《JBoss7集群配置方案详解》 JBoss7作为一款广泛应用的企业级Java应用服务器,其集群配置对于提高系统可用性和可扩展性至关重要。本篇主要介绍两种集群配置方案:JBoss7+Apache集群以及Solr集群,以实现高效、稳定...
【Jboss集群配置指南】 在IT行业中,Jboss是一个广泛使用的Java应用服务器,它支持集群部署以提高应用程序的可用性和可扩展性。集群是通过多个独立的服务器节点协同工作,共同处理请求,实现高可用性和负载均衡。本...
《JBoss集群指南》这本书深入浅出地介绍了如何配置和管理JBoss应用服务器的集群环境,以实现高可用性和负载均衡。源代码是作者在实践中调试并验证过的,旨在帮助读者更好地理解和应用书中所讲的知识点。以下是这些源...
【JBoss422集群配置指南】 JBoss4.2.2是一款历史悠久的企业级Java应用服务器,它在Java EE环境中提供了全面的服务支持,包括Servlet、JSP、EJB等。集群配置是提升JBoss服务器可扩展性和高可用性的重要手段,尤其...
### jboss集群完整介绍 #### 一、JBoss集群概览 JBoss集群是指一系列的计算机节点协同工作,为用户提供统一的网络资源服务。理想状态下,集群对外表现为一个整体,用户仅通过单一入口访问,无需知晓集群内部的具体...
**JBOSS 4.0.2 HTTP集群配置步骤**: 1. **软件准备**:在每个集群节点上安装JDK 1.5,并设置JAVA_HOME环境变量。接着,部署JBOSS 4.0.2。在负载分发节点上,安装Apache 2.0.47,并将mod_jk 1.2.x版本的mod_jk-...
apache+jboss集群参考,参考介绍集群实现办法
### Linux JBoss EAP集群搭建详解 #### 一、引言 在生产环境中,为了提高应用程序的可用性和可扩展性,通常会选择将应用部署在JBoss EAP集群中。JBoss EAP支持两种运行模式:standalone(独立运行模式)与domain...
【JBoss集群策略详解】 JBoss是一个开源的J2EE应用服务器,遵循J2EE规范,提供了包括集群在内的多种企业级功能。集群是JBoss的一大亮点,它弥补了J2EE标准未涵盖的企业级特性。本文主要关注JBoss的集群策略,特别是...
本文档详细介绍了JBoss服务器如何实现集群,并给出了具体的部署指南。 #### 二、JBoss集群的核心概念 **1. 定义** - **集群(Cluster)**:指一组协同工作的服务器,它们共享相同的负载并能够互相替代,以提高系统...
JBoss 5.1 是一个基于 Java 的应用服务器,提供了高度可扩展性和高可用性,支持集群部署。集群操作能够使多个 JBoss 实例协同工作,以提高应用程序的性能和容错能力。Apache 2.2.4 是一个常用的开源 Web 服务器,它...