Delen via


Problemen met NoHostAvailableException en NoNodeAvailableException oplossen

NoHostAvailableException is een wrapper-uitzondering op het hoogste niveau met veel mogelijke oorzaken en interne uitzonderingen, waarvan veel clientgerelateerd kunnen zijn. Deze uitzondering treedt meestal op als er problemen zijn met het cluster of de verbindingsinstellingen, of als een of meer Cassandra-knooppunten niet beschikbaar zijn.

In dit artikel worden mogelijke redenen voor deze uitzondering besproken en worden specifieke details besproken over het clientstuurprogramma dat wordt gebruikt.

Stuurprogramma-instellingen

Een van de meest voorkomende oorzaken van NoHostAvailableException is de standaardstuurprogramma-instellingen. U wordt aangeraden de instellingen te gebruiken die aan het einde van dit artikel worden vermeld. Hier volgt een aantal verklarende informatie:

  • De standaardwaarde van de verbindingen per host is 1. Dit wordt niet aanbevolen voor Azure Cosmos DB. We raden een minimumwaarde van 10 aan. Hoewel er meer geaggregeerde aanvraageenheden (RU's) worden opgegeven, verhoogt u het aantal verbindingen. De algemene richtlijn is 10 verbindingen per 200.000 RU.
  • Gebruik het beleid voor opnieuw proberen van Azure Cosmos DB om onregelmatige beperkingsreacties af te handelen. Zie de Azure Cosmos DB-extensiebibliotheken voor meer informatie:
  • Gebruik voor accounts met meerdere regio's het Azure Cosmos DB-taakverdelingsbeleid in de extensie.
  • De time-out van de leesaanvraag moet worden ingesteld op meer dan 1 minuut. We raden 90 seconden aan.

Uitzonderingsberichten

Als de uitzondering zich blijft voordoen nadat u de aanbevolen wijzigingen hebt aangebracht, bekijkt u de uitzonderingsberichten in de volgende drie secties. Als uw foutenlogboek een van deze uitzonderingsberichten bevat, volgt u de aanbeveling voor die uitzondering.

BusyPoolException

Deze fout aan de clientzijde geeft aan dat het maximum aantal aanvraagverbindingen voor een host is bereikt. Als u de aanvraag niet uit de wachtrij kunt verwijderen, wordt deze fout mogelijk weergegeven. Als de verbinding per host is ingesteld op minimaal 10, kan de uitzondering worden veroorzaakt door een hoge latentie aan de serverzijde.

Java driver v3 exception:
All host(s) tried for query failed (tried: :10350 (com.datastax.driver.core.exceptions.BusyPoolException: [:10350] Pool is busy (no available connection and the queue has reached its max size 256)))
All host(s) tried for query failed (tried: :10350 (com.datastax.driver.core.exceptions.BusyPoolException: [:10350] Pool is busy (no available connection and timed out after 5000 MILLISECONDS)))
C# driver 3:
All hosts tried for query failed (tried :10350: BusyPoolException 'All connections to host :10350 are busy, 2048 requests are in-flight on each 10 connection(s)')

Aanbeveling

In plaats van af te stemmen max requests per connection, moet u ervoor zorgen dat deze connections per host is ingesteld op minimaal 10. Zie de sectie codevoorbeeld.

TooManyRequest(429)

OverloadException wordt gegenereerd wanneer de aanvraagsnelheid te groot is, wat kan gebeuren wanneer er onvoldoende doorvoer wordt ingericht voor de tabel en het RU-budget wordt overschreden. Zie voor meer informatie grote aanvragen en nieuwe pogingen aan de serverzijde.

Aanbeveling

Pas een van de volgende opties toe:

  • Als beperking persistent is, verhoogt u de ingerichte RU.
  • Als beperking onregelmatig is, gebruikt u het beleid voor opnieuw proberen van Azure Cosmos DB.
  • Als er niet naar de extensiebibliotheek kan worden verwezen, schakelt u het opnieuw proberen aan de serverzijde in.

Alle hosts die zijn geprobeerd om een query uit te voeren, zijn mislukt

Wanneer de client is ingesteld om verbinding te maken met een andere regio dan de primaire contactpuntregio, krijgt u tijdens de eerste paar seconden bij het opstarten een van de volgende uitzonderingsberichten:

  • Voor Java-stuurprogramma 3: Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)at cassandra.driver.core@3.10.2/com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:83)

  • Voor Java-stuurprogramma 4: No node was available to execute the query

  • Voor C#-stuurprogramma 3: System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2

Aanbeveling

Gebruik CosmosLoadBalancingPolicy in Java-stuurprogramma 3 en Java-stuurprogramma 4. Dit beleid valt terug op het contactpunt van de primaire schrijfregio waar de opgegeven lokale gegevens niet beschikbaar zijn.

Notitie

Als de voorgaande aanbevelingen uw probleem niet helpen oplossen, neemt u contact op met de ondersteuning van Azure Cosmos DB. Zorg ervoor dat u de volgende details opgeeft: uitzonderingsbericht, uitzonderingsstacktrace, datastax-stuurprogrammalogboek, universele fouttijd, consistente of onregelmatige fouten, mislukte keyspace en tabel, aanvraagtype dat is mislukt en SDK-versie.

Voorbeeld van code

Instellingen voor Java-stuurprogramma 3

   // socket options with default values
    // https://docs.datastax.com/en/developer/java-driver/3.6/manual/socket_options/
    SocketOptions socketOptions = new SocketOptions()
        .setReadTimeoutMillis(90000); // default 12000

    // connection pooling options (default values are 1s)
    // https://docs.datastax.com/en/developer/java-driver/3.6/manual/pooling/
    PoolingOptions poolingOptions = new PoolingOptions()
        .setCoreConnectionsPerHost(HostDistance.LOCAL, 10) // default 1
        .setMaxConnectionsPerHost(HostDistance.LOCAL, 10) // default 1
        .setCoreConnectionsPerHost(HostDistance.REMOTE, 10) // default 1
        .setMaxConnectionsPerHost(HostDistance.REMOTE, 10); //default 1

    // Azure Cosmos DB load balancing policy
    String Region = "West US";
    CosmosLoadBalancingPolicy cosmosLoadBalancingPolicy = CosmosLoadBalancingPolicy.builder()
        .withWriteDC(Region)
        .withReadDC(Region)
        .build();

    // Azure Cosmos DB retry policy
    CosmosRetryPolicy retryPolicy = CosmosRetryPolicy.builder()
        .withFixedBackOffTimeInMillis(5000)
        .withGrowingBackOffTimeInMillis(1000)
        .withMaxRetryCount(5)
        .build();

    Cluster cluster = Cluster.builder()
        .addContactPoint(EndPoint).withPort(10350)
        .withCredentials(UserName, Password)
        .withSSL(sslOptions)
        .withSocketOptions(socketOptions)
        .withPoolingOptions(poolingOptions)
        .withLoadBalancingPolicy(cosmosLoadBalancingPolicy)
        .withRetryPolicy(retryPolicy)
        .build();

Instellingen voor Java-stuurprogramma 4

    // driver configurations
    // https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/configuration/
    ProgrammaticDriverConfigLoaderBuilder configBuilder = DriverConfigLoader.programmaticBuilder();

    // connection settings
    // https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/pooling/
    configBuilder
        .withInt(DefaultDriverOption.CONNECTION_POOL_LOCAL_SIZE, 10) // default 1
        .withInt(DefaultDriverOption.CONNECTION_POOL_REMOTE_SIZE, 10) // default 1
        .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(90)) // default 2
        .withClass(DefaultDriverOption.RECONNECTION_POLICY_CLASS, ConstantReconnectionPolicy.class) // default ExponentialReconnectionPolicy
        .withBoolean(DefaultDriverOption.METADATA_TOKEN_MAP_ENABLED, false); // default true

    // load balancing settings
    // https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/load_balancing/
    String Region = "West US";
    List<String> preferredRegions = new ArrayList<String>();
    preferredRegions.add(Region);
    configBuilder
        .withClass(DefaultDriverOption.LOAD_BALANCING_POLICY_CLASS, CosmosLoadBalancingPolicy.class)
        .withBoolean(CosmosLoadBalancingPolicyOption.MULTI_REGION_WRITES, false)
        .withStringList(CosmosLoadBalancingPolicyOption.PREFERRED_REGIONS, preferredRegions);

    // retry policy
    // https://docs.datastax.com/en/developer/java-driver/4.6/manual/core/retries/
    configBuilder
        .withClass(DefaultDriverOption.RETRY_POLICY_CLASS, CosmosRetryPolicy.class)
        .withInt(CosmosRetryPolicyOption.FIXED_BACKOFF_TIME, 5000)
        .withInt(CosmosRetryPolicyOption.GROWING_BACKOFF_TIME, 1000)
        .withInt(CosmosRetryPolicyOption.MAX_RETRIES, 5);

    CqlSession session = CqlSession.builder()
        .withSslContext(sc)
        .addContactPoint(new InetSocketAddress(EndPoint, Port))
        .withAuthCredentials(UserName, Password)
        .withLocalDatacenter(Region)
        .withConfigLoader(configBuilder.build())
        .build();

Stuurprogramma-instellingen voor C# v3

    PoolingOptions poolingOptions = PoolingOptions.Create()
        .SetCoreConnectionsPerHost(HostDistance.Local, 10) // default 2
        .SetMaxConnectionsPerHost(HostDistance.Local, 10) // default 8
        .SetCoreConnectionsPerHost(HostDistance.Remote, 10) // default 1
        .SetMaxConnectionsPerHost(HostDistance.Remote, 10); // default 2

    SocketOptions socketOptions = new SocketOptions()
        .SetReadTimeoutMillis(90000); // default 12000

    buildCluster = Cluster.Builder()
        .AddContactPoint(Program.ContactPoint)
        .WithPort(Program.CosmosCassandraPort)
        .WithCredentials(Program.UserName, Program.Password)
        .WithPoolingOptions(poolingOptions)
        .WithSocketOptions(socketOptions)
        .WithReconnectionPolicy(new ConstantReconnectionPolicy(1000)) // default ExponentialReconnectionPolicy
        .WithSSL(sslOptions);

Volgende stappen