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 connection
helyett 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
- A különböző hibakódok és jelentésük megértéséhez tekintse meg a kiszolgálóoldali diagnosztikát.
- Lásd az Azure Cosmos DB .NET SDK-val kapcsolatos problémák diagnosztizálása és hibaelhárítása című témakört.
- Ismerje meg a .NET v3 és a .NET v2 teljesítményre vonatkozó irányelveit.
- Lásd az Azure Cosmos DB Java SDK 4-es verziójú, NoSQL-fiókokhoz készült API-val kapcsolatos problémáinak hibaelhárítását.
- Teljesítménytippek az Azure Cosmos DB Java SDK v4-hez.