2017-09-12 111 views
0

我有一個應用程序,它同時在的數據中心上部署了一個拉伸的Hazelcast集羣。這兩個數據中心通常都具有完整的功能,但有時,其中一個數據中心完全脫離網絡進行SDN升級。確保使用Hazelcast在數據中心之間進行復制

我打算實現的是以這樣一種方式配置集羣,即DC中的每個主分區至少有2備份 - 一個在另一個集羣中,另一個在當前集羣中。

爲此,檢查文檔指向分區組的方向http://docs.hazelcast.org/docs/2.3/manual/html/ch12s03.html)。企業WAN複製看起來與我們想要的完全相同,但不幸的是,此功能不適用於免費版本的Hazelcast。

我的配置如下:

NetworkConfig network = config.getNetworkConfig(); 

    network.setPort(hzClusterConfigs.getPort()); 
    JoinConfig join = network.getJoin(); 
    join.getMulticastConfig().setEnabled(hzClusterConfigs.isMulticastEnabled()); 
    join.getTcpIpConfig() 
      .setMembers(hzClusterConfigs.getClusterMembers()) 
      .setEnabled(hzClusterConfigs.isTcpIpEnabled()); 
    config.setNetworkConfig(network); 

    PartitionGroupConfig partitionGroupConfig = config.getPartitionGroupConfig() 
      .setEnabled(true).setGroupType(PartitionGroupConfig.MemberGroupType.CUSTOM) 
      .addMemberGroupConfig(new MemberGroupConfig().addInterface(hzClusterConfigs.getClusterDc1Interface())) 
      .addMemberGroupConfig(new MemberGroupConfig().addInterface(hzClusterConfigs.getClusterDc2Interface())); 
    config.setPartitionGroupConfig(partitionGroupConfig); 

的CONFIGS使用最初爲:

clusterMembers=host1,host2,host3,host4 
clusterDc1Interface=10.10.1.* 
clusterDc2Interface=10.10.1.* 

但是,在該集合中的任何事件的configs的更改羣集的組件時觸發,一個羣集中隨機節點開始記錄「沒有成員組可用於分配分區所有權」隔秒(如此處:https://github.com/hazelcast/hazelcast/issues/5666)。更重要的是,檢查JMX中PartitionService公開的狀態顯示,儘管羣集狀態顯然成功,但實際上沒有分區被填充。

因此,我開始用相應的IP替換主機名,並且配置工作。分區已成功創建,沒有節點出現。

這裏的問題是,這些盒子是作爲A/B部署過程的一部分創建的,並且從244個IP範圍自動獲取IP。添加所有這244個IP似乎有點多,即使它是由廚師編程而不是手動完成的,因爲它會帶來所有的網絡噪音。使用基於telnet的客戶端檢查哪些機器正在監聽hazelcast端口時檢查每個部署也似乎有點問題,因爲IP將從部署到另一個不同,並且我們會陷入一種情況,其中一部分節點在集羣中將有一個特定的成員列表,而另一部分將同時具有不同的成員列表。

在我看來,使用主機名是最好的解決方案,因爲我們將依賴於DNS解析並且不需要在配置時將我們的頭圍繞IP解析。

有沒有人知道解決組配置問題的解決方法?或者,也許,實現相同行爲的替代方案?

回答

0

這是不可能的。無法爲備份組設計自己的備份方式。作爲一種解決方法,您可以設計4個組,但在這種情況下,不能保證每個數據中心都有一個備份,至少不需要使用3個備份。

無論如何,我們不建議將Hazelcast集羣分佈到多個數據中心,除非特殊情況下的DC以類似於LAN網絡和冗餘設置的方式進行互連。

相關問題