Řešení potíží s výjimkami NoHostAvailableException a NoNodeAvailableException
NoHostAvailableException je výjimka obálky nejvyšší úrovně s mnoha možnými příčinami a vnitřními výjimkami, z nichž mnohé můžou souviset s klientem. K této výjimce obvykle dochází, pokud dochází k problémům s nastavením clusteru nebo připojení nebo pokud jeden nebo více uzlů Cassandra není k dispozici.
Tento článek popisuje možné důvody této výjimky a popisuje konkrétní podrobnosti o používaném klientském ovladači.
Nastavení ovladače
Jednou z nejběžnějších příčin noHostAvailableException je výchozí nastavení ovladače. Doporučujeme použít nastavení uvedená na konci tohoto článku. Tady je několik vysvětlujících informací:
- Výchozí hodnota připojení na hostitele je 1, což nedoporučujeme pro Službu Azure Cosmos DB. Doporučujeme minimální hodnotu 10. I když jsou k dispozici více agregovaných jednotek žádostí (RU), zvyšte počet připojení. Obecné pokyny jsou 10 připojení na 200 000 RU.
- Ke zpracování přerušovaných odpovědí na omezování použijte zásadu opakování služby Azure Cosmos DB. Další informace najdete v knihovnách rozšíření Azure Cosmos DB:
- Pro účty s více oblastmi použijte zásadu vyrovnávání zatížení služby Azure Cosmos DB v rozšíření.
- Časový limit požadavku pro čtení by měl být nastavený na více než 1 minutu. Doporučujeme 90 sekund.
Zprávy o výjimce
Pokud výjimka přetrvává i po provedení doporučených změn, projděte si zprávy o výjimce v následujících třech částech. Pokud protokol chyb obsahuje některou z těchto zpráv o výjimce, postupujte podle doporučení pro tuto výjimku.
BusyPoolException
Tato chyba na straně klienta značí, že byl dosažen maximální počet připojení požadavků pro hostitele. Pokud nemůžete požadavek z fronty odebrat, může se zobrazit tato chyba. Pokud je připojení na hostitele nastaveno na minimálně 10, může být výjimka způsobená vysokou latencí na straně serveru.
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)')
Doporučení
Místo ladění max requests per connection
se ujistěte, že connections per host
je nastavená na minimálně 10. Podívejte se na ukázkovou část kódu.
TooManyRequest(429)
PřetíženíException se vyvolá v případě, že je příliš velká frekvence požadavků, což může nastat, když je pro tabulku zřízena nedostatečná propustnost a je překročen rozpočet RU. Další informace najdete v části Velké požadavky a opakování na straně serveru.
Doporučení
Použijte jednu z následujících možností:
- Pokud je omezování trvalé, zvyšte zřízenou RU.
- Pokud dochází k přerušovanému omezování, použijte zásadu opakování služby Azure Cosmos DB.
- Pokud na knihovnu rozšíření nejde odkazovat, povolte opakování na straně serveru.
Všichni hostitelé, kteří se pokusili o dotaz, selhali.
Když je klient nastavený tak, aby se připojil k jiné oblasti než primární oblasti kontaktního bodu během prvních několika sekund při spuštění, zobrazí se jedna z následujících zpráv o výjimce:
Pro ovladač Java 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)
Pro ovladač Java 4:
No node was available to execute the query
Pro ovladač C# 3:
System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2
Doporučení
Použijte CosmosLoadBalancingPolicy v ovladači Java 3 a ovladači Javy 4. Tato zásada se vrátí do kontaktního bodu primární oblasti zápisu, kde zadaná místní data nejsou k dispozici.
Poznámka:
Pokud předchozí doporučení nepomáhají váš problém vyřešit, obraťte se na podporu služby Azure Cosmos DB. Nezapomeňte zadat následující podrobnosti: zpráva o výjimce, trasování zásobníku výjimek, protokol ovladače datastax, univerzální čas selhání, konzistentní nebo přerušované chyby, selhání prostoru klíčů a tabulky, typ požadavku, který selhal, a verze sady SDK.
Ukázka kódu
Nastavení ovladače Java 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();
Nastavení ovladače Java 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();
Nastavení ovladače 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);
Další kroky
- Informace o různých kódech chyb a jejich významu najdete v tématu Diagnostika na straně serveru.
- Viz Diagnostika a řešení potíží se sadou .NET SDK služby Azure Cosmos DB.
- Přečtěte si informace o pokynech k výkonu pro .NET v3 a .NET v2.
- Přečtěte si téma Řešení potíží s účty Sady Java SDK služby Azure Cosmos DB v4 s účty API for NoSQL.
- Podívejte se na tipy k výkonu sady Java SDK služby Azure Cosmos DB verze 4.