Dela via


Felsöka NoHostAvailableException och NoNodeAvailableException

NoHostAvailableException är ett undantag på den översta nivån med många möjliga orsaker och inre undantag, varav många kan vara klientrelaterade. Det här undantaget tenderar att inträffa om det finns några problem med kluster- eller anslutningsinställningarna, eller om en eller flera Cassandra-noder inte är tillgängliga.

Den här artikeln utforskar möjliga orsaker till det här undantaget och beskriver specifik information om klientdrivrutinen som används.

Drivrutinsinställningar

En av de vanligaste orsakerna till NoHostAvailableException är standardinställningarna för drivrutinen. Vi rekommenderar att du använder inställningarna som anges i slutet av den här artikeln. Här är några förklarande information:

  • Standardvärdet för anslutningarna per värd är 1, vilket vi inte rekommenderar för Azure Cosmos DB. Vi rekommenderar ett minimivärde på 10. Även om fler aggregerade enheter för programbegäran (RU) tillhandahålls ökar du antalet anslutningar. Den allmänna riktlinjen är 10 anslutningar per 200 000 RU.
  • Använd återförsöksprincipen för Azure Cosmos DB för att hantera tillfälliga begränsningssvar. Mer information finns i Azure Cosmos DB-tilläggsbiblioteken:
  • För konton i flera regioner använder du azure Cosmos DB-belastningsutjämningsprincipen i tillägget.
  • Tidsgränsen för läsbegäran bör anges till mer än 1 minut. Vi rekommenderar 90 sekunder.

Undantagsmeddelanden

Om undantaget kvarstår när du har gjort de rekommenderade ändringarna granskar du undantagsmeddelandena i de kommande tre avsnitten. Om felloggen innehåller något av dessa undantagsmeddelanden följer du rekommendationen för det undantaget.

BusyPoolException

Det här felet på klientsidan anger att det maximala antalet begärandeanslutningar för en värd har nåtts. Om du inte kan ta bort begäran från kön kan det här felet visas. Om anslutningen per värd har angetts till minst 10 kan undantaget orsakas av långa svarstider på serversidan.

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)')

Rekommendation

I stället för att justera max requests per connectionkontrollerar du att det connections per host är inställt på minst 10. Se avsnittet kodexempel.

TooManyRequest(429)

OverloadException genereras när begärandefrekvensen är för stor, vilket kan inträffa när otillräckligt dataflöde har etablerats för tabellen och RU-budgeten överskrids. Mer information finns i stora begäranden och försök igen på serversidan.

Rekommendation

Använd något av följande alternativ:

  • Om begränsningen är beständig ökar du den etablerade RU:en.
  • Om begränsningen är tillfällig använder du återförsöksprincipen för Azure Cosmos DB.
  • Om tilläggsbiblioteket inte kan refereras aktiverar du återförsök på serversidan.

Alla värdar som provats för frågan misslyckades

När klienten är inställd på att ansluta till en annan region än den primära kontaktpunktsregionen får du ett av följande undantagsmeddelanden under de första sekunderna vid start:

  • För Java-drivrutin 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)

  • För Java-drivrutin 4: No node was available to execute the query

  • För C#-drivrutin 3: System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2

Rekommendation

Använd CosmosLoadBalancingPolicy i Java driver 3 och Java driver 4. Den här principen återgår till kontaktpunkten för den primära skrivregionen där angivna lokala data inte är tillgängliga.

Kommentar

Om föregående rekommendationer inte hjälper dig att lösa problemet kontaktar du Azure Cosmos DB-supporten. Se till att ange följande information: undantagsmeddelande, undantagsstacktrace, datastaxdrivrutinslogg, universell tidpunkt för fel, konsekventa eller tillfälliga fel, fel i nyckelutrymme och tabell, begärandetyp som misslyckades och SDK-version.

Kodexempel

Inställningar för Java-drivrutin 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();

Inställningar för Java-drivrutin 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();

Inställningar för C# v3-drivrutin

    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);

Nästa steg