一種 Web 應用程序級別的 Cluster 實現技術(zt)
發表于:2007-05-25來源:作者:點擊數:
標簽:
Bylanf,出處:http://www.javaresearch.org/article/showarticle.jsp?column=2nbsp;dengkane轉載自 Java 研究組織 Cluster技術在很多重要應用中都很關鍵,利用Cluster可以保證系統的 高可用性。但往往Cluster在很多人眼里都是高不可攀的,認為這是非常 高端
By lanf, 出處:http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=13315
作者: dengkane 轉載自
Java研究組織
Cluster 技術在很多重要應用中都很關鍵,利用 Cluster 可以保證系統的
高可用性。但往往 Cluster 在很多人眼里都是高不可攀的,認為這是非常
高端的技術。其實不然,你也可以嘗試在你的應用內部實現一種相對比較
簡單的 Cluster,這種方式對很多中小型的 Web 應用已經足夠了。
這種應用級別的 Cluster 技術一個獨特的優勢就是你可以不依賴于任何
應用程序服務器,象
Tomcat,
WebSphere,
WebLogic 等,完全是是自己
應用內部的實現。這樣可以實現在混合環境下的 Cluster,比如我們可以
利用一個
Windows 2000 下跑的 Tomcat 和 一個在
Linux 下跑的 WebSphere
組成一個 Cluster。
我們要實現的 Cluster 功能如下:
1.有三臺服務器,一臺做 Balancer,另外兩臺做 Application Server;
2.Balancer 可以根據兩臺 Application Server 的負載情況來分配用戶請求;
3.在某臺 Application Server down 掉后,Balancer 可以馬上知道,并在以后
不再向這個 Application Server 轉發用戶請求;
4.在啟動新的 Application Server 后,Balancer 也可以馬上知道,并在以后
會向該 Application Server 轉發用戶請求;
具體實現方法如下:
首先我們要保證 session 信息能在幾臺 Application Server 間傳遞,你的
Web 應用一般都需要用戶登錄,并保留登錄信息在 session 里。如果用戶是
在一臺 Application Server 上登錄的,那再訪問另外一臺 Application Server
的時候應該怎樣判斷該用戶已在別的服務器上登錄過了呢?
我們可以用 Cookie 解決這個問題,但 Cookie 有一個限制,就是 domain,即
你在一臺服務器上設置了一個 Cookie 后,只有這臺服務器才能訪問到這個 Cookie,
其他服務器根本訪問不到。我們必須想個辦法讓其他服務器也能訪問到,這是我們
這個 Cluster 實現中的關鍵點之一。
我們可以這樣解決,在一臺 App Server 登錄后,App Server 先設置一個 Cookie,
然后再發給客戶端一個象下面這樣的 JSP
<html>
<head>
</head>
<body>
<form action="http://balancer_setcookie_jsp_url" method="POST" name="frmSetCookie">
<input type="hidden" name="cookieValue" value="<%=cookieValue%>">
<input type="hidden" name="redirectURL" value="<%=redirectURL%>">
</form>
<script lnguage="JavaScript">
document.frmSetCookie.submit();
</script>
</body>
</html>
上面這段程序會立即自動提交個 balancer_setcookie_jsp_url 這個在 Balancer 上的
程序,這個程序是這樣處理的:
<%
String redirectURL = request.getParameter("redirectURL");
String cookieValue = null;
cookieValue = request.getParameter("cookieValue");
if (cookieValue != null)
{
Cookie c = new Cookie("itman",cookieValue);
c.setPath("/");
response.addCookie(c);
%>
<html>
<head>
</head>
<body>
<script language="JavaScript">
document.location.href = "<%=redirectURL%>";
</script>
</body>
</html>
<%
}
else
{
if (redirectURL != null)
{
response.sendRedirect(redirectURL);
}
else
{
//error handling
}
}
%>
這個 Balancer 上的程序先取到 App Server 傳來的 cookieValue 和 redirectURL
這兩個參數,然后設一個 Cookie,然后再轉回到 redirectURL 所設定的 URL 去,
這樣就可以保證 Balancer 也能訪問到這個 Cookie 值了。
現在 Balancer 可以取到 App Server 所設的 Cookie 了,下次客戶訪問過來的
時候就先取到 Cookie 值,然后選擇一個負載最少的 App Server 把請求轉發過去。
轉發過去的時候也是采用上面 App Server 為 Balancer 設 Cookie 的方法,
Balancer 給要轉的 App Server 設一個 Cookie,這個 App Server 就可以判斷
出該用戶是否已登錄了。
現在我們已經解決了不同的 App Server 傳遞登錄信息的問題,下面需要處理的是
Balancer 和 App Server 之間的信息交換問題。
每個 App Server 在運行時都需要定時給 Balancer 傳遞一個 heart-beat,Balancer
上會有個后臺線程在實時檢測,如果發現那個 App Server 的 heart-beat 已經超時
就去掉它,在以后不再轉用戶請求過來。
具體實現方式是這樣的:
Balancer 上啟動一個 R
MI Service thread,作為 App Server 注冊 heart-beat
信息用,App Server 也會起來一個線程,專門是每隔指定的時間就訪問 Balancer
上的 RMI Service 來注冊自己。Balancer 會維護一個可用 App Server 的列表,
并記錄轉發用戶請求的次數,這樣就可以在下次用戶請求過來的時候選擇出負載
最低的 App Server 并把請求轉過去。
在新起來一臺 App Server 后,會立即向 Balancer 注冊,這樣 Balancer 就會加入
到 App Server 列表中。
在一臺 App Server 當掉后,Balancer 收不到它的 heart-beat 就會把它從 App Server
列表中去掉。
這種 Cluster 實現方式是很容易理解的,也很有效,可以有效保證應用的高可用性。
xieweihua 回復于:2004-07-19 11:07:07
|
以前聽過這些東東,都沒有具體的實現方法,今天終于有了,我用什么來謝你呢,實在是謝謝。
|
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|