您好,登錄后才能下訂單哦!
jboss提供了二種運行模式:standalone(獨立運行模式)、domain(域模式),日常開發中,使用standalone模式足已;但生產部署時,一個app,往往是部署在jboss集群環境中的,如果所有jboss server均采用standalone模式,會給運維帶來極大的工作量,需要每臺jboss server上逐一部署/更新,顯然不適合。
domain模式正是為了解決這一問題,該模式下,所有jbossserver可以劃分成不同的group(注:這里的jbossserver并不一定要對應某臺物理機或虛擬機,一個os上,可以同時run多個jboss server實例,所以本文中的jboss server均指某個運行中的jboss server instance),每個group中可以包含多個jboss server,所有這些jboss server中,可以指定一臺做為域控制器(domaincontroller),俗稱master server,其它jbossserver均為Home Controller(俗稱slaveserver)。
master上可以控制所有jboss server,并監控其運行情況,部署應用時,一個war包,只需要部署到group上,該group中的所有jboss server即會同步自動部署。
操作系統:CentOS 7
JDK版本:1.8
JBoss版本:JBoss EAP 6.2
jboss各版本下載地址:https://teddysun.com/260.html
下載jboss-eap-6.2.0.zip
下載jdk包:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載jdk-8u131-linux-x64.rpm
Centos7無法使用ssh登陸及解決方案
yum instatll net-tools -y ----安裝netstat工具
systemctl start sshd ---啟動sshd服務
netstat -nalt
JBoss運行需要依賴于JDK
安裝JDK
檢查系統是否自帶jdk,如果系統自帶jdk,需要先將它卸載掉.然后安裝我們需要的jdk.
檢查是否安裝jdk命令:
rpm -qa | grep jdk
刪除自帶jdk的命令:
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.el6.x86_64
或者用 yum -y remove 命令刪除:
yum -y remove java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.el6.x86_64
執行完后,檢查是否刪除成功:
[root@localhost vmware-tools-distrib]# rpm-qa | grep jdk
[root@localhost vmware-tools-distrib]# java-version
-bash: java: command not found
將安裝包jdk-8u131-linux-x64上傳至服務器 /home/oldboy/tools目錄下
chmod -R 777/home/oldboy/tools/jdk-8u131-linux-x64.rpm
rpm -ivh/home/oldboy/tools/jdk-8u131-linux-x64.rpm
該命令將jdk默認安裝到了/usr/Java目錄下
mv /usr/java/jdk1.8.0_131 /usr/local/jdk1.8
配置環境變量
vi /etc/profile
在文件最后配置如下變量
JAVA_HOME=/usr/local/jdk1.8
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
然后輸入source /etc/profile命令,使配置文件生效。
出現如下版本信息,則說明一切安裝配置成功。
[root@localhost vmware-tools-distrib]# java-version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build25.131-b11, mixed mode)
JBoss安裝
將JBoss安裝文件(先解壓成目錄)上傳到服務器,目錄:/usr/local/software
mkdir -pv /usr/local/software
不需要安裝,解壓即可使用,和Tomcat一樣,下面將JBoss目錄移動到usr/local 下,該目錄為所有軟件安裝目錄。
mv /usr/local/software/jboss-eap-6.2/usr/local/jboss6.2
vi /etc/profile
增加
JBOSS_HOME=/usr/local/jboss6.2
啟動JBoss服務
啟動之前最好現獲取jboss文件的權限:
chmod -R 777 /usr/local/jboss6.2
cd /usr/local/jboss6.2/bin
輸入命令 ./standalone.sh 以a single server instance的模式啟動Jboss
能看到類似22:37:31,306INFO [org.jboss.as] (Controller BootThread) JBAS015874: JBoss EAP 6.2.0.GA (AS 7.3.0.Final-redhat-14) started in10490ms - Started 129 of 186 services (56 services are passive or on-demand),說明啟動成功。
/usr/local/jboss6.2/standalone/configuration目錄中有***.xml,是用于jboss啟動類型。比如:./standalone.sh--server-config=standalone-full.xml,
而 ./standalone.sh 相當于./standalone.sh --server-config=standalone.xml
cd /usr/local/jboss6.2/bin
輸入命令 ./domain.sh 以allowing control andmanagement of multiple instances的domain模式啟動JBoss
測試:
master: 192.168.1.58;
slave: 192.168.1.181;
配置master(master: 192.168.1.58):
192.168.1.58上添加用戶:
cd /usr/local/jboss6.2/bin
./add-user.sh
創建的用戶名為slave,這樣slave才可以登陸到master。密碼:@we4%7Jt,經過Base64加密后為:QHdlNCU3SnQ=
修改管理接口地址:
vi /usr/local/jboss6.2/domain/configuration/host.xml
<interface name="management">
<inet-address value="${jboss.bind.address.management:192.168.1.58}"/>
</interface>
配置slave(slave: 192.168.1.181)
vi /usr/local/jboss6.2/domain/configuration/host.xml
設置名字:
<host name="slave"xmlns="urn:jboss:domain:1.5">
設置密碼:
secret value中配置的值是master上配置的slave用戶的密碼的base64。
<secret value=" QHdlNCU3SnQ="/>
配置master地址:
<domain-controller>
<remote host="${jboss.domain.master.address:192.168.1.58}"port="${jboss.domain.master.port:9999}"security-realm="ManagementRealm"/>
</domain-controller>
配置本地接口地址:
將127.0.0.1都替換成0.0.0.0或實際的IP地址:
<interfaces>
<interface name="management">
<inet-addressvalue="${jboss.bind.address.management:0.0.0.0}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:0.0.0.0}"/>
</interface>
<interface name="unsecure">
<!-- Used for IIOP sockets in the standard configuration.
To secure JacORB you need tosetup SSL -->
<inet-address value="${jboss.bind.address.unsecure:0.0.0.0}"/>
</interface>
</interfaces>
配置端口:
<management-interfaces>
<native-interface security-realm="ManagementRealm">
<socketinterface="management"port="${jboss.management.native.port:9099}"/>
</native-interface>
</management-interfaces>
這里的9999端口,改成其它不使用的端口(比如:9099),否則slave server上的9999端口,與master server上的管理端口沖突,最后啟動時,會報錯
配置servers:
group必須是master主機(master: 192.168.1.58)上host.xml中配置的group。
<servers>
<server name="server-one"group="main-server-group"/>
<server name="server-two"group="main-server-group">
<!-- server-two avoids port conflicts by incrementing the ports in
the default socket-groupdeclared in the server-group -->
<socket-bindings port-offset="150"/>
</server>
</servers>
啟動
master(master: 192.168.1.58):
cd /usr/local/jboss6.2/bin
./domain.sh
slave(slave: 192.168.1.181):
cd /usr/local/jboss6.2/bin
./domain.sh
局域網訪問管理接口:(用戶名:為slave密碼:@we4%7Jt)
http://192.168.1.58:9990
Deploying an Application in Standalone Mode
將應用程序test.war(是隨便找的測試文件)放到 /usr/local/jboss6.2/standalone/deployments
The standalone/deployments directory in the JBoss Application Server
distribution is the location end users can place their deploymentcontent
(e.g. war, ear, jar, sar files) to have it automatically deployed intothe server
runtime.
cd /usr/local/jboss6.2/bin
./standalone.sh
可以看到JBAS018559: Deployed"test.war" (runtime-name : "test.war")就是說明已經運用了,/usr/local/jboss6.2/standalone/deployments下刪除test.war可以看到JBAS018558: Undeployed"test.war" (runtime-name: "test.war")
Deploying an Application in Domain Mode
登陸 http://192.168.1.58:9990
Manage Deployments
Add
Assign
Gathering Java Virtual Machine Diagnostics(GC日志分析,用于排錯)
standalone模式
vi /usr/local/jboss6.2/bin/standalone.conf
#Enable garbage collection logging
JAVA_OPTS="$JAVA_OPTS -verbose:gc-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:gc.log"
#Create a java heap dump on outofmerryerror
JAVA_OPTS="$JAVA_OPTS-XX:-HeapDumpOnOutOfMemoryError"
/usr/local/jboss6.2/bin/standalone.sh
生成文件/root/gc.log,可以用來查看。
domain模式
vi /usr/local/jboss6.2/domain/configuration/host.xml
<jvms>
<jvm name="default">
<heap size="64m" max-size="256m"/>
<permgen size="256m" max-size="256m"/>
<jvm-options>
<optionvalue="-server"/>
<optionvalue="-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails-Xloggc:gc.log"/>
<optionvalue="-XX:-HeapDumpOnOutOfMemoryError"/>
</jvm-options>
</jvm>
</jvms>
/usr/local/jboss6.2/bin/domain.sh
生成文件/root/gc.log,可以用來查看。
ps -ef |grep java
可以看到修改已經啟用
如何閱讀和理解GC日志
GC日志開頭的“[GC”和“[Full GC”說明了這次垃圾收集的停頓類型,而不是用來區分新生代GC還是老年代GC的。如果有“Full”,說明這次GC是發生了Stop-The-World的,例如下面這段新生代收集器ParNew的日志也會出現“[FullGC”(這一般是因為出現了分配擔保失敗之類的問題,所以才導致STW)。如果是調用System.gc()方法所觸發的收集,那么在這里將顯示“[Full GC (System)”。
[Full GC 283.736: [ParNew:261599K->261599K(261952K), 0.0000288 secs]
接下來的“[DefNew”、“[Tenured”、“[Perm”表示GC發生的區域,這里顯示的區域名稱與使用的GC收集器是密切相關的,例如上面樣例所使用的Serial收集器中的新生代名為“Default New Generation”,所以顯示的是“[DefNew”。如果是ParNew收集器,新生代名稱就會變為“[ParNew”,意為“ParallelNew Generation”。如果采用Parallel Scavenge收集器,那它配套的新生代稱為“PSYoungGen”,老年代和永久代同理,名稱也是由收集器決定的。
后面方括號內部的“3324K->152K(3712K)”含義是“GC前該內存區域已使用容量-> GC后該內存區域已使用容量 (該內存區域總容量)”。而在方括號之外的“3324K->152K(11904K)”表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆總容量)”。
再往后,“0.0025925 secs”表示該內存區域GC所占用的時間,單位是秒。有的收集器會給出更具體的時間數據,如“[Times: user=0.01 sys=0.00, real=0.02 secs]”,這里面的user、sys和real與Linux的time命令所輸出的時間含義一致,分別代表用戶態消耗的CPU時間、內核態消耗的CPU事件和操作從開始到結束所經過的墻鐘時間(Wall Clock Time)。CPU時間與墻鐘時間的區別是,墻鐘時間包括各種非運算的等待耗時,例如等待磁盤I/O、等待線程阻塞,而CPU時間不包括這些耗時,但當系統有多CPU或者多核的話,多線程操作會疊加這些CPU時間,所以讀者看到user或sys時間超過real時間是完全正常的。
GCViewer(圖形化工具)
How and When to Capture a Java Thread Dump
vi ~/.bashrc
# user specific aliases and functions
export PATH=$PATH:/usr/local/jdk1.8/bin
先運行./standalone.sh,才能得到jboss-modules.jar
cd /usr/local/jboss6.2/bin
./standalone.sh
[root@localhost ~]# jps
3013 Jps
2919 jboss-modules.jar
[root@localhost ~]# jstack -l 2919 >jstack.out
[root@localhost ~]# less jstack.out (查看線程狀態)
samurai.jar可實現實時監控TheadDump和GC圖表顯示.(但是需要圖形化界面)
官方網站及說明文檔:http://yusuke.homeip.net/samurai/en/index.html
下載:http://yusuke.homeip.net/samurai/en/samurai.jar
運行: java -jar ./samurai.jar
http://www.eclipse.org/mat/
The Eclipse MemoryAnalyzer is a fast and feature-rich Java heap analyzer that helps you findmemory leaks and reduce memory consumption.
找出某個Java進程中最耗費CPU的Java線程并定位堆棧信息
vi ~/.bashrc
# user specific aliases and functions
export PATH=$PATH:/usr/local/jdk1.8/bin
jstack可以定位到線程堆棧,根據堆棧信息我們可以定位到具體代碼,所以它在JVM性能調優中使用得非常多。下面我們來一個實例找出某個Java進程中最耗費CPU的Java線程并定位堆棧信息,用到的命令有ps、top、printf、jstack、grep。
第一步先找出Java進程ID,服務器上的Java應用名稱為mrf-center:
root@ubuntu:/# ps -ef | grep mrf-center |grep -v grep
root 21711 1 1 14:47 pts/3 00:02:10 java -jar mrf-center.jar
得到進程ID為21711,第二步找出該進程內最耗費CPU的線程,可以使用
1)ps -Lfp pid
2)ps -mp pid -oTHREAD, tid, time
3)top -Hp pid
用第三個,輸出如下:
TIME列就是各個Java線程耗費的CPU時間,CPU時間最長的是線程ID為21742的線程,用
printf "%x\n" 21742
得到21742的十六進制值為54ee,下面會用到。
OK,下一步終于輪到jstack上場了,它用來輸出進程21711的堆棧信息,然后根據線程ID的十六進制值grep,如下:
root@ubuntu:/# jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread"prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait()
可以看到CPU消耗在PollIntervalRetrySchedulerThread這個類的Object.wait(),我找了下我的代碼,定位到下面的代碼:
// Idle wait
getLog().info("Thread [" +getName() + "] is idle waiting...");
schedulerThreadState =PollTaskSchedulerThreadState.IdleWaiting;
long now = System.currentTimeMillis();
long waitTime = now + getIdleWaitTime();
long timeUntilContinue = waitTime - now;
synchronized(sigLock) {
try{
if(!halted.get()) {
sigLock.wait(timeUntilContinue);
}
}
catch (InterruptedException ignore) {
}
}
它是輪詢任務的空閑等待代碼,上面的sigLock.wait(timeUntilContinue)就對應了前面的Object.wait()。
局域網訪問
直接輸入http://xxx.xx.xx.xxx:8080是不能訪問的,如果想讓局域網內的其他機器訪問,需要做如下配置:
關閉服務器的防火墻
systemctl stop firewall
Failed to stop firewall.service: Unitfirewall.service not loaded.
centos從7開始默認用的是firewall,這個是基于iptables的,雖然有iptables的核心,但是iptables的服務是沒安裝的。所以你只要停止firewalld服務即可:sudo systemctl stopfirewalld.service && sudo systemctl disable firewalld.service
必須要修改JBoss配置文件,方法如下:
vi/usr/local/jboss6.2/standalone/configuration/standalone.xml
找到
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
將127.0.0.1修改為JBoss所在機器的IP地址或者修改為0.0.0.0即可,保存退出即可。
訪問測試:
在瀏覽器地址欄中輸入:http://192.168.1.58:8080,出現歡迎界面,證明啟動成功!
以后臺運行方式啟動
直接以./standalone.sh方式開啟JBoss會有個缺點,當命令窗口關閉后,JBoss服務也會down掉。這種方式在遠程服務器操作JBoss時,非常蛋疼。關掉遠程終端窗口,JBoss也會down掉。
所以我們需要讓JBoss開啟后在后臺運行:進入到bin目錄下,輸入nohup ./standalone.sh 命令。這樣服務就會在后臺運行,即使關閉命令窗口,服務依然運行。
查看Jboss啟動日志信息輸入:tail-f nohup.out 即可。
停止服務
以直接啟動方式啟動JBoss,關閉時可以在啟動終端窗口按鍵 CTRL + C,即可完全停止JBoss服務
如果使用后臺運行的方式,關閉服務器就比較麻煩,找了半天才找到關閉Jboss EAP6.2 的方法:
進入到JBoss的bin目錄下,輸入:
[root@adminkp bin]# ./jboss-cli.sh -c :shutdown
{"outcome" =>"success"}
或者暴力解決:kill -9 PID
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。