搭建基于standalone模式的JBoss EAP集群
一、概述
对于JBoss EAP的初学者来说,经常分不清集群(clustering)与域(domain)的概念,认为二者相似或者一个是另一个的子集。实际上二者虽然都是由多个服务器节点组成,都其实有着很大的区别。简而言之,集群的作用是将内部多个服务器整体上当作一个对外开放,而域则是为了在中心节点上管理作用相同的多个节点。
互联网上的很多资料,都是基于domain模式搭建的JBoss EAP集群。这可能加深了一部分人的误区,认为JBoss EAP集群必须基于domain模式,但实际上基于standalone模式也一样可以搭建集群,差别在于:在每个节点都需进行应用系统的部署,这在节点个数较多或应用需频繁更新时显得尤为麻烦。
二、准备工作
以下步骤都比较简单,详细过程省略:
- 两台虚拟机,均为CentOS 6.4 64bit,因为是克隆而来,机器名都是centos;
- 修改虚拟机的IP,分别为192.168.64.147和192.168.64.148。
- 安装反向代理服务器,这里选择的是nginx,版本7,为简单起见只在147上安装;
- 安装JDK 8(及以上版本),两台服务器均需安装;
- 安装JBoss EAP,7.0或7.1版均可,两台服务器均需安装,假设安装目录为/root/EAP-7.1.0;
- 部署应用程序,这里选择以前用到的cluster-demo.war作为测试应用,拷贝到/root/EAP7/standalone/deployment目录。
三、配置
3.1 设置环境变量
在两台服务器,修改/etc/profile,在最后增加以下设置:
export JAVA_HOME=/usr/lib/jdk1.8.0_91 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH export JBOSS_HOME=/root/EAP-7.1.0
保存后执行source /etc/profile使其立即生效。
3.2 配置nginx
在147上,修改/etc/nginx/nginx.conf,主要是upstream块和server块,如:
user nobody; worker_processes 1; error_log /var/log/nginx/error.log warn; #pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; gzip on; upstream test { server 192.168.64.147:8080; server 192.168.64.148:8080; } server { listen 8088; server_name localhost; location / { root html; index index.html index.htm; proxy_pass http://test; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 100m; } location ~ ^/(WEB-INF)/ { deny all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #include /etc/nginx/conf.d/*.conf; }
之后,nginx将在8088端口监听,并将外部请求转发到http://192.168.64.147:8080和http://192.168.64.147:8080,即将来的两个Jboss Server实例。
3.3 配置JBoss EAP
standalone模式下的集群,默认使用的配置文件standalone.xml已经不支持,需改用standalone-ha或standalone-full-ha.xml,这里选择的是standalone-full-ha.xml。在两台服务器均修改该文件,将其中interfaces部分中的127.0.0.1改为服务器的实际IP,比如147上为:
... <interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:192.168.64.147}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:192.168.64.147}"/> </interface> <interface name="private"> <inet-address value="${jboss.bind.address.private:192.168.64.147}"/> </interface> <interface name="unsecure"> <inet-address value="${jboss.bind.address.unsecure:192.168.64.147}"/> </interface> </interfaces> ...
3.4 修改测试应用的index.jsp
正式环境中不需要(也不建议)本步骤,但由于测试时需验证集群具有负载均衡和session复制的功能,而两台虚拟机为克隆而来具有相同的hostname,因此增加了本步骤。
可直接打开cluster-demo.war,修改根目录下的index.jsp,将title或body中的JBoss EAP分别改为JbossEap1、JBossEap2以示区分。
四、测试过程
4.1 在147上启动nginx服务
[root@centos bin]# service nginx start
4.2 在两台服务器启动Jboss
注意不能按默认的standalone.xml启动,必须指定配置文件:
[root@centos bin]# ./standalone.sh -c standalone-full-ha.xml
4.3 用浏览器进行测试
打开浏览器,访问http://192.168.64.147:8088/cluster-demo,注意IP和端口与nginx所在服务器及监听端口一致。
页面显示,147和148已经组建为集群。
多刷新几次,会发现首行会不停切换为JBossEap1和JBossEap2,而sessionID及创建时间保持不变,表明负载均衡和session共享已经实现,这与基于domain模式的集群是等效的。
停止其中一个JBoss EAP实例,再刷新页面,会发现页面固定指向另一个JBoss EAP实例;再恢复那个JBoss EAP实例,页面刷新也恢复到刚才的来回切换方式;若再停掉另一个JBoss EAP实例,页面指向仍运行的实例。但无论如何,sessionID及创建时间都是固定不变的。这表明集群的故障转移也已实现,与基于domain模式的集群等效。
五、总结
以上测试说明,基于standalone模式的集群与基于domain模式的集群,在故障转移、负载均衡和session共享这三个最基本方面是等效的。
PS:反向代理服务器可在多个服务上部署,Linux平台上还可利用keepalived或heartbeat服务将nginx组成主备式的集群,以进一步提升整体的高可用性。