Я использую 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 );
}