| 導購 | 订阅 | 在线投稿
分享
 
 
 

Web應用程序級別的Cluster實現技術

來源:互聯網  2008-05-19 04:14:51  評論

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 上啓動一個 RMI 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 實現方式是很容易理解的,也很有效,可以有效保證應用的高可用性。

  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 上啓動一個 RMI 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 實現方式是很容易理解的,也很有效,可以有效保證應用的高可用性。      
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有