Jboss4.2.3+Apache2.2集群与负载均衡的配置

一、环境准备 

  1、两台服务器(虽然说一台机器部署两个jboss也是可以,但是要改一堆的端口,相当麻烦,反正我是开了个虚拟机)

  2、Apache2.2 用来做负载均衡和地址转发,据说jboss自带有负载均衡,但是不稳定,所以很少人使用
    下载地址: http://mirrors.cnnic.cn/apache//httpd/binaries/win32/httpd-2.2.25-win32-x86-openssl-0.9.8y.msi

  3、jboss4.2.3 不用多说了,记得配环境变量JBOSS_HOME
    下载地址: http://nchc.dl.sourceforge.net/project/jboss/JBoss/JBoss-4.2.3.GA/jboss-4.2.3.GA.zip

  4、JDK1.6 记得配环境变量JAVA_HOME

  5、关于版本的选择  mod_jk有1.x和2.x两个版本系列。mod_jk 2.x已经停止开发,不能使用。很多人凭直觉认为mod_jk 2.x肯定比mod_jk 1.x好,结果走了弯路
  Jboss、apache、mod_jk之间也存在着特定版本才能配合的情况。所以,为避免困扰,请严格按照以上版本

二、安装软件 
  1、jboss不用多说了,直接解压就行了
  2、Apache安装中会问你Domain、服务器和Email,可以按照要求填也可以随便填,反正到时候要去修改配置文件的

三、配置Jboss 
  由于jboss默认的启动方式default是没有集群功能的,所以如果要使用集群的话就要使用all方式启动,即run.bat -c all

  1、修改端口、配置节点
  找到JBOSS_HOME/server/all/deploy/jboss-web.deployer/server.xml
<Connector port="8080" address="0.0.0.0" 
         maxThreads="250" maxHttpHeaderSize="8192"
         emptySessionPath="true" protocol="HTTP/1.1"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true" />

  注意上面代码,其中port就是访问应用的端口,可根据实际需要修改;address如果默认的话是只能本机访问到应用的,改成0.0.0.0即所有ip都可以访问到
<Connector port="8009" address="0.0.0.0" protocol="AJP/1.3" 
     emptySessionPath="true" enableLookups="false" redirectPort="8443"
     minProcessors="100" maxProcessors="500" acceptCount="100"
     connectionTimeout="120000" />

    <Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">

  注意上面代码,其中port是后面配地址转发的时候要用到的,最好不要乱改;
address参考上面;jvmRoute是本节点在集群中的名称(同理另外一台服务器中就应该是node2)名字可以随便写,但是需要保证集群中所有节点都有唯一的名称
  各参数简单解释:
  maxProcessors:最大并发数(连接数)
  minProcessors:初始化时启动的最小的进程数
  acceptCount:在当前connector的连接数达到最大时,允许进入等待队列的数目
  connectionTimeout:连接超时时间,单位为毫秒
  enableLookups:是否允许通过DNS lookups,返回远程客户端的机器名,如果设为false,则只能返回IP地址。该参数默认为true,如果不需要,可以禁掉,设为false,可以提高服务器的性能
  maxPostSize:设定允许透过POST上传参数的字节数,默认是2M(2097152),如果想禁掉该限制,则将该值设为一个小于或等于0 的值,如0、-1,如果所部署的应用中有上传工作,则需注意该配置
   
  2、配置集群
  找到JBOSS_HOME/server/all/deploy/jboss-web-cluster.sar/META-INF/jboss-service.xml
  找到<config><udp>将<config>到</config>全部注释掉;找到<config><tcp>将<config>到</config>生效(jboss session复制有UDP和TCP两种方式.UDP采用多播方式,但问题比较多,所以建议 采用TCP方式).并对该部分进行以下修改:
  • 将全部down_thread和up_thread的false都改为true.
  • 在<tcp bind_addr=”后填入本机的IP,比如<TCP bind_addr="192.168.1.103",注意另外一台服务器就是写另外那台服务器的ip了
  • 在<tcpping initial_hosts=”后填入本机和集群其他全部Jboss节点的IP[7810],比如<TCPPING initial_hosts="192.168.1.103[7810],192.168.1.139[7810]"
  我其中一个节点的配置如下,可以参考一下:
<config>
	<TCP bind_addr="192.168.1.103" start_port="7810" loopback="true"
		tcp_nodelay="true"
		recv_buf_size="20000000"
	    send_buf_size="640000"
	    discard_incompatible_packets="true"
	    enable_bundling="false"
	    max_bundle_size="64000"
	    max_bundle_timeout="30"
	    use_incoming_packet_handler="true"
	    use_outgoing_packet_handler="false"
	    down_thread="true" up_thread="true"
	    use_send_queues="false"
	    sock_conn_timeout="300"
	    skip_suspected_members="true"/>
	<TCPPING initial_hosts="192.168.1.103[7810],192.168.1.139[7810]" 
		port_range="3"
	    timeout="3000"
	    down_thread="true" up_thread="true"
	    num_initial_members="3"/>
	<MERGE2 max_interval="100000" down_thread="true" up_thread="true" min_interval="20000"/>
	<FD_SOCK down_thread="true" up_thread="true"/>
	<FD timeout="10000" max_tries="5" down_thread="true" up_thread="true" shun="true"/>
	<VERIFY_SUSPECT timeout="1500" down_thread="true" up_thread="true"/>
	<pbcast.NAKACK max_xmit_size="60000"
		use_mcast_xmit="false" gc_lag="0"
		retransmit_timeout="300,600,1200,2400,4800"
	    down_thread="true" up_thread="true"
	    discard_delivered_msgs="true"/>
	<pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
		down_thread="true" up_thread="true" max_bytes="400000"/>
	<pbcast.GMS print_local_addr="true" join_timeout="3000"
	    down_thread="true" up_thread="true"
	    join_retry_timeout="2000" shun="true"
	    view_bundling="true"/>
	<FC max_credits="2000000" down_thread="true" up_thread="true" min_threshold="0.10"/>
	<FRAG2 frag_size="60000" down_thread="true" up_thread="true"/>
	<pbcast.STATE_TRANSFER down_thread="true" up_thread="true" use_flush="false"/>
</config>

    其中jboss-service.xml中
  ClusterName是集群名称,比如partition1. 在同一局域网内,可以存在多个jboss集群,根据集群名称区分它们.所以,集群中各节点配置的集群名称必须一致,而机器IP则没有特殊要求,只要它们能相互连通. 理论上,可以在一台机器上安装多个Jboss实例,分属于不同的集群.但这会极大地增加复杂度,是不好的配置方式.

  IsolationLevel是隔离等级. 可选值包括:SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED, 和 NONE。这里的隔离级别和数据库的隔离级别有同样的含义,对于大多数WEB应用程序来讲通常设置为REPEATABLE_READ.

  CacheMode是缓存模式。由于session复制是通过缓存实现的,所以实际上是复制模式.可选值包括:REPL_SYNC 和REPL_ASYNC,确定改变是应该同步还是异步复制。缺省值是REPL_ASYNC.使用同步复制,确保在请求完成之前传播改变,session同步没有滞后,但效率低.

四、配置Apache
  修改httpd.conf
  修改 APACHE_HOME/conf/httpd.conf
  Listen 80 (Apache监听的端口,即使用80端口访问时将通过Apache进行地址转发)
  ServerName 192.168.1.103:80
  确保以下代码前的注释已经去掉:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule status_module modules/mod_status.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule rewrite_module modules/mod_rewrite.so

  然后添加以下代码:
<Proxy *>
       Order deny,allow
       allow from all
</Proxy>

ProxyPass / balancer://proxy/   stickysession=JSESSIONID|jsessionid nofailover=On lbmethod=byrequests
ProxyPassReverse / balancer://proxy/
<Proxy balancer://proxy>
        BalancerMember ajp://192.168.1.103:8009/  loadfactor=50  route=node1
        BalancerMember ajp://192.168.1.139:8009/  loadfactor=50  route=node2
</Proxy>

  ProxyPass为代理转发的Url,即将所有访问/的请求由负载均衡器进行转发
  loadfactor为各主机间的负载比例参数,可以设置不同指数
  BalancerMember为群集的成员,即群集服务器A或B,负载均衡服务器会根据均衡规则来将请求转发给BalancerMember.其中ajp的端口即上面三、1、提到的ajp的端口,route即上面三、1、提到的jvmRoute
  nofailover=On表示启用故障转移,即当其中一台服务器down了,那么就将请求转发到另外一台服务器
  lbmethod选择均衡器的负载均衡方式,可以是 byrequests ,进行加权请求计数,或者是 bytraffic ,进行加权流量字节计数均衡,或者是bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器) 。默认按请求数。
  stickysession表示将进行session复制并绑定JSESSIONID或者jsessionid,即如果有此配置项将总是将同一会话的请求转发到同一个Jboss中而不进行session复制,但是当服务器down了后session也随之消失,会话将无法继续访问,反之则会在集群中的各服务器之间进行session复制并且每次刷新或跳转页面都会进行服务器的切换

配置Apache的并发数(MPM)(感谢同事小邬的帮助)
  Apache对于并发相关配置的核心模块叫多路处理模块(Multi-Processing Module,简称MPM),Apache针对不同的操作系统提供了多个不同的MPM模块,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker
操作系统 默认MPM模块
Windows mpm_winnt
Unix/Linux mpm_prefork
BeOS mpm_beos
Netware mpm_netware
OS/2 mpmt_os2

  此外,如果我们想要知道某个Apache内部使用的是何种MPM模块,我们可以以命令行的方式进入Apache安装目录\bin,然后键入命令httpd -l,即可查看到当前Apache内部使用的何种MPM模块

1.启用MPM模块配置文件  在Apace安装目录/conf/extra目录中有一个名为httpd-mpm.conf的配置文件。该文件主要用于进行MPM模块的相关配置。不过,在默认情况下,Apache的MPM模块配置文件并没有启用。因此,我们需要在httpd.conf文件中启用该配置文件,如下所示:
Include conf/extra/httpd-mpm.conf(去掉该行前面的注释符号"#")

2.修改MPM模块配置文件中的相关配置
  在启动MPM模块配置文件后,我们就可以使用文本编辑器打开该配置文件,我们可以看到,在该配置文件中有许多<IfModule>配置节点,此时,我们就需要根据当前Apache服务器所使用的MPM模块,来修改对应<IfModule>节点下的参数配置。

mpm_winnt模块
#由于mpm_winnt模块只会创建1个子进程,因此这里对单个子进程的参数设置就相当于对整个Apache的参数设置。
<IfModulempm_winnt_module>
ThreadsPerChild 150 #推荐设置:小型网站=1000 中型网站=1000~2000 大型网站=2000~3500
MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=20000~100000
</IfModule>

ThreadsPerChild:每个子进程的最大并发线程数。

MaxRequestsPerChild:每个子进程允许处理的请求总数。如果累计处理的请求数超过该值,该子进程将会结束(然后根据需要确定是否创建新的子进程),该值设为0表示不限制请求总数(子进程永不结束)。
  该参数建议设为非零的值,可以带来以下两个好处:
  1.可以防止程序中可能存在的内存泄漏无限进行下去,从而耗尽内存。
  2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

mpm_perfork模块和mpm_worker模块:
#mpm_perfork模块
<IfModulempm_prefork_module>
StartServers 5 #推荐设置:小=默认中=20~50 大=50~100
MinSpareServers 5 #推荐设置:与StartServers保持一致
MaxSpareServers 10 #推荐设置:小=20 中=30~80 大=80~120 
MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000
MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~500000
(此外,还需额外设置ServerLimit参数,该参数最好与MaxClients的值保持一致。)
</IfModule>
#mpm_worker模块
<IfModulempm_worker_module>
StartServers 2 #推荐设置:小=默认中=3~5 大=5~10
MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000
MinSpareThreads 25 #推荐设置:小=默认中=50~100 大=100~200
MaxSpareThreads 75 #推荐设置:小=默认中=80~160 大=200~400 
ThreadsPerChild 25 #推荐设置:小=默认中=50~100 大型=100~200
MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~50000
(此外,如果MaxClients/ThreadsPerChild大于16,还需额外设置ServerLimit参数,ServerLimit必须大于等于MaxClients/ThreadsPerChild的值。)
</IfModule>

StartServers:启动Apache时创建的子进程数。

MinSpareServers:处于空闲状态的最小子进程数。
所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。此值不宜过大。

MaxSpareServers:处于空闲状态的最大子进程数。
只有在非常繁忙机器上才需要调整这个参数。此值不宜过大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成MinSpareServers+1。

MaxClients:允许同时连接的最大请求数量。
任何超过MaxClients限制的请求都将进入等待队列,直到达到ListenBacklog指令限制的最大值为止。
对于非线程型的MPM(也就是mpm_prefork),MaxClients表示可以用于处理客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit。
对于线程型或者混合型的MPM(也就是mpm_beos或mpm_worker),MaxClients表示可以用于处理客户端请求的最大线程数量。线程型的mpm_beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。

MinSpareThreads:处于空闲状态的最小线程数。
不同的MPM对这个指令的处理是不一样的:
mpm_worker的默认值是75。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
mpm_netware的默认值是10。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。
mpm_beos和mpmt_os2的工作方式与mpm_netware差不多,mpm_beos的默认值是1;mpmt_os2的默认值是5。

MaxSpareThreads:处于空闲状态的最大线程数。
不同的MPM对这个指令的处理是不一样的:
mpm_worker的默认值是250。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
mpm_netware的默认值是100。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。
mpm_beos和mpmt_os2的工作方式与mpm_netware差不多,mpm_beos的默认值是50;mpmt_os2的默认值是10。

注意:
    ServerLimit表示Apache允许创建的最大进程数。值得注意的是,Apache在编译时内部有一个硬限制ServerLimit 20000(对于mpm_prefork模块为ServerLimit 200000)。你不能超越这个限制。使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit和MaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
    在配置相关参数时,请先保证服务器具备足够的硬件性能(例如:CPU、内存等)。如果发现自启动后,随着服务器的运行时间增加,服务器的内存占用也随之增加,可能是程序中出现内存泄露,请向下调整参数MaxRequestsPerChild的值以降低内存泄露带来的影响,然后尽快找出程序中的问题之所在。

五、配置应用
  1、修改应用目录的WEB-INF/web.xml
  在web.xml的<web-app></web-app>之间添加<distributable/> ,表示在分布式Web容器中部署
  2、添加jboss-web.xml
  在WEB-INF目录下新建jboss-web.xml,内容如下:
<jboss-web> 
	<context-root>/应用名称</context-root>
	<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>


六、需要注意的问题
  1、session序列化
  如果需要用到session复制的话,那么放进session中的类必须是实现了Serializable接口的
  2、UseJK
  参考网上的参考资料中都提到了需要将JBOSS_HOME/server/all/deploy/jboss-web.deployer/META-INF/jboss-service.xml中搜索UseJK,将其设为true,如果这样做的话,那么就会由jboss进行session复制了,使用的是mod_jk(2),其实mod_jk(2)是有bug的,实际上并不会做session的复制,所以千万不要将UseJK设为true,我就是因为这个bug调了整整两天
  3、mod-jk.conf
  网上很多资料都说到Apache的httpd.conf中引入mod-jk.conf,还要配什么uriworkermap.properties、workers.properties、mod-jk.conf,其实都不需要的,因为Apache2.2已经整合了mod_jk模块了,因为这个弄巧成拙我也白浪费了一天

七、Jboss应用部署可能会遇到的问题
  spring-mvc部署到jboss中时会遇到没有办法使用注解也找不到各种bean的怪问题,解决的办法是修改“JBOSS安装目录/server/default/deploy/jboss-web.deployer/META-INF”下的jboss-service.xml文件,改属性“UseJBossWebLoader”为true。
该属性原文解释如下:
A flag indicating if the JBoss Loader should be used. This loader uses a unified class loader as the class loader rather than the tomcat specific class loader.
The default is false to ensure that wars have isolated class loading for duplicate jars and jsp files.
该配置表明是否使用JBoss自身的classloader来加载webApp相关的资源;因为JBoss是通过集成Tomcat来实现Web Container的,而两者都有自己独立的classloader;
若设置为true,则表示Web应用加载时都将使用JBoss统一的classloader,即此时采用共享的扁平的UnifiedClassLoader;
若设置为false,则表示Web应用采用自己独立的WebAppClassLoader进行加载,此时Web应用和JBoss之间是完全隔离的,这也是该配置项的默认值。

八、分布式部署
  jboss4.2.2是支持分布式部署的,只需要在jboss启动后,将打包好的war、jar、ear发布到JBOSS_HOME\server\all\farm目录下,那么就会将这个文件统一分发到集群中其他的服务器中了,需要注意的是目前只支持单一文件类型的,不支持发布文件夹。

猜你喜欢

转载自huntt.iteye.com/blog/2057160