JBOSS EAP 6 系列九 Cluster负载均衡集群

摘要

    本文介绍基于mod_cluster组件的JBOSS集群的架设,首先介绍了mod_cluster的原理,然后通过一个实例展示如何构建一个真正的Jboss集群。最后通过一系列测试及讲解介绍集群的负载均衡机制。


一、 基于mod_cluster的JBOSS集群简介

    mod_cluster是一个非常简单易用的集群管理工具,主要功能:自动发现集群主机并注册主机。为集群提供负载均衡能力,为集群提供容灾的能力。官网链接http://mod-cluster.jboss.org/

 

    JBOSS7.2之后直接将mod_cluster做为其中一个模块集成到JBOSS中。在$JBOSS_HOME/modules/system/layers/base/org/jboss/as/modcluster/main中是mod_cluster的模块配置,模块名称为org.jboss.as.modcluster。 domain.xml文件打开后能看到已经默认的放置在extensions加载项中<extensionmodule="org.jboss.as.modcluster"/>

 

 

二、 Mod_cluster原理介绍

    Mod cluster是以模块的形式集成在Apache httpd服务器中的一个工具。主要由6各模块构成:

  • mod_proxy.so  基础核心模块
  • mod_proxy_ajp.so  基本通讯协议模块
  • mod_slotmem.so 共享内存模块
  • mod_manager.so 从JBOSS或者Tomcat获得信息的模块
  • mod_proxy_cluster.so 为mode_proxy提供负载均衡的模块
  • mod_advertise.so 其他,提供mod_cluster能够监听多种packets和ip:port的能力

     工作原理,mod_manager负责监控网段中的属于同一管理组的主机,发现之后注册到核心模块mod_proxy中进行管理。由mod_proxy_ajp模块使用AJP协议与集群中的各个主机通讯。当接收到请求时,会在内存共享mod_slotmem中记录该请求,mod_proxy_cluster为集群提供负载均衡能力决策由哪个主机进行该请求的处理。最终由mod_proxy_ajp将请求转发到具体主机。mod_slotmem为集群提供容错能力,当一台主机没有能够正确返回,或者主机在处理过程中挂掉了。mod_proxy_cluster会重新计算并发请求给存活的主机。

 


三、 实现由mod_cluster为JBOSSEAP提供的集群


3.1 实验内容

在上一节《ManagedDomain》的基础上,我们添加一台主机(clusterManager)专门做集群管理。因此我们有3台计算机:

  • clusterManager(192.168.0.110) 负责集群管理
  • master(192.168.0.115) 提供3台虚拟服务主机
  • server2(192.168.0.116) 提供3台虚拟服务主机

    6台虚拟主机中server-one,server-four,server-five属于同一个管理域main-server-group,而server-two,server-three,server-six属于同一个管理组other-server-group。

一下实验通过对mod_cluster1.2.0Final的安装配置,JBOSS域管理文件的配置来实现对other-server-group的管理

 

3.2 简单配置JBOSS

    JBOSS需要配置两样东西,一个是modcluster与虚拟主机通讯使用的HornetQ,一个是modcluster的须在均衡配置。

    打开master中的$JBOSS_HOME/domain/configuration/domain.xml文件。找到other-server-group对应的profile配置<profilename="full-ha">

在其中找到<subsystemxmlns="urn:jboss:domain:messaging:1.4">为<hornetq-server>做一个简单的配置,如下

           <subsystem xmlns="urn:jboss:domain:messaging:1.4">
                <hornetq-server>
                     <cluster-user>jms-user</cluster-user>
                      <cluster-password>simple-pass</cluster-password>
                </hornetq-server>
           </subsystem>

    这样配置之后不需要验证,可以直接与mod_cluster通讯。


    在<subsystemxmlns="urn:jboss:domain:modcluster:1.1">中配置如下

           <subsystem xmlns="urn:jboss:domain:modcluster:1.1">
               <mod-cluster-config advertise-socket="modcluster"connector="ajp">
                   <dynamic-load-provider>
                       <load-metric type="busyness"/>
                   </dynamic-load-provider>
               </mod-cluster-config>
           </subsystem>

    配置使用APJ协议通讯,负载均衡使用busyness标准配置。也就是忙的时候才调度别的主机。具体的负载均衡在后面的部分会做更详细的介绍。

 

3.3 安装配置mod_cluster


3.3.1 下载安装

下载http://mod-cluster.jboss.org/downloads/1-2-0-Final,为了简单起见,我们使用带httpd的mod_cluster包,选择一下包进行下载。

binaries linux2-x86

mod_cluster 1.2.0.Final tar bundles

8.3M

2012-02-09

LGPL

mod_cluster-
Downloads: 802


之后放到clusterManager中解压,往后解压目录我们简称为$Mod_Cluster。这其实就是一个配置了mod_cluster组件的httpd服务器。


3.3.2 modcluster配置

我们看一下其中的几个重要的目录:

  • $Mod_Cluster/opt/jboss/httpd/lib/httpd/modules目录:放置httpd模块的地方,包含mod_cluster的6个组件。
  • $Mod_Cluster/opt/jboss/httpd/httpd/conf/httpd.conf文件:httpd的配置文件。
  • $Mod_Cluster/opt/jboss/httpd/sbin目录: installhome.sh环境变量设置脚本和apachectl.sh是httpd的启动文件。

    我们需要关注的就是以上3个地方。(如果不是直接下载,而是使用apache2服务器,我们可以进入对应的models去放置这6个组件并配置到httpd.conf中。)我们这里是直接使用带mod_cluster的完整httpd,所以只需要简单看一眼有没有这6各组件即可。


    需要执行以下$Mod_Cluster/opt/jboss/httpd/sbin/installhome.sh,(如果是直接部署在apache2服务器上就不需要执行这个步骤了。)这个脚本负责将我们下载的这个httpd的关键目录写入到环境变量中,如果不执行它的话系统找不到httpd的正确执行路径,因为不能正确启动mod_cluster。


    然后进入httpd.conf文件进行配置,需要修改以下三处:

  1. 在文件中找到Listen8000修改为: Listen 192.168.0.110:80
  2. 在文件中找到#ServerNamewww.example.com:80在下面添加上一个ServerName192.168.0.110:80
  3. 找到最后的<IfModule>标签,标签名为<IfModulemanager_module>做如下修改:

<IfModule manager_module>
  Listen192.168.0.110:10001
  <VirtualHost*:10001>
    <Location/>
     Orderdeny,allow
     Deny from all
     #Allow fromall
     Allow from192.168.0.
   </Location>
   #ServerAdvertise on http://@IP@:6666
   #AdvertiseSecurityKey 1234567890
    #AdvertiseGroup@ADVIP@:23364
   EnableMCPMReceive
    AllowDisplay On
    <Location/mod_cluster_manager>
       SetHandlermod_cluster-manager
       Orderdeny,allow
       Deny fromall
       #Allow fromall
       Allow from192.168.0.
   </Location>
   KeepAliveTimeout 300
   MaxKeepAliveRequests 0
       ManagerBalancerName other-server-group
   AdvertiseFrequency 5
 </VirtualHost>
</IfModule>



    其中Listen192.168.0.110:10001用于暴露cluster的管理端口。<Location/mod_cluster_manager>用于配置登陆页面,开启之后我们可以通过192.168.0.110:10001/mod_cluster_manager来访问查看cluster的信息。

    两处Allowfrom all注释掉修改为Allowfrom 192.168.0.特定的网段:

  • 第一处用于虚拟主机的搜索,只在特定网段搜索,这样提高modcluster的性能。也可直接使用all,这样的话,就回到所有能直接联通的网段中搜索。
  • 第二处用于cluster页面可登陆的主机IP的设置。这里也设置为Allowfrom 192.168.0.,仍然可以直接默认为all允许所有可接入的主机IP来访问192.168.0.110:10001/mod_cluster_manager页面。

 3.3.3 启动modcluster

    执行启动命令:

$Mod_Cluster/opt/jboss/httpd/sbin/apache start  开启httpd服务

$Mod_Cluster/opt/jboss/httpd/sbin/apache stop  关闭httpd服务

 

    启动后可以使用如下链接检查httpd的启动是否正确

 JBOSS EAP 6 系列九 Cluster负载均衡集群_第1张图片


    检查管理页面 http://192.168.0.110:10001/mod_cluster_manager

 JBOSS EAP 6 系列九 Cluster负载均衡集群_第2张图片

 

    如果启动着master和server,我们会看到other-server-group的虚拟机都注册到了集群当中


Master:

[Server:server-two] 20:48:40,323 INFO  [org.jboss.modcluster](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) MODCLUSTER000011:jboss.web will use <strong>31a70009-aa44-3ed1-b207-38872bf0d1cf</strong> as jvm-route
[Server:server-three] 20:48:45,996 INFO  [org.jboss.modcluster](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) MODCLUSTER000011:jboss.web will use <strong>a162a574-0743-3e04-be21-8068c31481aa</strong> as jvm-route


Server2

[Server:server-six] 20:48:39,441 INFO  [org.jboss.modcluster](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) MODCLUSTER000011:jboss.web will use <strong>bfd7a91e-0e3b-3860-9b9c-2bb4771c424e</strong> as jvm-route

 

    同时在http://192.168.0.110:10001/mod_cluster_manager会看到注册了的这3台虚拟主机

 JBOSS EAP 6 系列九 Cluster负载均衡集群_第3张图片

 

四、 集群能力测试 

    本节主要介绍集群的能力,特别是负载均衡能力。分三小节包括两个测试和一个负载均衡的配置方式的讲解。


4.1 测试1--cluster服务调度

通过http://192.168.0.110/HelloDomain/来访问部署到other-server-group中的应用HelloDomain.

 JBOSS EAP 6 系列九 Cluster负载均衡集群_第4张图片


Master的日志中能看到下面这条:

[Server:server-three] 21:39:34,659 INFO  [stdout] (ajp-/192.168.0.115:8259-2)HelloDomain

也就是说这次的请求被转发给了server-three来处理。

 

4.2 负载均衡配置介绍

    如本文3.2中介绍的,在master的domain.xml文件中有一下配置

           <subsystem xmlns="urn:jboss:domain:modcluster:1.1">
               <mod-cluster-config advertise-socket="modcluster"connector="ajp">
                   <dynamic-load-provider>
                       <load-metric type="busyness"/>
                   </dynamic-load-provider>
               </mod-cluster-config>
           </subsystem>

    其中<load-metrictype="busyness"/>用于指定负载均衡的机制。具体怎么配可以查看$JBOSS_HOME/docs/schema/jboss-as-mod-cluster_1_1.xsd,文件中有下配置用于设置load-metric。

  <xs:simpleTypename="loadMetricEnum">
   <xs:restriction base="xs:token">
      <xs:enumerationvalue="cpu"/>
     <xs:enumeration value="mem"/>
     <xs:enumeration value="heap"/>
     <xs:enumeration value="sessions"/>
     <xs:enumeration value="requests"/>
     <xs:enumeration value="send-traffic"/>
     <xs:enumeration value="receive-traffic"/>
     <xs:enumeration value="busyness"/>
   </xs:restriction>
 </xs:simpleType>

load-metric每项有两个属性weight和capacity。可设置为形如

<span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; "><</span><span style="font-style: normal; color: rgb(204, 0, 0); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; ">load-metric</span><span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; "> </span><span style="font-style: normal; color: rgb(204, 0, 0); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; ">type=</span><span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; ">"cpu" weight="2" capacity="1"/> </span>

load-metric能配置多项,具体计算方式是根据各项的weight和capacity矩阵来计算各个虚拟机的能力从而实现负载均衡。weight和capacity从1开始往上权重越来越低。

 

4.3 测试2--负载均衡

    为了看到负载均衡的效果,我们简单的配置一个<load-metrictype="cpu"/>在负载均衡配置项中。然后写一个计算量大的程序来占用大量的cpu运算单。从而观察mod_cluster的负载均衡机制。

<%@ page language="java" contentType="text/html;charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE htmlPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=ISO-8859-1">
<title>Please delay the session</title>
</head>
<body>
<%
       System.out.println("Evaluatingdate now" );
       java.util.Datedate = new java.util.Date();
%>
 
Hello! The start time is now <%= date %>
<br>
<%
       double num = 1;
       for(int i = 1 ; i < 99999; i++){
              for(int j = 0; j < 99999; j++){
                     num= num + i*j;
              }
       }
       java.util.Datedate2 = new java.util.Date();
%>
Hello! The finish time is now <%= date2 %>
The number is: <%= num %>
</body>
</html>


然后打包为Delay.war,将其部署到other-server-group中,从虚拟主机的log可以看到成功部署的信息

[Server:server-three]22:07:11,253 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876:Starting deployment of "Delay.war" (runtime-name:"Delay.war")
[Server:server-two]22:07:11,267 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876:Starting deployment of "Delay.war" (runtime-name:"Delay.war")
[Server:server-three]22:07:11,353 INFO  [org.jboss.web](ServerService Thread Pool -- 78) JBAS018210: Register web context: /Delay
[Server:server-two]22:07:11,389 INFO  [org.jboss.web](ServerService Thread Pool -- 74) JBAS018210: Register web context: /Delay
[Server:server-three]22:07:11,498 INFO  [org.jboss.as.server](host-controller-connection-threads - 3) JBAS018559: Deployed"Delay.war" (runtime-name : "Delay.war")
[Server:server-two]22:07:11,501 INFO  [org.jboss.as.server](host-controller-connection-threads - 3) JBAS018559: Deployed"Delay.war" (runtime-name : "Delay.war")
[Server:server-six] 22:07:11,248 INFO  [org.jboss.as.server.deployment] (MSC servicethread 1-1) JBAS015876: Starting deployment of "Delay.war"(runtime-name: "Delay.war")
[Server:server-six] 22:07:11,318 INFO  [org.jboss.web] (ServerService Thread Pool --74) JBAS018210: Register web context: /Delay
[Server:server-six] 22:07:11,489 INFO  [org.jboss.as.server](host-controller-connection-threads - 2) JBAS018559: Deployed"Delay.war" (runtime-name : "Delay.war")

然后我们开7个浏览器多次调用http://192.168.0.110/Delay/可以看到3个虚拟主机上都有负载出现,因而实现了负载均衡机制。

[Server:server-two] 22:18:04,382 INFO  [stdout] (ajp-/192.168.0.115:8159-15)Evaluating date now
[Server:server-two] 22:18:04,385 INFO  [stdout] (ajp-/192.168.0.115:8159-16)Evaluating date now
[Server:server-two] 22:18:04,422 INFO  [stdout] (ajp-/192.168.0.115:8159-18)Evaluating date now
[Server:server-three] 22:18:36,496 INFO  [stdout] (ajp-/192.168.0.115:8259-4)Evaluating date now
[Server:server-six]22:18:27,662 INFO  [stdout](ajp-/192.168.0.116:8259-1) Evaluating date now
[Server:server-six] 22:18:46,341 INFO  [stdout] (ajp-/192.168.0.116:8259-4)Evaluating date now
[Server:server-six] 22:18:46,349 INFO  [stdout] (ajp-/192.168.0.116:8259-3)Evaluating date now


 小结

    集群有三种:HPCC高性能集群、balancer负载均衡集群、disasterRecovery容灾集群或高可用性集群。Mod_cluster实现JBOSS的一种Balancer负载均衡型集群。本文介绍了modcluster原理,集群实现,以及如何配置负载均衡。

 

你可能感兴趣的:(cluster,jboss,负载均衡,集群,EAP,jboss7)