分布式即時聊天服務器:zkfire
zkfire = zookeeper+openfire(3.8.1)
Openfire 采用Java開發,開源的實時協作(RTC)服務器基于XMPP(Jabber)協議,您可以使用它輕易的構建高效率的即時通信服務器.
根據對xmpp與openfire的理解,我在openfire中相應的地方植入少量的代碼,并把zookeeper包也一并打包到zkfire中。使用zookeeper(http://zookeeper.apache.org/)管理集群中的節點。
客戶登陸集群中的不同服務器進行通信就如登陸同一臺服務器一樣。
openfire自身也有一套集群的實現,使用了oracle 的coherence的中間件,使用時要自己加入相應的jar包與集群插件。
之所以又自己開發了一套集群實現,一個是給集群提供多一些選擇,一個是興趣^_^,讓openfire天然就支持集群
zkfire使用的場景:
zkfire中有zookeeper的服務器監聽與客戶端連接程序,但可以不依賴自身的zookeeper服務,可以在openfire之外另外開啟其他zookeeper服務,此時只需指定
cluster.xml配置文件中zClient節點的連接地址即可。
如果只是zookeeper單機服務,那么所有openfire服務器只需要連到同一個zookeeper服務器就可以完成openfire的集群
如果是zookeeper集群,根據zookeeper的集群特點,集群中節點不應該少于3臺。如果超過一半的zk節點宕機,那么整個集群境將不能正常的工作。
使用方法:
將zkfire.jar包替換lib下的openfire.jar,之所以命名zkfire.jar只是為了易于區分,名字可以隨意取。并將cluster.xml放到bin目錄下。
zkfire基于單openfire的實現,所以如果使用的話建議不要開啟openfire自身的集群功能。
在安裝的openfire目前bin下,放入cluster.xml文件。
示例內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<jive>
<!-- 該節點用于openfire服務器之間通訊。IP為本機IP地址,需其他服務器能訪問到 -->
<notice>10.10.152.180:3004</notice>
<!-- zoo節點用于配置zkfire的zookeeper服務。如果用其他zk服務器,那么這個節點可以去掉。-->
<zoo>
<tickTime>2000</tickTime>
<initLimit>10</initLimit>
<syncLimit>5</syncLimit>
<dataDir>E:/zoo/data</dataDir>
<clientPort>3181</clientPort>
<server name="server.1">10.10.152.180:2888:3888</server>
<server name="server.2">10.10.152.185:2888:3888</server>
<server name="server.3">10.10.152.189:2888:3888</server>
<myid>1</myid>
</zoo>
<!-- 該節點用于連接zk服務器,如果連接zkfire自身的zk服務器,那么該節點可以去掉 -->
<zClient>127.0.0.1:3181</zClient>
</jive>
zoo中的節點server用于配置zookeeper的集群,myid指定本身zookeeper服務器的myid值,server.X 這個數字就是對應myid中的數字,集群中不同zk服務器的myid值不同。
zoo中其他節點的內容皆對應zk配制文件的鍵值內容。這里不再詳述,可以參考 http://rdc.taobao.com/team/jm/archives/665,但dataDir與clientPort是必須配置,用于指定 zookeeper數據文件地址與監聽端口。