【问题标题】:Does Hazelcast support this 3 node network partition?Hazelcast 是否支持这个 3 节点网络分区?
【发布时间】:2019-10-01 14:41:27
【问题描述】:

我正在使用 hazelcast 3.11 并测试以下网络情况。

  A
 / \
B   C

其中A和B双向连接,A和C双向连接,B和C断开。通常所有节点都已连接,因此我使用 TcpIp 配置以编程方式为每个节点配置每个 IP。

当我介绍网络故障时,节点 B 怀疑节点 C,因为它没有发送任何心跳,然后立即怀疑节点 A 的原因是“显式怀疑”。

节点 C 怀疑节点 B,因为它没有发送任何心跳。它与节点 A 位于同一个集群中。 “明确怀疑” Hazelcast 创建 2 个完全连接的分区而不是 1 个不完全连接的分区的方式?有没有办法将 Hazelcast 配置为出现这种类型的网络故障并保持 A 连接到 A 和 C?

附带说明一下,我只对使用 ReplicatedMap 和分布式事件 API 感兴趣。

编辑:以下代码在名为 A、B 和 C 的 3 台服务器上运行一次。它们分别运行一次 hazelcast 实例。

public HazelcastInstance getHazelcastInstance() {
    Config config = new Config();
    config
        .getGroupConfig( )
        .setName( localFacility.getName() )
        .setPassword( clusterPassword );

    NetworkConfig networkConfig = config.getNetworkConfig();              

    //Disable multicast
    JoinConfig joinConfig = networkConfig.getJoin();
    joinConfig
        .getMulticastConfig()
        .setEnabled( false );

    // Interface config
    InterfacesConfig interfaceConfig = networkConfig.getInterfaces();
    IntraFacilityProperties intrafacilityProperties = facilityPropertiesUtil.getCurrentIntrafacilityProperties();
    String primaryHostname = intrafacilityProperties.getHostname();
    String secondaryHostname = intrafacilityProperties.getBackupHostname();

    try {

        InetAddress primaryIp = InetAddress.getByName( primaryHostname );
        InetAddress secondaryIp = InetAddress.getByName( secondaryHostname );

        // Specify which network interfaces to use based on the configured hostnames
        interfaceConfig
            .setEnabled( true )
            .addInterface( primaryIp.getHostAddress() )
            .addInterface( secondaryIp.getHostAddress() );

    } catch ( UnknownHostException e ) {

        if ( logger.isErrorEnabled() ) {
            logger.error( "Caught UnknownHostException", e );
        }

        throw new HazelcastInstantiationException( e.getMessage() );
    }


    //Enable the tcp ip config.
    TcpIpConfig ipConfig = joinConfig.getTcpIpConfig();
    ipConfig.setEnabled( true );

    try{ 
        // Loops through all servers regardless of which server this is.
        for( IntraFacilityProperties member : facilityPropertiesUtil.getIntraFacilityProperties() ) {
            ipConfig.addMember( InetAddress.getByName( member.getHostname() ).getHostAddress() );
            ipConfig.addMember( InetAddress.getByName( member.getBackupHostname() ).getHostAddress() );
        }
    } catch( UnknownHostException e ) {
        if ( logger.isErrorEnabled() ) {
            logger.error( "Caught UnknownHostException", e );
        }

        throw new HazelcastInstantiationException( e.getMessage() );
    }

    ReplicatedMapConfig repMapCfg = new ReplicatedMapConfig();
    repMapCfg.setName( "default" )
             .setMergePolicyConfig( new MergePolicyConfig()
             .setPolicy( "LatestAccessMergePolicy" ) );
    config.addReplicatedMapConfig( repMapCfg );

    config.setProperty( "hazelcast.heartbeat.failuredetector.type", "deadline" );
    config.setProperty( "hazelcast.heartbeat.interval.seconds", hzHeartbeatInterval );
    config.setProperty( "hazelcast.max.no.heartbeat.seconds", hzHeartbeatTimeout );
    config.setProperty( "hazelcast.merge.first.run.delay.seconds", hzMergeFirstDelay );
    config.setProperty( "hazelcast.merge.next.run.delay.seconds", hzMergeNextDelay );
    return Hazelcast.newHazelcastInstance( config );
}

【问题讨论】:

    标签: hazelcast


    【解决方案1】:

    由于您将网络分区与 node.一个节点要么是集群的成员,要么不是。您是否在这里专门询问网络路由?请提供一些示例代码和配置。

    【讨论】:

    • 我已经添加了代码来显示 tcpIp 配置,并且我已经编辑了这个问题,因为我认为我可能误用分区来表示导致分区的网络故障。我希望这有帮助。在出现此故障的情况下,我可以看到如何路由需要从 BC 到 A 的信息。这可以通过我缺少的 hazelcast 配置来完成吗?
    • 感谢您的澄清。如果我理解你的描述。您有一个包含节点 A、B 和 C 的集群。在 B 和 C 之间发生了网络分区。AB 和 AC 之间的路由仍然完好无损。根据您的描述,节点 B 向节点 A 发送了明确的怀疑事件。这是因为节点 A 向 B 发送了心跳请求,但 B 已经存在集群,因此创建了自己的单个成员集群。节点 A 和 C 保留在集群中。 Hazelcast 不允许一个节点成为多个集群的成员。
    【解决方案2】:

    这取决于哪个节点是主节点(集群中最先出现的节点)。如果 A 是主节点,则集群将继续正常运行,但源自 C 且用于节点 B 的操作将超时,反之亦然 B 到 C。如果集群用于客户端-服务器模式那么除了备份之外,对客户端生成的数据操作没有影响,即如果一些主要存储在 B 但需要备份到 C 的数据,它将失败。因此,如果 B 或 C 出现故障,您最终将丢失数据。

    如果 B 或 C 是​​主节点,则集群将分裂为 B-A 和 C 或 C-A 和 B。在这种情况下,适用标准的裂脑处理。

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多