2016-11-18 77 views
0

我建立了一個分佈式系統,其中不同的節點可以是領導者或追隨者。在大多數用例中,我只有一個領導和幾個追隨者。領導者通常在其服務器上是單一的,而追隨者在其他服務器上運行(其中一些在同一個JVM中)。最好的JGroups堆棧配置領導者/追隨者關係

追隨者節點永遠不必向對方發送消息,他們只會與領導者節點進行通信。目前,我使用tcpgossip協議來發現羣集的成員。我的GossipRouter運行在與領導者節點相同的JVM中。實際上它工作得很好,我的集羣看起來足夠穩定。

據我瞭解tcpgossip協議,每個節點伸出GossipRouter並從中獲取信息。所以在我的情況下,所有的跟隨者節點聯繫領導者節點運行的服務器。然而,當我關閉從動節點中的一個,我可以看到從其它從動警告消息節點該狀態:

警告:螺紋= TransferQueueBundler,myCluster中,火箭21632週五年11月18十點22分十一秒CET 2016 org.jgroups.protocols.BaseBundler sendSingleMessage JGRP000029:ROCKET-21632:向zeus-10187(102字節)發送消息失敗:java.net.SocketTimeoutException:連接超時,頭文件:VERIFY_SUSPECT:[VERIFY_SUSPECT:ARE_YOU_DEAD],TP:[ CLUSTER_NAME = myCluster中]

警告:螺紋= TransferQueueBundler,myCluster中,火箭21632週五年11月18 10點21分19秒CET 2016 org.jgroups.protocols.TP sendToMembers JGRP000034:火箭21632:失敗仙定消息宙斯-10187:java.net.SocketTimeoutException:連接超時

其中ROCKET-21632zeus-10187兩種追隨者。我期望追隨者不會互相交談,因爲使用了GossipRouter,但似乎並非如此。

有沒有辦法建立一個集羣,其中一些節點永遠不會互相對話?

回答

0

您僅將TCPGOSSIP用作發現機制。因此,如果你在一個單獨的節點上運行GossipRouter,啓動所有節點,然後殺死GossipRouter,事情仍然有效(但合併除外)。只有發現(並因此加入新成員)纔不起作用。

即使您使用TCPGOSSIP,成員之間也會直接對話。如果你不想要,用TUNNEL替換TCP作爲傳輸。所有成員將把他們的所有消息導向一個GossipRouter,並將它們轉發給其他成員。但不利的一面是領導節點獲得了很多流量;相反,彼此交談的成員直接將流量模式均勻分佈在集羣中。

如果你想使用TUNNEL:TCPGOSSIP,我推薦使用多個GossipRouters來容錯。

+0

謝謝你的快速回答。我會試一試,讓你知道它是怎麼回事。謝謝! – Azeq