對即時聊天了解的可能會聽說過openfire,openfire是基于JAVA語言的開源項目,主要是利用XMPP協定進行通信,今天主要探讨下其叢集技術。
openfire采用了一個半開源的叢集項目Hazelcast,像Mysql一樣,有個功能不完全的開源版,而其功能完全的商業版則是要收費的。
通過對Hazelcast的使用和源碼解讀,我總結出了一些關于叢集方面的個人思考。對于叢集中各結點間無關聯的可能隻要通過增加機器就可以了,
但是對于即時通訊來說卻不行,因為要共享使用者的Session,是以就會有叢集的資料共享問題,如何處理才能讓其可以最大規模的拓展成為我們
重要難題,而今天的Hazelcast隻是解決中小規模(官方說最大數百台)叢集的一種技術方案,對于大規模的叢集就重新選擇了。
目前叢集的網絡架構設計可以分為中心管理型和對等型,所謂的中心管理型就是有負責管理叢集中各結點的,比如Zookepper就可以充當這個角色,
而中心結點則不負責處理任何業務,隻做管理中繼資料,使用過MongoDB的人應該能想到起的config程序其實也是這個角色,而所謂的對等型的網絡,
其實裡面也有個充當中心管理角色的結點,隻不過它還要處理業務邏輯。Hazelcast就是一個看似對等的一個部署方案,它的中心角色對使用的程式
員來說是透明的,接下來我先說下它叢集的建立過程,通過我畫的這個流程圖應該能了解一些。

也就是說它内部有個選舉算法來決定哪個結點作為管理結點,在Hazelcast裡又叫oldest結點,oldest結點負責接收加入請求并處理聯合(Join)。
下圖是我畫的一個幫助了解叢集聯合過程的草圖:
叢集建立完後會有一人容器存放所有的叢集結點資訊,主要包括是否是本地local,位址address(IP,Port),UUID唯一編号等等。
說到這裡我要說個插曲,對于這個存放叢集結點資訊的容器,使用了可重入鎖技術(ReentrantLock try前lock,finally裡unlock)。
當然,除了用于管理叢集中的結點的容器外,Hazelcast還提供了幾個叢集的資料共享容器,像Queue和Map,那可能會有人問這
些容器裡的資料是怎麼存的呢?是每個結點都放所有的,還是每個結點都隻存各自的資料呢?如果每個結點都存放所有的資料,那
麼當叢集中結點數量越來越多後,各結點資料的同步還能很好進行麼?而且備援資料也會非常多。如果每台隻存放各自的,如果這台
機器當機了,共享的資料怎麼辦呢?帶着這些疑問我接着看Hazelcast的源碼,發現原來它是第三種相法,就是先把所有資料彙總,
由它來決定哪個結點存放哪些資料,一般每份資料會有兩個備份,存放在不同的三台機器裡,而每個結點會有一個Nearcache,充當
本地緩存。這個對使用它的程式員來說也是透明的,這樣問題就集中在當結點變多時如何同步這些資料上了,其實這也是Hazelcast和
其他一些叢集技術的難題,既要實時又要性能,這個難題大家可以一起思考,期待能有更多更好的大規模叢集技術出現。
另外Hazelcast還有個監控叢集的背景,原理也很簡單,感興趣的用一用就明的了,不過它是商業版裡的部分,要想用的也很簡單,反編譯
它的class文,裡面有個生成licence的類,它沒有聯網校驗功能,隻要licence就可以了,不過還是要尊重版權的。