做者:chszs,版權全部,未經贊成,不得轉載。博主主頁:http://blog.csdn.net/chszs數據庫
Openfire Hazelcast插件提供了在一個集羣上運行多個冗餘Openfire服務器的支持。經過把Openfire運行爲一個集羣,能夠把終端的鏈接分配到多 臺Openfire服務器上,同時還提供了服務器的故障轉移。Hazelcast個插件是Openfire原集羣插件的替代,它使用了開源的 Hazelcast數據分佈框架來代替昂貴的專有第三方產品。目前Hazelcast版本是3.5.1。緩存
Hazelcast的主頁: http://www.hazelcast.org/安全
XMPP協議的設計與郵箱類似,每一個Openfire的安裝支持單個的XMPP域,且服務器到服務器(Server to Server,S2S)協議在XMPP規範中描述爲把多個XMPP域鏈接到一塊兒,也就是聯邦(Federation)。聯邦表明了XMPP橫向擴展的有效 方式,由於它容許一個XMPP用戶可以安全地與其餘聯邦域的任意用戶進行通訊。這些聯邦能夠是公共的或者是私有的。聯邦域能夠在互聯網上交換XMPP節 (Stanzas),甚至可使用基於DNS的服務查找或是地址解析進行發現。服務器
與之相反,集羣是單個XMPP域進行縱向擴展的技術,集羣內的誠意共享相同的配置。集羣中的每個成員都容許任意用戶在域內進行鏈接、受權認證、交 換節。全部集羣的服務器都共享單個的數據庫,所以須要部署在同一個局域網內,以保持網絡通訊的低延遲。集羣的部署適合提供運行時的冗餘,並且能支持更大的 用戶數量和更多的鏈接數。網絡
對於比較大的Openfire部署,結合聯邦和集羣兩種技術能提供比較佳的效果。單個的XMPP域可以支持數萬甚至數十萬的用戶,再結合聯邦部署,就能達到支持百萬級以上的用戶規模。負載均衡
要建立Openfire集羣,至少要有2臺Openfire服務器,每一臺都必須安裝Hazelcast插件。要按照Hazelcast,只需簡單的把hazelcast.jar包放入Openfire的plugins子目錄。還能夠在管理控制檯的插件頁直接安裝此插件。框架
要注意,集羣內的每一臺Openfire服務器都必須配置爲鏈接同一個外部數據庫。性能
默認狀況下,Openfire在啓動並初始化進程期間,服務器節點會彼此互相發現(經過彼此互相交換UDP廣播數據包)。要注意一點,若是局域網不支持廣播通訊,那麼可使用一些初始化的配置選項。spa
每一個Openfire服務器部署了Hazelcast插件後,在管理控制檯的集羣頁面上使用單選按鈕激活/啓用集羣。只須要啓用一次集羣,此變動會自動通知到集羣的其它節點。在刷新集羣頁面後就能看到全部的服務器已經成功加入集羣了。.net
注意,Hazelcast和更早的集羣插件(如clustering.jar或enterprise.jar)是互斥的。也就是說,使用了Hazelcast插件,就不能使用早期的集羣插件。
在集羣運行後,你就須要某種形式的負載均衡來把用戶的訪問分配到各個Openfire節點上。這裏有多個商業解決方案和開源解決方案。若是你使用 HTTP/BOSH Openfire鏈接器來鏈接Openfire的話,那麼可使用Apache HTTP Server來作負載均衡器(使用mod_proxy_balancer模塊)。一些流行的選項如F5 LTM(商業解決方案)和HAProxy(開源解決方案)均可以。
F5 LTM: http://www.f5.com/products/big-ip/big-ip-local-traffic-manager/overview/
HAProxy: http://haproxy.1wt.eu/
還有一個簡單的Round-robin DNS配置能夠幫助分配XMPP鏈接到集羣中的uogeOpenfire服務器節點。儘管流行的輕量級、低成本的方法提供了基本的可擴展性,但要注意這些方法是既沒有考慮到足夠知足實際的負載均衡,又沒有提供高可用性的能力。
升級Hazelcast插件須要額外的一些步驟,並且集羣中的每一個節點都須要安裝同一個插件版本,以免各類錯誤和數據同步的問題。
這種升級方法很簡潔,但會發生短暫的服務中斷。
1)關閉集羣中全部的Openfire服務
2)對集羣中的第一臺Openfire服務器,執行如下步驟:
a. 移除plugins目錄下現有的Hazelcast插件hazelcast.jar;
b. 移除plugins目錄下現有的hazelcast子目錄;
c. 複製最新的hazelcast.jar文件到plugins目錄;
d. 重啓Openfire服務器,實現插件的解壓和安裝。
3)對剩餘的每個Openfire服務器重複以上工做。
這種方法在升級期間也不影響Openfire的服務。
1. 關閉集羣中的Openfire服務器,只保留一臺還運行。
2. 登陸這臺Openfire服務器的管理控制檯,在插件頁面移除現有的Hazelcast插件。
3. 上傳最新的Hazelcast插件,並完成安裝。
4. 使用「離線」步驟升級並啓動剩餘的服務器。
注意:若是你只能訪問Openfire的控制檯,那麼可使用本方法。可是要注意,在升級過程當中,用戶可能彼此沒法互相通訊。
1)在Openfire管理控制檯的集羣頁面,讓集羣停用(Disable),這會對集羣的全部成員都關閉集羣。
2)對於每一臺Openfire,更新其Hazelcast插件。
3)當全部Openfire服務器的Hazelcast插件都更新完畢後,在管理控制檯的集羣頁面啓用(Enable),它會激活集羣中的全部Openfire成員。
Hazelcast有數個配置選項可做爲Openfire的系統屬性。
一、hazelcast.startup.delay.seconds (5)
運行Hazelcast插件的等待時間(秒)。這可讓Openfire在初始化集羣的緩存時部署其餘插件。
二、hazelcast.startup.retry.count (1)
集羣首次啓動失敗後重復啓動的次數。
三、hazelcast.startup.retry.seconds (10)
相鄰兩次啓動的間隔時間。(秒)
四、hazelcast.max.execution.seconds (30)
在集羣成員間執行同步任務時的最大等待時間。
五、hazelcast.config.xml.filename (hazelcast-cache-config.xml)
Hazelcast插件配置文件的名字,便於安裝自定義的緩存配置文件。
六、hazelcast.config.xml.directory ({OPENFIRE_HOME}/conf)
能夠添加到插件類路徑下的目錄,便於加載自定義的Hazelcast配置文件。
七、hazelcast.config.jmx.enabled (false)
爲Hazelcast集羣啓用JMX功能。
Hazelcast插件使用了XML配置創建器來初始化集羣。默認狀況下,集羣的成員間會嘗試經過廣播下面的位置實現彼此互相發現。
IP地址: 224.2.2.3
端口:54327
Hazelcast對於延遲是很是敏感的,它或許會致使一個長期運行的GC週期,尤爲是在使用默認的JVM配置時。在大多數狀況下,優先激活並行的垃圾收集器(CMS)或者是使用新的G1垃圾收集器來使得阻塞最小化。
另外,Openfire集羣的運行特色在很大程度上取決於客戶端的數量、鏈接的類型、以及部署的XMPP服務類型。可是要注意,許多在堆(Heap)上分配的對象是短活動期的,增長年輕代的空間或許會對性能產生積極的影響。
好比,下面提供一個適合3個節點的服務器集羣(4核CPU),支持大約5萬個活動用戶:
OPENFIRE_OPTS="-Xmx4G -Xms4G -XX:NewRatio=1 -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=1 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintPromotionFailure"