Поддерживает ли Hazelcast этот сетевой раздел из 3 узлов? - PullRequest
1 голос
/ 01 октября 2019

Я использую hazelcast 3.11 и тестирую следующую ситуацию в сети.

  A
 / \
B   C

Где A и B подключены в обоих направлениях, A и C подключены в обоих направлениях, а B и C отключены,Обычно все узлы подключены, поэтому я программно настраиваю каждый IP для каждого узла, используя конфигурацию TcpIp.

Когда я представляю сбой сети, узел B подозревает узел C, поскольку он не отправил никаких тактовых импульсов, а затем сразу послеон подозревает узел A по причине «явного подозрения».

Узел C подозревает узел B, потому что он не отправил ни одного пульса. Он находится в том же кластере, что и узел А. Является ли способ «явного подозрения» Hazelcast создать 2 полностью связанных раздела вместо 1, который не является полностью связанным? Есть ли способ настроить Hazelcast на такой тип сетевого сбоя и поддерживать подключение A к A и C?

В качестве примечания, меня интересует только использование ReplicatedMap и API распределенных событий.

Редактировать: следующий код запускается один раз на каждом из 3 серверов с именами A, B и C. Каждый из них запускается один раз в режиме 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 );
}

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Это зависит от того, какой узел является главным (тот, который появился первым в кластере). Если A является ведущим, то кластер продолжит работать в обычном режиме, за исключением того, что операции, исходящие из C и предназначенные для узла B, будут иметь тайм-аут операции, и наоборот, от B до C. Если кластер используется в режиме клиент-сервертогда это не влияет на операции с данными, генерируемые клиентом, за исключением резервных копий, т. е. если некоторые данные, которые в основном хранятся в B, но требуют резервного копирования на C, потерпят неудачу. Таким образом, в случае сбоя B или C, вы потеряете данные.

Если B или C были мастером, кластер будет разделен на BA и C или CA и B. В этом случае применяется стандартная обработка разделенного мозга.

0 голосов
/ 02 октября 2019

У меня проблемы с выполнением вашего описания здесь, поскольку ваш сетевой раздел смешивается с узлом. Либо узел является членом кластера, либо нет. Вы спрашиваете конкретно о сетевой маршрутизации здесь? Пожалуйста, предоставьте пример кода и конфигурации.

...