說起JBoss集群好像很高深的樣子,其實一點也不恐怖,建立一個集群很簡單,難的是怎么針對具體的應用優化服務器和實現負載均衡(學習中^o^)。本文將帶領大家在JBoss的default目錄下建立一個簡單的Web方面的JBoss集群。
搭建環境
jboss-4.0.4.GA
apache_2.0.59 //我使用的是apache_2.0.59-win32-x86-no_ssl,其實無所謂的
mod_jk-apache-2.0.59.so //Apache請求分發的模塊,官網上可以找到
首先安裝JBoss,我用的是zip格式的,直接解壓縮就可以了,在兩臺電腦里分別安裝。
接下來在其中一臺電腦上(這里是192.168.0.2)安裝Apache(其實應該再找一臺電腦來安裝的),很簡單,略過^o^(偶是不是很懶^o^)
配置JBoss
假設兩臺電腦的IP分別為192.168.0.2和192.168.0.3。我們這里使用JBoss的default目錄。
將如下文件從%JBoss_Home%\server\all\lib里面拷到%JBoss_Home%\server\default\lib目錄下:
jbossha.jar(加載org.jboss.ha.framework.server.ClusterPartition)
jgroups.jar(JBoss集群底層通信協議)
jboss-cache.jar(加載org.jboss.cache.aop.TreeCacheAop)
還要從%JBoss_Home%\server\all\deploy里把cluster-service.xml和tc5-cluster.sar拷貝到%JBoss_Home%\server\default\deploy里面。
編輯192.168.0.2的%JBoss_Home%\server\default\deploy\jbossweb-tomcat55.sar\server.xml
修改下面代碼:


修改為:


其中 jvmRoute是用來讓apache識別的節點名稱,一個節點一個名稱,注意不要有重復的(可以結合IP設置)。
同理編輯192.168.0.3的%JBoss_Home%\server\default\deploy\jbossweb-tomcat55.sar\server.xml
注意把jvmRoute設置為node2,可以設置成別的只要和192.168.0.2的不重復就行,但是要和Apache的workers.properties(稍后介紹)下的配置一致。
在%JBoss_Home%\server\default\deploy\jbossweb-tomcat55.sar\ROOT.war\目錄下添加一個新文件夾\test,并在里面添加如下3個jsp文件:
index.jsp
1
<%
@ page contentType="text/html;charset=ISO8859_1" %>
2
3
<html>
4
<head>
5
<title>Test</title>
6
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
7
</head>
8
9
<body onload="document.form.name.focus()">
10
<br><br><br>
11
<center>
12
The host is : <%=java.net.InetAddress.getLocalHost().toString()%><br>
13
Your session id is : <%=session.getId()%><br>
14
Your session detail is : <%=session.toString()%><br>
15
Your session context is : <%=session.getSessionContext()%><br><br>
16
Please input your name:<br>
17
<form action="test_action.jsp" method="POST" name="form">
18
<input type="input" name="name"/>
19
<input type="submit" value="提交">
20
</form>
21
</center>
22
</body>
23
</html>
24
25



2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

test_action.jsp
1
<%
@ page contentType="text/html;charset=ISO8859_1" %>
2
3
<html>
4
<head>
5
<title>Test Action</title>
6
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
7
</head>
8
<%
9
String name = request.getParameter("name");
10
session.setAttribute("name",name);
11
String host = java.net.InetAddress.getLocalHost().toString();
12
%>
13
<body>
14
<br>
15
<br>
16
<center>
17
The host is : <%=host%><br><br>
18
Your session id is : <%=session.getId()%><br>
19
Your session detail is : <%=session.toString()%><br>
20
Your session context is : <%=session.getSessionContext()%><br><br>
21
Your name is : <%=name%><br>
22
This name is set into the session.<br>
23
Please click <a href="session.jsp">here</a> to check the session valid or not.
24
</center>
25
</body>
26
</html>
27
28



2

3

4

5

6

7

8



9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

session.jsp
1
<%
@ page contentType="text/html;charset=ISO8859_1" %>
2
3
<html>
4
<head>
5
<title>Test Action</title>
6
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
7
</head>
8
<%
9
String name = null;
10
if(session.getAttribute("name")!=null)
11
name = (String)session.getAttribute("name");
12
String host = java.net.InetAddress.getLocalHost().toString();
13
%>
14
<body>
15
<br>
16
<br>
17
<center>
18
The host is : <%=host%><br>
19
Your session id is : <%=session.getId()%><br>
20
Your session detail is : <%=session.toString()%><br>
21
Your session context is : <%=session.getSessionContext()%><br><br>
22
<%
23
if(name!=null){
24
out.print("Your name is "+name+"<br>");
25
out.print("The session is valid.");
26
}
27
else{
28
out.print("The session is invalid!!!");
29
}
30
%>
31
<a href="index.jsp">Return!</a>
32
</center>
33
</body>
34
<%
35
if(session.getAttribute("name")!=null)
36
session.invalidate();
37
%>
38
</html>
39
40



2

3

4

5

6

7

8



9

10

11

12

13

14

15

16

17

18

19

20

21

22



23

24

25

26

27

28

29

30

31

32

33

34



35

36

37

38

39

40

編輯%JBoss_Home%\server\default\deploy\jbossweb-tomcat55.sar\ROOT.war\WEB-INF\web.xml在<web-app>節點下增加如下代碼:
1
<distributable/>
完成后web.xml代碼如下:
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
3
<!DOCTYPE web-app
4
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
5
"http://java.sun.com/dtd/web-app_2_3.dtd">
6
7
<web-app>
8
<distributable/>
9
<display-name>Welcome to JBoss</display-name>
10
<description>
11
Welcome to JBoss
12
</description>
13
<servlet>
14
<servlet-name>Status Servlet</servlet-name>
15
<servlet-class>org.jboss.web.tomcat.tc5.StatusServlet</servlet-class>
16
</servlet>
17
<servlet-mapping>
18
<servlet-name>Status Servlet</servlet-name>
19
<url-pattern>/status</url-pattern>
20
</servlet-mapping>
21
</web-app>
22
看到第8行了嗎?^o^
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

到這里JBoss就配置完成了^o^
配置Apache
JBoss的Web集群使用apache的mod_jk,瀏覽器請求apache服務器,apache服務器根據workers.properties中的配置進行request分發,apache服務器和Jboss中的Tomcat可以用ajp1.3進行通信的,request通過ajp1.3協議的包裝被發送到Jboss,Jboss執行后返回結果。
將下載到的mod_jk-apache-2.0.59.so保存到%Apache%\modules\目錄下,并去掉版本號重命名為“mod_jk.so”,如果不改也可以在mod-jk.conf文件(稍后介紹)里修改配置。
在%Apache%\conf\目錄下新建mod-jk.conf,并將如下代碼添加進去:
1
# Load mod_jk module
2
# Specify the filename of the mod_jk lib
3
LoadModule jk_module modules/mod_jk.so
4
# Where to find workers.properties
5
JkWorkersFile conf/workers.properties
6
# Where to put jk logs
7
JkLogFile logs/mod_jk.log
8
# Set the jk log level [debug/error/info]
9
JkLogLevel debug
10
# Select the log format
11
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
12
# JkOptions indicates to send SSK KEY SIZE
13
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
14
# JkRequestLogFormat
15
JkRequestLogFormat "%w %V %T"
16
# Mount your applications
17
#JkMount /application/* loadbalancer
18
JkMount /* loadbalancer
19
# You can use external file for mount points.
20
# It will be checked for updates each 60 seconds.
21
# The format of the file is: /url=worker
22
# /examples/*=loadbalancer
23
JkMountFile conf/uriworkermap.properties
24
# Add shared memory.
25
# This directive is present with 1.2.10 and
26
# later versions of mod_jk, and is needed for
27
# for load balancing to work properly
28
JkShmFile logs/jk.shm
29
# Add jkstatus for managing runtime data
30
<Location /jkstatus/>
31
JkMount status
32
Order deny,allow
33
Deny from all
34
Allow from 127.0.0.1
35
</Location>
上述代碼的第3行就是配置mod_jk.so模塊的路徑。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

編輯%Apache%\conf\httpd.conf在最后一行添加如下代碼:
1
Include conf/mod-jk.conf

在 %Apache%\conf\目錄下添加workers.properties文件,該文件就是配置Apache所要將request轉發到的JBoss的路徑信息,代碼如下:
1
# 定義request所要轉發到的節點
2
worker.list=loadbalancer,status
3
# 定義節點 Node1
4
worker.node1.port=8009
5
worker.node1.host=192.168.0.2
6
worker.node1.type=ajp13
7
worker.node1.lbfactor=1
8
worker.node1.cachesize=10
9
# 定義節點 Node2
10
worker.node2.port=8009
11
worker.node2.host=192.168.0.3
12
worker.node2.type=ajp13
13
worker.node2.lbfactor=1
14
worker.node2.cachesize=10
15
# 負載配置
16
worker.loadbalancer.type=lb
17
worker.loadbalancer.balance_workers=node1,node2
18
worker.loadbalancer.sticky_session=0
19
worker.status.type=status

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

上述代碼中:
port是配置JBoss AJP所監聽的端口號,可以在%JBoss_Home%\server\default\deploy\jbossweb-tomcat55.sar\server.xml 看到,如下
1
<!-- A AJP 1.3 Connector on port 8009 -->
2
<Connector port="8009" address="${jboss.bind.address}"
3
emptySessionPath="true" enableLookups="false"
4
redirectPort="8443" protocol="AJP/1.3"/>
host定義JBoss所在機器的IP地址
2

3

4

lbfactor定義該節點的權重,數字越大分發到該節點的request越多
cachesize是servlet線程池的大小(對session復制有影響)
到這里所有的配置就全部完成啦^o^
啟動192.168.0.2上的apache和兩臺機器上的JBoss。
打開瀏覽器,輸入網址訪問apache:http://192.168.0.2/test/index.jsp,回車!看到了吧?
頁面上有JBoss所在機器的IP地址,刷新頁面還能看到IP在變化,說明apache將request分發到了不同的JBoss上,在輸入框中輸入隨便一個字符串并提交還能測試JBoss 的session復制情況。
^o^