2016-03-02 108 views
6

比方說,我們有hazelcast的兩個實例:Hazelcast:合併兩個hazelcast實例

HazelcastInstance firstInstance = Hazelcast.newHazelcastInstance(new Config()); 
HazelcastInstance secondInstance = Hazelcast.newHazelcastInstance(new Config()); 
// Add entries to firstInstance 
// Add entries to secondInstance 

現在我想從firstInstance刪除一切,然後add everything fromsecondInstance to firstInstance

有沒有辦法做到這一點?

回答

5

首先,根據代碼中顯示的兩個實例的初始化,這兩個實例都屬於同一個羣集組,並且在給定默認配置的情況下,它們都將包含所有共享數據。換句話說,你不需要'轉移'信息。

如果以上情況屬實,則在您完成從第一個實例中刪除之後,您將不會擁有任何數據副本(各自的源除外)。

但是,如果使用將配置綁定到不同羣集組的配置來初始化實例(請記住,您的代碼在問題中沒有這樣做),只需使用Java Map/Collections API進行「複製」就足夠簡單了(其中Hazelcast共享數據結構類型實施):

secondInstance.getMap("myMap").putAll(firstInstance.getMap("myMap")); 
firstInstance.getMap("myMap").clear(); //please confirm this. 

分佈式列表可以用類似的方式處理。 此外,請注意這些「批量複製」,因爲您的會員可能會遇到內存不足錯誤(當然,這取決於您的數據大小)。

更多關於這可以在這裏閱讀:http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#preventing-out-of-memory-exceptions

+0

歐內斯特·您好,感謝詳細的解釋。 我使用'newHazelcastInstance()'初始化spring配置中的firstInstance,另一個使用newHazelcastInstance()。這個想法是獲取更新的數據並將其保存在secondInstace中,而firstInstance正被其他服務使用。一旦secondInstance更新,我想從firstInstace中刪除所有數據並從secondInstance中加載它。 –

+0

但是我從您的評論中瞭解到,這兩個實例都是綁定的,任何實例上的任何數據添加/刪除操作都將在另一個實例上進行鏡像。如果是這種情況,那麼我如何實現這種情況(因爲這兩個實例都來自同一羣集)? –

+1

@Rahul:如果兩個成員都是同一個羣集組的一部分,並且已經發現了對方,那麼hazelcast的複製(除非您已經定製了它)將導致節點保存所有數據的副本,而無需在代碼中手動複製。如果基於spring的成員死亡,那麼第二個節點仍然會有數據。但是,如果您「刪除」映射條目,則會從集羣中刪除數據(之後這兩個成員都不會擁有它)。關鍵是兩個成員屬於同一個羣集並共享複製的數據,在這種情況下,您不需要複製。 –