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的時候應該怎樣判定該用戶已在別的服務器上登錄過了呢?
現在 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列表中去掉。