关闭

JBOSS高可用方案以及配置流程

1555人阅读 评论(0) 收藏 举报

一、基础知识

11高可用方案的2个基本问题

(1) Load Balance

需要注意负载均衡问题, 使得请求可以较好分配。

它有2种表现形式

(a) 访问地址不同

例如, 网站www.hello.com. 当访问www.hello.com/us, Node1做出响应. 当访问www.hello.com/cn, Node2做出相应

(b) 任务分发

例如, 网站www.hello.com. 当有50000request到达时候, 将这些request按照2:1的比例分发给Node1Node2

(2) High Availability

       需要注意Session状态转移问题, 即在某个Server Node发生故障时保持Session连接。例如,当Apache将某个request分发给Node1, 并且进行了某些操作,这时候Node1突然crash或者Node1出现了网络故障, 这时要保证Session不会丢失, Session ID唯一和保留在Session中的内容不会丢失。

12基本原理介绍

如图1 所示,Node 1Node 2所是Apache的两个worker。当有request到达时, Apache通过Ajp13 协议动态的将请求分发给Node 1Node 2 例如, 当发送的request送给Node 1时,由Node 1处理发送来的request 进行处理后将response按照原路径返回,交给Apache。此后Apache再将收到的response返回给client端。

两个workerNode 1Node 2是真正负责处理client端发送来的请求。为了保持Session的一致性和稳定性,两个Node需要进行同步,即Session的复制,才能保证数据的统一。

二、举例说明配置

21环境说明

【机器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

22配置流程

(1)              %Apache_HOME%目录下

(a)          www.apache.com下载mod_jk.somodules目录

(b)          conf目录下的httpd.conf文件最后写入

# Include mod_jk's specific configuration file

Include conf/mod-jk.conf

(c)          conf目录下创建mod-jk.conf文件、uriworkermap.properties文件、workers.properties文件,文件的内容见附录一。其目的是为Apache设置2worker为其服务。

 

(2)              Node1%JBOSS_HOME%/server/all目录下

(a)    修改访问地址, 使得外部可以以主机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"…>

(b)    使得JBoss知道自己为Node1结点

deploy/jboss-web.deployer目录下的server.xml

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

改为

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

(c)    通知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>

(d)    定义重定向地址

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"…>

 

(3)              Node2%JBOSS_HOME%/server/all目录下

(a)    修改访问地址, 使得外部可以以主机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"…>

(b)    使得JBoss知道自己为Node2结点

deploy/jboss-web.deployer目录下的server.xml

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

改为

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

(c)    通知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>

(d)    定义重定向地址

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"…>

 

(4)              在自己的应用程序中

(a)    设置使得自己的应用程序使用集群

WEB-INF目录下的web.xml文件中<web-app>下添加

<distributable/>

(b)    在设置Jboss配置信息

WEB-INF目录下创建jboss-web.xml文件,文件内容见附录二

 

三、实验方案

【实验一】验证负载分配

实验步骤:

(1)              在浏览器中输入http://l92.168.0.42/jmx-console/

(2)              另开一个浏览器窗口, 输入http://l92.168.0.42/jmx-console/,可能会出现另外一个nodejmx-console

 

【实验二】验证负载分配和Session ID保持

实验步骤:

(1)              创建文件test.jsp, test.jsp中打印nodeIP地址, session idsingleton实例的某一自增变量

(2)              在一个浏览器窗口中访问test.jsp, 显示单一nodeIP地址, session idsingleton实例的某一自增变量, 点击刷新按钮, 看见同一IP地址和Session id

(3)              另开一个浏览器窗口访问test.jsp, 可能会显示另一nodeIP地址, session idsingleton实例的某一自增变量, 点击刷新按钮, 看见一IP地址和Session id. 在这里每个singleton变量的自增值是分别增加的.

(4)              仅保留一个浏览器窗口, ip显示42机器, 则把42机器上的jboss停止掉. 否则把180上的jboss停止掉. 刷新浏览器窗口. 可以看见ip值发生变化, session id保持不变

 

【实验三】验证Session内容

(1)              创建文件first.jsp, first.jsp中输入一个值, 将其存入session, post方法在second.jsp中显示session中存在的值和打印值到控制台.

(2)              刷新second.jsp, 显示session中存在的值

(3)              停止掉刚刚在控制台打印信息的node结点server

(4)              刷新second.jsp, 显示session中存在的值

 

【实验四】数据统计, 查看性能

%APACHE_HOME%/bin目录有应用程序ab, 利用ab做数据统计

分别向服务器发送500个请求,每次发送20个,查看最终的数据统计结果

ab -n 500 -c 20 http://192.168.0.428080/web-console/

ab -n 500 -c 20 http://192.168.0.1808080/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 模式运行问题

JBOSSALL模式在windows运行的命令为%JBOSS_HOME%/bin/run.bat –c all, FreeBSD运行的命令为%JBOSS_HOME%/bin/run.sh –c all

 

端口冲突问题

JBossALL模式启动时候, 有时可能与某些应用程序冲突. 例如FirefoxMSN(曾遇到以上2这个应用程序端口冲突). 利用netstat –ano 来查看现在访问网络端口的应用程序的PID. 然后利用任务管理器去查找相应的程序,结束即可.

 

FreeBSD安装问题

FreeBSD下安装JBoss, ALL模式并不能正常运行. 需要调整几个参数, 才能运行.进入%JBOSS_HOME%server/all/deploy目录.

(1)              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">

 

(2)  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"…>

 

(3)  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"…>

 

(4)  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>

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:168636次
    • 积分:2448
    • 等级:
    • 排名:第15672名
    • 原创:68篇
    • 转载:30篇
    • 译文:0篇
    • 评论:46条
    最新评论
    我的相册