生产环境中的JBoss AS7 集群方案

JBoss AS7集群方案...2

基础环境搭建...2

安装jdk.3

AS7安装、配置3

AS7群集配置、测试18

AS7集群配置说明18

mod_cluster负载平衡配置27

测试mod_cluster负载平衡32

JBoss AS7集群方案

基础环境搭建

安装的软件:

Redhat.Enterprise.Linux.v6.UPDATE.3.X86_64

jdk-6u33-linux-x64

jboss-as-7.1.0.Final

httpd-2.2.22

mod_cluster-1.1.3.Final-linux2-x64-so.tar

安装jdk

1)下载jdk-6u33-linux-x64,上传到linux系统,/usr/local/java的文件夹。

2)添加执行权限:chmod 755 jdk-6u33-linux-x64

3)执行该文件:./jdk-6u33-linux-x64,会出现jdk的文件夹。

4)更改系统环境变量:用root用户,vi /etc/profile,在后面添加:

#SetEnvironment of java & jboss

JAVA_HOME=/usr/local/java/jdk1.6.0_33

JRE_HOME=/usr/local/java/jdk1.6.0_33/jre

PATH=$PATH:$JAVA_HOME/bin:JRE_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:

修改后通过source /etc/profile使它生效。

5)替换系统jdk:RHEL好多都自带jdk,但是版本比较老,要使用新下载的jdk,需要重新连接。

cd /usr/bin

ln -s -f /usr/local/java/jdk1.6/jre/bin/java

ln -s -f /usr/local/java/jdk1.6/bin/javac

6)检查jdk版本:java –version。出现下面显示,表示安装成功。

java version "1.6.0_33"

Java(TM) SE Runtime Environment (build 1.6.0_33-b04)

Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03, mixed mode)

AS7安装、配置

分配用户组

# groupadd-g 700 jboss

# useradd -u700 -g 700 jboss--创建用户

# passwd jboss--激活jboss用户

执行下列命令将/jboss分配给jboss用户。

# cd /

# chown -R jboss:jboss/jboss

# chmod 755/jboss

JBOSS AS7的新特性

JBoss AS7新加入了域(domain)的概念并实现了相关功能。域的提出及实现,其目的是使得多台JBossAS服务器的配置可以集中于一点,统一配置、统一部署,从而在管理多台JBoss AS服务器时,实现集中管理。本文详细介绍如何使用AS7的这一新特性。

域(Domain)的概念及其与群集(Cluster)的区别

对于使用过JBoss AS过往版本的用户,可能对AS所提供的群集功能已经很熟悉了,在理解域的时候可能会遇到困难。那么域和群集有什么区别,用处上有什么不同呢?

总的来讲,JBoss的群集的目的是提供:

*负载平衡(Load Balance)

*高可用(High Availablity)

而域的目的则是将多台服务器组成一个服务器组(Server Group),并为一个服务器组内的多台主机(Host)提供:

*单点集中配置(通过一个域控制器,即Domain Controller,实现组内主机的统一配置)

*单点统一部署,通过域控制器将项目一次部署至组内全部主机。

简单来讲,群集的目标是让多台服务器分摊压力,当一台或多台服务器宕机时,服务可以继续保持运转;而域的目标则是提供集中配置和管理多台服务器的能力。

在没有域的概念时,要想让群集内的多台服务器或几组服务器保持统一的配置,一个一个分别的去手工维护,是非常麻烦的事情,而域的引入解决了这一问题。

我们可以理解域和群集的相互关系是”正交(orthogonal)”的:通过一横一竖这两条轴,JBoss AS为我们在运维方面提供了强大的可扩展能力。

准备工作

使用两台电脑做为实验器材,两台电脑的IP分别为192.168.191.134,192.168.191.130。分别运行JBoss AS7,并组成一个服务器组(Server Group)。

192.168.191.134这台机器做为域控制器(Domain Controller)主机分别被命名为”master“及”slave“。通过配置,将master与slave组成一个服务器组,名为’main-server-group’,其中master将做为这个服务器组的域控制器。

解释:

服务器组(Server Group):可以由多台服务器(Host)组成,并不一定只有两台,所以不要被master及slave这样的名字给迷惑了,以为一个服务器组仅支持一主一从两台hosts。在一个服务器组中,只有一台域控制器。

AS7配置说明

Master上面的配置

* domain.xml*

...

..

...

...

...

...

...

...

这个文件里面有几个部分是值得我们关注一下的:

# extensions –这一部分定义了域中服务器在启动时需要加载的模块。AS7使用了全新设计的JBoss Modules来加载模块,大幅提高了服务器的启动。这一内容不是本文讲解重点,后续我会专门写一篇文章来介绍。目前了解到这一程度即可。

# profiles – profiles是domain中定义的一个核心概念,也是domain的核心组成部分。基于profiles,AS7便实现了域中各服务器的统一集中配置:用户可通过profile对各子系统(subsystem)进行配置,完成后将profile配置给某个或多个服务器组,各服务器组内的主机共用一份配置。

# server groups –服务器组的概念已经在前面的介绍中一再提及,也是AS7的域的设计中一个核心组成部分。在这里,AS7默认定义了两个服务器组:main-server-group及other-server-group,它们分别使用’default’profile及’ha’ profile。在本实验中,我们将使用main-server-group。

* host.xml

...

...

...

上面是一些host.xml中需要配置的关键内容,已经针对要做的测试做了一些配置上面的修改,以下是详细说明:

# host name按照我们的需要改成了”master”。

# management – management定义了服务器的管理端口,其中:9999端口是所谓”native”二进制端口,后面的jboss-admin.sh管理命令会使用这个端口;9990则提供基于WEB页面的管理端。我们等一下两种管理端口都会用到。

# domain controller –定义本服务器所需连接的domain控制器所在地址,因为master本身就是domain controller,所以连接至本机localhost即可。

# interfaces – management及public接口服务所在的地址,我们要将其设为slave可以访问到的IP地址,保证slave可以连接至host

# servers –一个物理主机实际上可以同时运行多台JBoss AS7的Server,而每一台Server都可以配置到不同的服务器组去。在本实验中,我们使用最简的情况,master上面只跑一个server-one,属于main-server-group,把其它AS7默认设定的server可以都删掉,只留server-one。

Slave上面的配置

* domain.xml

Slave这台机器不作为域控制器而存在,因此不需要管它,也可以将domain.xml删掉或改名。

* host.xml

...

...

上面的配置有几点需要说明:

* slave里面,host name指定为”slave”。

* domain-controller:指定为master的IP:192.168.191.134,通过9999管理端口进行通讯。

* slave上面,属于main-server-group的server也命名为”server-one”,这会和master上面的server冲突吗?实际上不会,因为两台同样名字的server运行在不同的host当中。

AS 7.1的补充说明

从JBoss AS 7.1开始,对控制端口(9999及HTTP端的9990)的安全配置成为必须。因此需要补充下述安全配置方面的步骤:

首先要在master上面创建管理员的账号,在bin目录下有add-user工具可以帮我们创建账号密码并进行配置,我们创建一个管理员账号admin,密码为123123:

master:~/projs/as7/710/bin$ ./add-user.sh

Enter details of new user to add.

Realm (ManagementRealm) :

Username : admin

Password :

Re-enter Password :

About to add user 'admin' for realm'ManagementRealm'

Is this correct yes/no? yes

Added user 'admin' to file'master/as7/710/standalone/configuration/mgmt-users.properties'

Added user 'admin' to file'master/as7/710/domain/configuration/mgmt-users.properties'

可以看到系统为我们分别在domain和standalone创建了mgmt-users.properties,我们是用域模式运行,因此查看domain/configuration/mgmt-users.properties这个文件的最后一行:

admin=95333971266d87fbfa7d9963dd5e89d6

可以看到相关账号密码已经被创建。此时查看host.xml:

...

...

可以发现host.xml已经把安全配置应用起来了,使用ManagementRealm这个安全域进行认证。

同样地,我们需要在slave主机上进行一模一样的工作。

接下来,我们需要做一下slave对master的认证连接工作。slave要想和master建立域控关系,需要知道master的管理端账号密码。在域控这一块,AS7对认证有要求:需要在域控制器上以过来连接的主机host名为用户名添加账号。

我们在slave的host.xml文件中指定了slave的host名为slave:

因此,master做为域控制器,需要在上面添加名为slave的管理员账号,密码仍为123123:

master:~/projs/as7/710/bin$ ./add-user.sh

Enter details of new user to add.

Realm (ManagementRealm) :

Username : slave

Password :

Re-enter Password :

About to add user 'admin' for realm'ManagementRealm'

Is this correct yes/no? yes

Added user 'slave' to file'master/as7/710/standalone/configuration/mgmt-users.properties'

Added user 'slave' to file'master/as7/710/domain/configuration/mgmt-users.properties'

这时再查看mgmt-users.properties,可以看到多了slave账号:

admin=95333971266d87fbfa7d9963dd5e89d6

slave=f469d84edde53032bdac0a42bdedd810

接下来,我们要在slave主机的的host.xml做下认证配置,使用这个账号与master进行认证通信:



上面的配置中有这些值得注意:

我们在认证域ManagementRealm中配置了server-identities,这个认证域用在与域控制器master的连接方面。其中secretvalue是domain上对应slave主机名的那个账号的密码,用base64加密。我们在master上面配置的slave账号的密码为123123,MTIzMTIz=则是123123的base64加密后的文字。这个配置用在连接domain-controller时进行认证:

有关更多的AS7的安全配置的信息,可查看官方文档:

https://docs.jboss.org/author/display/AS7/Securing+the+Management+Interfaces

关于host.xml的详细配置方法,也可参考as7目录下自带的xsd文档:

docs/schema/jboss-as-config_1_1.xsd

部署

配置完成后,接下来便到了实际部署的阶段,我们将master和slave上面的AS7分别用domain.sh启动起来。

[Server:server-one] 21:17:14,491 INFO[org.jboss.as] (Controller Boot Thread) JBossAS 7.0.0.CR1 "White Rabbit" started in 6029ms - Started 109 of 163services (54 services are passive or on-demand)

[Host Controller] 21:18:02,635 INFO[org.jboss.domain] (pool-3-thread-1)Registered remote slave host slave

启动成功的话,应该可以在master上面看到上面的日志,slave被成功的注册进来。

完成启动后,我们需要将待使用的virtual-host启动起来,当AS7以domain的方式启动时,默认是不启动任何virtual server,我们可以在domain.xml中配置默认加载virtual-host,也可以在服务器运行起来后,使用管理端命令动态的加载,在这里我准备使用后一种方式,从而讲解AS7管理端的使用方法。

在AS7的bin目录下面有一个jboss-admin.sh, 这是AS7提供的全新的管理工具,我们使用这个工具,连接至master:

./jboss-admin.sh

You are disconnected at the moment. Type'connect' to connect to the server or 'help' for the list of supportedcommands.

[disconnected /] connect 192.168.191.134

Connected to domain controller at192.168.191.134:9999

可以看到,我们已经连接到了master的9999管理端口。接下来可以查看”default”这个profile当中的web模块的运行情况:

[domain@192.168.191.134:9999 /]/profile=default/subsystem=web:read-children-names(child-type=connector)

{

"outcome" => "success",

"result" => ["http"]

}

可见http服务器已经启动,由于我们的”main-server-group”使用的是default这个profile,因此,服务器组中的两台host的web模块接受profile的统一配置,都是已启动的。继续看一下web模块中的细节:

[domain@192.168.191.134:9999 /]/profile=default/subsystem=web/connector=http:read-resource(recursive=true)

{

"outcome" => "success",

"result" => {

"protocol" =>"HTTP/1.1",

"scheme" => "http",

"socket-binding" => "http",

"ssl" => undefined,

"virtual-server" => undefined

}

}

注意到virtual-server的状态是未定义(undefined),我们要想将一个web项目部署进服务器组中的各个host,就必须加载一个待部署的virtual-server,因此我们使用命令来添加:

[domain@192.168.191.134:9999 /]/profile=default/subsystem=web/virtual-server=other.com:add

{

"outcome" => "success",

"result" => {"server-groups" =>[("main-server-group" => {

"master" => {

"host" => "master",

"response" => {"outcome" =>"success"}

},

"slave" => {

"host" => "slave",

"response" => {

"outcome" => "success",

"result" => undefined

}

}

})]}

}

可以看到,我们之前在domain.xml中配置的“other.com”这个virtual host被成功添加了。

接下来是部署WEB应用的环节,我们首先用maven制作一个最简单的web项目,仅包含一个欢迎页面:

mvn archetype:generate-DgroupId=com.mycompany.app -DartifactId=my-webapp-DarchetypeArtifactId=maven-archetype-webapp

生成的项目如下:

|-- pom.xml

`-- src

`--main

|-- resources

`-- webapp

|-- WEB-INF

|`-- web.xml

`-- index.jsp

使用如下命令将项目打成WAR包:

mvn package

得到war:

target

`-- my-webapp.war

接下来是部署这个war包,对于本次实验来讲,关键的部分在于能否通过domain提供的servergroup管理功能,一次将一个项目部署进server group中的多台服务器。我们接下来就验证这点,顺便看下AS7提供的WEB管理功能,打开WEB浏览器,访问master的HTTP端口的管理地址:

http://192.168.191.134:9990/console/App.html

可以看到,管理页识别出AS7正运行在domain模式之下,并且目前共有两台主机运行(左上角的列表分别列有master及slave)。我们要关注的是server-group:点击右上角的”Server Groups”,进入服务器组的管理页面,然后点击左边的”ManageDeployments”页面,进入部署功能页面:

可以看到,目前还没有任何资源被加至服务器组,此时点击右边的”Add Content”功能,将my-webpp.war添加进Content Repository(域控制器用于保存待部署资源的目录)。

然后点击”Add To Group”将my-webapp.war添加至“main-server-group”,并将其enable。

此时我们预期的结果应该是my-webapp.war被同时部署至master及slave了,分别试着访问master及slave的http资源,看看是否都部署上my-webapp这个应用了:

结果如我们所预期的那样,两台服务器都可以访问到这个部署的资源。通过对一个点(Domain Controller)的配置与部署,我们实现了多AS7服务器的集中管理。

小结

通过域这个概念,实现了多服务器统一管理,统一配置,资源统一部署的目标。通过集中管理,我们可以在此基础上再进行群集的划分与部署,实现群集内多台服务器的单点配置与管理。可以说AS7的Domain概念的引入,与群集的概念组合在一起,通过一横一从两条轴,形成了完整的坐标系。

AS7群集配置、测试

AS7集群配置说明

AS7的群集功能,从大的框架上来讲承袭沿用以往版本的设计,核心仍是基于JGroup。

AS7的群集功能设计有了多方面改进:首先是简化了配置文件,实现单点式配置;此外,AS7中引入了域的概念,通过域对群集内各主机实现了统一配置部署。

AS7开始,群集配置被大大简化,并且当AS7运行在域控模式下时,群集默认是自发现,自启动的。虽然配置变得更为傻瓜,但我们仍需了解一些技术细节,从而可以理解AS7为我们提供的默认群集配置,并根据自己的需要进行配置调整。下面是详细讲解:

AS7的群集配置主要集中在域控制器的配置文件domain.xml里。在domain.xml中,默认有两个profile,一个是default,一个是ha:

...

...

其中,ha这个profile里面配置了群集的所需组件(ha的含义代表High Availability,高可用)。这其中主要包括JGroup,Infinispan和modcluster:

...

...

...

这三个组件都是构成AS7群集的要素:

* JGroup用与群集中多AS服务器之间的通信和连接。有关JGroup的详细配置,需要对JGroup本身有一个了解,本文不详细展开这一块。

* Infinispan从AS7开始,开始代替JBossCache承担缓存的功能

* modcluster负责Apache HTTPD与AS群集的连接工作。通过HTTPD作为前端,为用户提供一个统一的群集访问点,后面负责将负载分担至群集内各节点。

有关Infinispan可以多说几句:这个项目的引入是AS7的亮点之一,有兴趣可以去它的项目网站上进行深入的了解:

http://www.jboss.org/infinispan

AS7利用Infinispan为多个模块提供缓存服务,包括:

*为群集提供缓存

*为Hibernate提供二级缓存

*为Stateful Session Bean提供群集复制缓存

*为web项目的session群集复制提供缓存

这一点可以从刚刚提到的domain.xml中的ha配置中看到,我们稍微展开一下Infinispan子系统的配置:

...

...

...

...

可以看到,Infinispan为刚才说明的4个部分提供缓存。这块已经完全替代了AS6及原有JBoss AS版本中的JBoss Cache。

接下来我们要看domain.xml中另一块与群集相关的配置:

...

...

在协议层配置方面,我们发现有domain.xml为我们配置好了一个ha-sockets的端口绑定方案。最后,在server-group中,我们可以在domain.xml中发现一个配置好的,支持群集的服务器组:

可以看到,这个other-server-group使用了ha这个配置方案,并在协议层绑定至ha-sockets。

因此通过以上分析,如果我们想使用AS7提供的群集功能,在默认情况下,将项目部署至other-server-group这个服务器组即可。接下来是实际操作的过程:

配置好了域模式来启动AS7。这里要说明一下,AS7的群集功能并不依赖于域管理功能,但是在AS7下,域管理功能和群集结合起来用是推荐的使用方式,通过域管理可以对群集内各AS服务器节点进行统一管理,非常方便。

按照《AS7配置说明》一文中的方法将master和slave两台主机运行起来。但有一点需要注意,我们要使用domain.xml中不同的服务器组来部署群集应用:

注意到在server-groups之中,有一个名为“other-server-group”的服务器组,默认使用ha配置方案,并且绑定至ha-sockets。部署在这个服务器组中的项目,将可以组建群集。

此外还有一点配置需注意,在master和slave的host.xml中,要为使用other-server-group的主机使用相同的端口offset。下面分别是master和slave中host.xml的相关配置。首先是master的配置:

...


the default socket-groupdeclared in the server-group -->

然后是slave中的host.xml配置:


the default socket-group declaredin the server-group -->

这里的重点是master和slave的端口port-offset都设定为250。因为我们要用这两台主机组建一个群集,如果两个主机服务于不同的端口,那么将会在后续两台主机分担请求时造成不必要的麻烦。此外,在本文中后续我们将使用mod_cluster来将用户请求分派至JBoss AS群集内各节点,而mod_cluster需要群集内各JBoss AS节点服务于相同端口,才能保证正确地将请求分派。

下面再多说几句关于host.xml中的server的port-offset的问题。为什么我们要设置port-offset呢?因此AS7支持同时运行多服务器,并且不同的服务器可以运行于不同的服务器组,这有点类似于Apache HTTPD中虚拟主机的概念,运行一个服务器,可以服务于多个域名,跑很多项目。

因此,如果AS同时跑着多个服务器,为避免端口冲突,就需要使用port-offset将不同的服务器置于不同的端口之下。比如:

类似上面这样的配置,有三个服务器,第一个服务器绑定于默认设置的端口上,第二个服务器offset为150,第三个为250。那么,如果默认的服务端口号为8080,那么第二个服务器就是8080+150 = 8230,第三个则服务于8080+250= 8330端口,其它各服务端口依此类推。

通过使用offset配置,大大减少了重复的配置。AS7将所有端口的设置置于domain.xml的配置之中:

...

通过在domain.xml的socket-binding-groups中设置好服务的端口号,再在host.xml中配合port-offset的设置,就实现了多服务器的集中管理,简化了配置工作。

和上文中介绍的一样,我们还是用两台主机做实验,域控制器为master,此外还有一台域内主机slave。

然后我们创建一个测试用的项目,这个项目应该包含Session的群集复制。在web.xml中添加这样一行就可以开启session的群集复制了:

为了方便起见,我创建了一个demo项目在这里:

https://github.com/liweinan/cluster-demo

可以把代码签出使用maven进行编译打包,然后通过域控制器部署至AS7。如果你在master及slave中的host.xml都将server-three设置成了启动时自动加载:

...

注意到auto-start=true,那么两台主机启动时,你可以看到群集组建的日志(因此server-three的服务器组为other-server-group,而如前所述,other-server-group使用了群集配置方案):

master上面的日志:

[Server:server-three] 14:27:28,581 INFO[stdout] (MSC service thread 1-2)

[Server:server-three] 14:27:28,582 INFO[stdout] (MSC service thread 1-2)-------------------------------------------------------------------

[Server:server-three] 14:27:28,582 INFO[stdout] (MSC service thread 1-2) GMS:address=server-three/web, cluster=web, physical address=192.168.191.134:55450

[Server:server-three] 14:27:28,582 INFO[stdout] (MSC service thread 1-2)-------------------------------------------------------------------

slave上面的日志:

[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)

[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)-------------------------------------------------------------------

[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)GMS: address=server-three-slave/web, cluster=web, physical address=192.168.191.2:55450

[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)-------------------------------------------------------------------

[Server:server-three-slave] 14:28:02,925INFO[org.jboss.as.clustering.CoreGroupCommunicationService.web] (MSC servicethread 1-9) JBAS010207: Number of cluster members: 2

以及我们可以看到群集复制及缓存也都加载了起来:

[Server:server-three-slave] 14:28:03,419INFO[org.jboss.as.clustering] (MSCservice thread 1-9) JBAS010301: Started repl cache from web container

[Server:server-three-slave] 14:28:03,419INFO[org.jboss.as.clustering] (MSCservice thread 1-8) JBAS010301: Started registry cache from web container

当然,如果将host.xml中的主机配置改为auto-start=false也没有关系,只不过AS7在启动时不会加载这些群集模块,只有项目被部署至server-three时才会按需加载,从而提高AS7的第一次启动时间。

启动完成之后是部署cluster-demo应用,访问域控制器的web控制端进行部署,需要注意的是要部署到server-three:

如果没有什么问题的话,通过域控制器,这个项目就被同时部署到master及slave上面了。

我们可以试着分别访问群集内两个节点主机,注意到我们在host.xml配置server-three端口的offset为250,因此两个节点服务于8080+250=8330端口:

可以看到,群集内两个节点都跑起来了。我们接下来要使用这个群集,让它们承担负载平衡及并提供HA高可用。在这一点上,有多种方案可以选择,比如基于硬件的群集控制器,基于协议层的LVS,或是nginx来分发请求至群集内的两个节点。

但是AS7默认支持mod_cluster的方式是最方便的,mod_cluster也针对AS7做了很多优化工作,支持开箱即用,不需要很复杂的配置,因此本文下面将基于mod_cluster来讲解群集的使用方法。

mod_cluster负载平衡配置

mod_cluster使用Apache HTTPD做为群集控制服务器,用户访问httpd提供的服务端口,然后由mod_cluster负责把请求转给后端的AS7内群集各节点。

负载均衡原理如下图:

mod_cluster的负载平衡计算策略是十分智能的,它通过监控群集内各服务器的性能使用情况,把请求按需进行分配。有关mod_cluster的详细配置策略,可参考:

http://docs.jboss.org/mod_cluster/1.1.0/html_single/#LoadMetric

这里简单介绍下安装方法:

安装Aapche httpd

分配用户组:

# useradd-d /apache -u 701 -g 700 webadmin--把/apache目录分配给jboss

# passwd webadmin--激活webadmin用户

执行下列命令将/apache分配给webadmin用户。

# cd /

# chown -R webadmin:jboss/apache

# chmod 755/apache

先卸载自带的apache,再安装新的apache。

1)我安装的是apache2.2.22,那么安装前要卸载系统自带的apache2.0。避免冲突,rpm

–qa|grep httpd,系统会列出所有的httpd的包,我的是有个四个,下面需要一个一个卸载,rpm –e包的名称,将他们卸载完毕,在这里不用输入包的版本号,只是输入名称就可以卸载。卸载干净后就可以安装高版本的apache了。

注:有的包之间有连带关系,需要注意卸载的先后顺序。

注:有的包卸载会报依赖关系的通知,输入:rpm -e包的名称--nodeps

2)仿照jboss用户建立,建立apache的组合用户,用root用户建立apache文件夹并分给apache用户权限,但是apache用户不能起”apache”这个名字,这个名字系统有了,换个名字起,如:webadmin。

3)下载Apache2222.tar.gz。并上传至系统,放在/home的文件夹下面。

4)安装:进入安装文件所在目录,解压缩:

tar –zxvf Apache2222.tar.gz

完后会看到httpd的文件夹进入,配置:

./configure  --prefix=/apache/ \

--enable-module=so --enable-module=setenvif  --enable-module=rewrite \

--enable-rewrite=shared  --enable-proxy=shared --with-mpm=prefork \

--enable-so  --enable-auth-anon --enable-file-cache=shared \

--enable-disk-cache=shared  --enable-mem-cache=shared

接来下,编译安装

make clean

make

make install

从这里下载mod_cluster:

http://www.jboss.org/mod_cluster/downloads

我下载的是:

mod_cluster-1.1.3.Final-linux2-x64-so.tar.gz

然后将相关的包解压到httpd的modules目录:

/etc/httpd/modules$ tar zxvfmod_cluster-1.1.3.Final-linux2-x64-so.tar.gz

然后,编辑httpd.conf:

% vi /etc/httpd/conf/httpd.conf

首先要让httpd侦听到公共端口上,而不是默认的localhost:

Listen 192.168.191.134:80

我们在这个demo中,mod_cluster和master域控制器在一台机器上,所以IP地址和master是一样。但是mod_cluster并不要求AS的域控制器与其在一台机器上,只要它们在一个子网即可通过IP Multicast来自动发现。此外,mod_cluster还支持广域网组建群集,但我怀疑这种方式的实用性,并且也不是本文的重点,所以并不详细展开协议层方面的细节。只需要理解一点就可以了:

*将你的mod_cluster+httpd服务器和你的与你的AS服务器置于一个子网。

然后是加载相关模块:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so

LoadModule slotmem_modulemodules/mod_slotmem.so

LoadModule manager_module modules/mod_manager.so

LoadModule proxy_cluster_modulemodules/mod_proxy_cluster.so

LoadModule advertise_modulemodules/mod_advertise.so

注意要把mod_proxy_balancer给disable掉,这个是和mod_proxy_cluster冲突的:

#LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so

最后是mod_proxy的相关配置:

Listen 192.168.191.134:6666

#Listen 127.0.0.1:8330

Order deny,allow

Deny from all

Allow from 192.168.191.

KeepAliveTimeout 60

MaxKeepAliveRequests 0

ManagerBalancerName other-server-group

AdvertiseFrequency 5

上面的重点在于这样几处:

Allow from 192.168.191.

我们的群集内各节点都处于192.168.191网段内,因此配置mod_cluster寻找这个网段内的所有节点。接下来是:

ManagerBalancerName other-server-group

AdvertiseFrequency 5

给群集起个名字,我们为方便说明,使用AS7中群集所在服务器组的名字:other-server-group。这个并没有什么强制要求。AdvertiseFrequency是mod_cluster发现各节点的查询间隔。这样,有新的节点加入群集,或是从群集中去掉,mod_cluster都是自动配置。

最后是启动httpd:

service httpd restart

查看httpd的日志,看看是否正常启动了:

% tail -f /etc/httpd/logs/error_log

[Fri Jan 20 16:48:44 2012] [notice] Advertiseinitialized for process 6189

[Fri Jan 20 16:48:44 2012] [notice]Apache/2.2.15 (Unix) DAV/2 mod_cluster/1.1.x configured -- resuming normaloperations

如果有上述日志说明正常启动了。如果有问题,任何时候日志都是你排错的好朋友。接下来我们来启动master和slave两个AS服务器,启动后,如果没什么问题,可以发现两台AS服务器都已经被mod_cluster发现,并纳入了mod_cluster的群集控制之下:

[Server:server-three-slave] 16:51:00,798INFO[org.infinispan.remoting.transport.jgroups.JGroupsTransport](Incoming-7,null) ISPN000094: Received new cluster view:[server-three-slave/web|7] [server-three-slave/web, server-three/web]

[Server:server-three] 16:51:07,676 INFO[org.jboss.modcluster.ModClusterService](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) Engine [jboss.web]will use jvmRoute: a019cde8-113d-362c-992e-ea4abc1bf389

接下来我们试着访问httpd的侦听地址,看看请求是否被mod_cluster转发至群集节点

测试mod_cluster负载平衡

接下来我们试试群集的高可用, 我们这里要用到cluster-demo项目。下面是方案:

*在master上面访问cluster-demo项目的put.jsp,设置一个session。

*断掉master服务。

*访问群集,访问get.jsp

*预期结果:用户的请求被转到slave,并且session的数据没有丢失。

接下来是实际操作:

首先访问master的put.jsp:

然后我们将master的AS7服务器停掉,这时候slave上面的AS7开始报错:

[Host Controller] 18:43:02,320 WARN[org.jboss.as.host.controller] (Thread-27)JBAS010900: Could not connect to remote domain controller 192.168.191.134:9999

报告连接不到域控制器。这个没有关系,我们此时还是访问群集节点:

会发现服务仍然可用,并且session数据没有丢失。但查看slave的日志,发现请求实际由slave承担了。整个实验实现了我们的预期。

此时,将master重新启动,发现master发现了slave,并重新接管域管理的工作。mod_cluster也发现了master并将其加入了群集节点,一切都是自动化的。

数据源(Data sources)

Datasources在通过子系统进行配置。声明一个新的数据源,需要两个步骤:提供一个JDBC驱动,然后定义一个使用这个JDBC驱动的数据源。

JDBC驱动安装

在应用服务器中安装JDBC驱动推荐使用一个常规的jar进行部署。因为当在域模式下运行应用服务器时,部署的内容会自动传送到要部署的所有服务器上,因此使用jar文件将利用这一特性而不需要关心额外的事情。

任何符合JDBC4的启动将会被自动识别并且按照名字和版本安装到系统中。JDBC jar使用Java server provider机制进行识别。Jar文件中需要包含一个文件名是META-INF/services/java.sql.Driver的文本文件,这个文件中包含在这个jar里的驱动类的名称。如果你的JDBC驱动jar不符合JDBC规范,我们通过其他方式也可以部署这样的驱动。

修改Jar文件

最直接的方式是简单的修改Jar文件添加缺失的文件。你可以通过一下命令添加:

The most straightforward solution is to simply modify the JAR and add themissing file. You can do

1.改变路径到或者创建一个空的临时文件夹.

2.创建一个META-INF子目录

3.创建一个META-INF/services子目录

4.创建一个只包含一行内容:JDBC驱动类的全名的文件META-INF/services/java.sql.Driver.

5.使用jar命令来跟新这个jar文件:

jar \-uf jdbc-driver.jar META-INF/services/java.sql.Driver

如何部署

JDBC4驱动

jar文件,请参考”应用部署“章节。

数据源定义(DatasourceDefinitions)

数据源在datasources子系统里定义:

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

h2

10

20

true

sa

sa

h2

jdbc:h2:mem:test

10

20

true

sa

sa

org.h2.jdbcx.JdbcDataSource

(参见standalone/configuration/standalone.xml)

如以上示例所示,数据源通过逻辑名来引用JDBC驱动.通过命令行(CLI)可以很方便的查询同样的信息:

[standalone@localhost:9999 /] /subsystem=datasources:read-resource(recursive=true)

{

"outcome" => "success",

"result" => {

"data-source" => {"java:/H2DS" => {

"connection-url" => "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",

"jndi-name" => "java:/H2DS",

"driver-name" => "h2",

"pool-name" => "H2DS",

"use-java-context" => true,

"enabled" => true,

"jta" => true,

"pool-prefill" => true,

"pool-use-strict-min" => false,

"user-name" => "sa",

"password" => "sa",

"flush-strategy" => "FailingConnectionOnly",

"background-validation" => false,

"use-fast-fail" => false,

"validate-on-match" => false,

"use-ccm" => true

}},

"xa-data-source" => undefined,

"jdbc-driver" => {"h2" => {

"driver-name" => "h2",

"driver-module-name" => "com.h2database.h2",

"driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource"

}}

}

}

[standalone@localhost:9999 /] /subsystem=datasources:installed-drivers-list

{

"outcome" => "success",

"result" => [{

"driver-name" => "h2",

"deployment-name" => undefined,

"driver-module-name" => "com.h2database.h2",

"module-slot" => "main",

"driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource",

"driver-class-name" => "org.h2.Driver",

"driver-major-version" => 1,

"driver-minor-version" => 2,

"jdbc-compliant" => true

}]

}

使用web控制台和命令行可以极大的简化JDBC驱动的部署和数据源的创建。

命令行方式提供了一些列的命令来创建和更改数据源:

[standalone@localhost:9999 /] help

Supported commands:

[...]

data-source- allows to add new, modify and remove existing data sources

xa-data-source- allows add new, modify and remove existing XA data sources

特定命令的详细描述请使用”

-b”参数查询。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容