JBoss提供了二种运行模式:standalone(独立运行模式)、domain(域模式),日常开发中,使用standalone模式足已; 但生产部署时,一个app,往往是部署在JBoss集群环境中的,如果所有JBoss server均采用standalone模式,会给运维带来极大的工作量,需要每台JBoss server上逐一部署/更新,显然不适合。
domain模式正是为了解决这一问题,该模式下,所有JBoss server可以划分成不同的group(注:这里的JBoss server并不一定要对应某台物理机或虚拟机,一个os上,可以同时run多个JBoss server实例,所以本文中的JBoss server均指某个运行中的JBoss server instance),每个group中可以包含多个JBoss server,所有这些JBoss server中,可以指定一台做为域控制器(domain controller),俗称master server,其它JBoss server均为Home Controller(俗称slave server)。
master上可以控制所有JBoss server,并监控其运行情况,部署应用时,一个war包,只需要部署到group上,该group中的所有JBoss server即会同步自动部署。
1、 下载并配置JDK1.8
1.1 下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件;
由于我的Linux是64位的,因此我下载jdk-8u101-linux-x64.tar.gz文件。
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
如下图所示:
1.2 新建/usr/java文件夹,将jdk-8u101-linux-x64.tar.gz放到该文件夹中,并将工作目录切换到/usr/java目录下。如下图所示:
解压JDK1.8
tar -zxvf jdk-8u101-linux-x64.tar.gz
1.3 配置环境变量:①、使用vim /etc/profile编辑profile文件,如下1图所示:②、在/etc/profile底部加入如下内容,保存退出JAVA_HOME=/usr/java/jdk1.8.0_101
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
如下2图所示:
图1:
图2:
最后使用source /etc/profile让profile文件立即生效
[root@lerry java]# source /etc/profile
1.4 验证jdk是否安装成功
[root@lerry java]# java -version
[root@lerry java]# echo $JAVA_HOME
当看到如下图时说明你的java环境已经配置OK
2、 下载并安装JBoss EAP 6.4
2.1 下载JBoss EAP 6.4
2.2 新建/home/Downloads文件夹,将jboss-eap-6.4.0-installer.jar放到该文件夹中,并将工作目录切换到/home/Downloads目录下。如下图所示:
[root@lerry ~]# cd /home/
[root@lerry home]# mkdir Downloads
[root@lerry home]# cd Downloads/
2.3 安装JBoss EAP
运行安装命令:[root@lerry Downloads]# java -jar jboss-eap-6.4.0-installer.jar
安装过程中设置暗转路径等等其他参数,其中包括jboss的管理员的用户名和密码,用以登录jboss管理界面使用
2.4 创建jboss link
在/root/下创建link,以方便快速进入到jboss路径。
使用命令:ln -s /opt/EAP-6.4.0 /root/jboss
3、 部署Jboss eap Domain Server
修改配置
使用命令进入host.xml配置文件
vim domain/configuration/host.xml将所有127.0.0.1的地址,换成真实IP,在命令模式下输入下面命令,替换ip
:%s/127.0.0.1/192.168.1.81/g
保存退出
修改cluster连接密码
vim domain/configuration/domain.xml
将${jboss.messaging.cluster.password:CHANGE ME!!}
修改为:${jboss.messaging.cluster.password:redhat!@#123}
3.1 修改/etc/profile文件,配置环境变量
vim etc/profile
增加:
EAP_HOME=/opt/EAP-6.4.0
export EAP_HOME
配置生效:source etc/profile
验证:echo $EAP_HOME
3.2 以domain模式启动Domain server
[root@lerry bin]# ./domain.sh
3.3 进入master jboss 控制台,创建group、server
http://192.168.1.81:9990/console/
进入控制台后,可以看到jboss已经默认创建了一些group及server,先把他们全干掉吧(通常,我们会创建自己的group/server)
参考下面这个界面,创建二个组 test-group-1,test-group-2
创建group时,profile建议选择full-ha (以后做jboss集群配置,负载均衡、智能容错时,需要使用full-ha profile)
重要提示:同一个局域网里如果有多个master,如果这些master上的group名称有重复,则只有第一master能启动成功后,后面的master启动时会报错,建议每个master上的group命名时,加上master的IP,比如group+IP地址,这样肯定不会重复!
参考下面的图,在master server上创建4个server
注意:如果一个server已经处于started状态,是无法remove的,可以先到下面的界面,把该server stop掉,就可以Remove
Stop server
创建server
创建server时,有一个Port Offset选项,默认情况下server的端口是8080,Port Offset指端口偏移量,如果按下图配置,Port Offset指定为1,则表示该server创建后,对应的端口为8080+1,即8081端口 (可以用http://192.168.1.81:8081/ 来访问)
4、 部署Jboss eap Slaver
4.1 两台slave java环境安装,和jboss环境安装和master一样,参照上边的安装
4.2 在Slaver Server上配置jboss参数
复制备份domain文件夹:cp -rf domain domain-bak
4.3 修改domain/configuration/host-slave.xml
[root@lerry domain]# vim configuration/host-slave.xml
a)
这里的9999端口,改成其它不使用的端口(比如:9099),否则slave server上的9999端口,与master server上的管理端口冲突,最后启动时,会报错
b)
指定master server的IP(本例为192.168.1.81),这样slave在启动时,才知道去连哪一台master,如下图:
c)
原来的127.0.0.1,改成slave server的真实IP或0.0.0.0,否则slave上的应用,只能在slave本机访问
d)
手动在slave上创建二个server,并加入到test-group-1 和test-group-2中(注:group的值,必须是在master server上创建过的,否则启动时,slave上的server无法正常加入到master相关的group中)
e)
最开头的host节点上,加一个name="xxx"的属性(本文中为slave82),这个name值最终会显示在master server的jboss 控制台中,建议起一个容易识别的名称
4.4 修改/etc/profile文件,配置环境变量
vim etc/profile
增加:
EAP_HOME=/opt/EAP-6.4.0
export EAP_HOME
配置生效:source etc/profile
验证:echo $EAP_HOME
4.5 按照以上步骤在部署一台Slaver Server
5、 安全认证配置
5.1 回到master server上,添加一个名为slave82的管理员帐号,并记住最后生成的<secret value="xxxx" />的字符串(xxx为密码经过base64处理后的内容)
注意:realm选项时直接回车,否则会导致最后认证失败
5.2 回到slave82这台server中,再次编辑host-slave.xml,将<secret value="xxxx" />的内容替换
解释:slave启动时,需要连接注册到master的jboss中,连接过程需要安全认证,这里的secret相当于认证的钥匙,而认证的用户名即为: 正在连接的slave机器上jboss中host-slave.xml中<host name='xxx'>这个节点中的name值,所以需要在master中创建一个名为“slave82”的管理员
6、 mod_cluster-1.2.6 负载均衡器配置
mod_cluster是jboss的一个开源集群模块(基于apache 2.2.x),官网地址为http://mod-cluster.jboss.org/
6.1 下载 mod_cluster-1.2.6
下载地址:http://downloads.jboss.org/mod_cluster//1.2.6.Final/linux-x86_64/mod_cluster-1.2.6.Final-linux2-x64.tar.gz
6.2 安装并配置mod_cluster-1.2.6
[root@lerry Downloads]# tar -zxf mod_cluster-1.2.6.Final-linux2-x64.tar.gz
[root@lerry Downloads]# cp -rp opt/jboss/ /opt/
[root@lerry Downloads]# cd /opt/jboss/httpd/httpd/conf/
[root@lerry conf]# vim httpd.conf
将ServerName修改为本机真实IP
最后的mod_cluster部分,参考下面修改
主要是把127.0.0.1,改成master server对应的真实IP,另外把Deny from all注释掉,把紧贴着的一行改成Allow from all,去掉这些访问上的限制。AdvertiseGroup和AdvertiseBindAddress的配置尤为重要,这里是我们的组播地址默认224.0.1.105:23364.需要改一下,如果我们一个内网环境,多个jboss集群,就会发送冲突,模块能扫描到其他项目的节点这里至关重要
修改完成后保存退出。在启动apache
[root@lerry conf]# cd /opt/jboss/httpd/sbin/
[root@lerry sbin]# ./httpd
顺利的话,浏览http://192.168.1.81:6666/mod_cluster_manager应该能看到类似以下界面
这是很关键的一个界面,用来管理/监控所有节点,如果没成功,请仔细检查前面的步骤是否有误。
6.3 修改master和slave的广播地址
我们配置master和slave选择的是full-ha-sockets模式,我们需要修改这个段落,广播地址有两个,我们都改成不同的网段,231.7.7.7 改为231.7.7.8,224.0.1.105,改为224.0.1.108,端口改成23333默认值23364 我们必须得更改这个,不然影响其他集群
vim /root/jboss/domain/configuration/domain.xml
注意:同一集群环境中的所有节点均需要修改
我们的模块由此配置,不会影响到内网其他集群,如果不这样配置,mod_cluster 默认广播到任何节点,只要安装有jboss 他都会扫描到,多集群部署就会给我们带来困扰
比如这样的报错,就是其他集群尝试连接这个模块,认证失败导致的报错
6.4 以domain模式启动所有jboss master/slave server
启动jboss master server / slave server,完成后,刷新 http://192.168.1.81:6666/mod_cluster_manager,会看到多出了好多节点
如果没有新的节点显示在该界面,检查jboss master server中创建的group,对应的profile是否为full-ha或ha点击相关的链接,还能看到更详细的信息
注意:mod_cluster貌似最多只能支持6个node的负载均衡,mod_cluster还有其它一些限制,详情可参考http://docs.jboss.org/mod_cluster/1.2.0/html_single/#d0e85
7、 负载均衡、容错验证
在test-group-1和test-group-2中部署了一个名为Test的应用做验证。
现在可以直接用http://192.168.1.81/Test/来访问了,apache会智能转发到JBoss节点中的某一个,如果访问正常,说明负载均衡已经生效。继续把其它server停掉几台,再继续访问http://192.168.1.81/Test/,如果仍然正常,说明某几个node损坏,并不影响正常使用,即容错成功。所有server全shutdown后,http://192.168.1.81/Test/ 将无法访问。
最后的架构如下:
8、 JBoss EAP 6.3集群-Session 复制(Replication)
java web application中,难免会用到session,集群环境中apache会将http请求智能转发到其中某台jboss server。假设有二个jboss server:Server A,Server B,Session值在Server A上。用户在访问某一个依赖session的页面时,如果第一次访问到Server A,能正常取到Session值,刷新一下,如果这时转发到Server B,Session值取不到,问题就来了。
解决的办法简单到让人不敢相信,在app的web.xml中加一行 <distributable/> 即可(前提:jboss cluster是使用mod_cluster实现的),有了这个节点后,向某台server写入session时,session会自动复制到其它server node。
9、 将JBoss EAP 和mod_cluster 注册服务设置开机自启
创建jboss用户
[root@lerry etc]# useradd jboss
9.1 在master server的/root/bin目录下创建start-master-server.sh
vim /root/bin/start-master-server.sh
内容:
rm -rf /root/jboss-nohup.sh
nohup $EAP_HOME/bin/domain.sh >/root/jboss-nohup.out 2>&1 &
保存后,为该文件设置运行权限
chmod a+x /root/bin/start-master-server.sh
9.2 在slave server的/root/bin目录下创建start-host-server.sh
rm -rf /root/jboss-nohup.sh
nohup $EAP_HOME/bin/domain.sh --host-config=host-slave.xml >/root/jboss-nohup.out 2>&1 &
保存后,为该文件设置运行权限
chmod a+x /root/bin/start-host-server.sh
9.3 设置开机自启
连接jboss-as- domain.sh到/etc/init.d中
ln -s -T /root/jboss/bin/init.d/jboss-as-domain.sh /etc/init.d/jboss-as
创建在/etc/目录下创建一个jboss-as目录
[root@lerry etc]# mkdir jboss-as
给jboss-as文件夹赋宿主和宿组
[root@lerry etc]# chown jboss:jboss jboss-as/
连接jboss-as.conf到/etc/jboss-as 里
ln -s -T /root/jboss/bin/init.d/jboss-as.conf /etc/jboss-as/jboss-as.conf
修改jboss-as.conf
激活服务,设置自启动
[root@lerry jboss-as]# chkconfig --add jboss-as
[root@lerry jboss-as]# chkconfig jboss-as
修改jboss-as-domain.sh里面的路径, 使他们指向安装的目录