Megosztás a következőn keresztül:


A NoHostAvailableException és a NoNodeAvailableException hibaelhárítása

A NoHostAvailableException egy legfelső szintű burkoló kivétel, amely számos lehetséges okot és belső kivételt tartalmazhat, amelyek közül sok ügyfélhez köthető. Ez a kivétel általában akkor fordul elő, ha probléma merül fel a fürt vagy a kapcsolat beállításaival kapcsolatban, vagy ha egy vagy több Cassandra-csomópont nem érhető el.

Ez a cikk a kivétel lehetséges okait ismerteti, és részletesen ismerteti a használt ügyfélillesztőt.

Illesztőprogram-beállítások

A NoHostAvailableException egyik leggyakoribb oka az alapértelmezett illesztőprogram-beállítások. Javasoljuk, hogy a cikk végén felsorolt beállításokat használja. Íme néhány magyarázó információ:

  • A gazdagépenkénti kapcsolatok alapértelmezett értéke 1, ami az Azure Cosmos DB-hez nem ajánlott. Javasoljuk, hogy legalább 10 értéket adjon meg. Bár több összesített kérelemegység (RU) van megadva, növelje a kapcsolat számát. Az általános útmutató 10 kapcsolat 200 000 RU-ra vetítve.
  • Az Azure Cosmos DB újrapróbálkozási szabályzatával kezelheti az időszakos szabályozási válaszokat. További információt az Azure Cosmos DB bővítménytárakban talál:
  • Többrégiós fiókok esetén használja az Azure Cosmos DB terheléselosztási szabályzatát a bővítményben.
  • Az olvasási kérelem időtúllépésének 1 percnél hosszabbnak kell lennie. 90 másodpercet ajánlunk.

Kivételüzenetek

Ha a kivétel a javasolt módosítások végrehajtása után is megmarad, tekintse át a következő három szakaszban található kivételüzeneteket. Ha a hibanapló tartalmaz ilyen kivételüzeneteket, kövesse a kivételre vonatkozó javaslatot.

BusyPoolException

Ez az ügyféloldali hiba azt jelzi, hogy elérte a gazdagéphez tartozó kéréskapcsolatok maximális számát. Ha nem tudja eltávolítani a kérést az üzenetsorból, ez a hiba jelenhet meg. Ha a gazdagépenkénti kapcsolat értéke legalább 10, a kivételt a kiszolgálóoldali késés okozhatja.

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

Ajánlás

Hangolás max requests per connectionhelyett győződjön meg arról, hogy connections per host a beállítás értéke legalább 10. Lásd a kódminta szakaszt.

TooManyRequest(429)

A OverloadException akkor fordul elő, ha a kérések sebessége túl nagy, ami akkor fordulhat elő, ha nincs elegendő átviteli sebesség kiépítve a táblához, és a kérelemegység-költségvetés túllépi a kérelemegység-költségvetést. További információkért lásd a nagyméretű kéréseket és a kiszolgálóoldali újrapróbálkozásokat.

Ajánlás

Alkalmazza az alábbi lehetőségek egyikét:

  • Ha a szabályozás állandó, növelje a kiosztott ru-t.
  • Ha a szabályozás időszakos, használja az Azure Cosmos DB újrapróbálkozási szabályzatát.
  • Ha a bővítménytárra nem lehet hivatkozni, engedélyezze a kiszolgálóoldali újrapróbálkozási elemet.

A lekérdezésre próbált összes gazdagép sikertelen volt

Ha az ügyfél úgy van beállítva, hogy az elsődleges partnerpont-régiótól eltérő régióhoz csatlakozzon, az indításkor a kezdeti néhány másodpercben a következő kivételüzenetek egyikét kapja:

  • Java driver 3 esetén: 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)

  • Java driver 4 esetén: No node was available to execute the query

  • C#-illesztő 3 esetén: System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2

Ajánlás

A CosmosLoadBalancingPolicy használata a Java 3- és a Java-illesztőprogram 4-ben. Ez a szabályzat visszaesik az elsődleges írási régió kapcsolattartási pontjára, ahol a megadott helyi adatok nem érhetők el.

Feljegyzés

Ha a fenti javaslatok nem segítenek megoldani a problémát, forduljon az Azure Cosmos DB ügyfélszolgálatához. Mindenképpen adja meg a következő adatokat: kivételüzenet, kivételveremsáv, datastax-illesztőnapló, általános meghibásodási idő, konzisztens vagy időszakos hibák, hibás kulcstér és tábla, sikertelen kérelemtípus és SDK-verzió.

Kódminta

Java-illesztőprogram 3 beállításai

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

Java-illesztőprogram 4 beállításai

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

C# v3 illesztőprogram-beállítások

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

Következő lépések