Rozwiązywanie problemów z elementem NoHostAvailableException i NoNodeAvailableException
NoHostAvailableException to wyjątek otoki najwyższego poziomu z wieloma możliwymi przyczynami i wyjątkami wewnętrznymi, z których wiele może być związanych z klientem. Ten wyjątek występuje zwykle, jeśli występują problemy z klastrem lub ustawieniami połączenia albo jeśli co najmniej jeden węzeł Cassandra jest niedostępny.
W tym artykule omówiono możliwe przyczyny tego wyjątku i omówiono szczegółowe informacje o używanym sterowniku klienta.
Ustawienia sterownika
Jedną z najczęstszych przyczyn błędu NoHostAvailableException jest domyślne ustawienia sterownika. Zalecamy użycie ustawień wymienionych na końcu tego artykułu. Oto kilka informacji objaśniających:
- Wartość domyślna połączeń na hosta to 1, której nie zalecamy dla usługi Azure Cosmos DB. Zalecamy minimalną wartość 10. Mimo że podano bardziej zagregowane jednostki żądań (RU), zwiększ liczbę połączeń. Ogólne wytyczne to 10 połączeń na 200 000 RU.
- Użyj zasad ponawiania prób usługi Azure Cosmos DB, aby obsługiwać sporadyczne odpowiedzi ograniczania przepustowości. Aby uzyskać więcej informacji, zobacz biblioteki rozszerzeń usługi Azure Cosmos DB:
- W przypadku kont z wieloma regionami w rozszerzeniu użyj zasad równoważenia obciążenia usługi Azure Cosmos DB.
- Limit czasu żądania odczytu powinien być ustawiony na większą niż 1 minutę. Zalecamy 90 sekund.
Komunikaty o wyjątkach
Jeśli wyjątek będzie się powtarzać po wprowadzeniu zalecanych zmian, przejrzyj komunikaty o wyjątkach w kolejnych trzech sekcjach. Jeśli dziennik błędów zawiera dowolny z tych komunikatów wyjątków, postępuj zgodnie z zaleceniem dla tego wyjątku.
BusyPoolException
Ten błąd po stronie klienta wskazuje, że osiągnięto maksymalną liczbę połączeń żądań dla hosta. Jeśli nie możesz usunąć żądania z kolejki, może zostać wyświetlony ten błąd. Jeśli połączenie na hosta zostało ustawione na co najmniej 10, wyjątek może być spowodowany dużym opóźnieniem po stronie serwera.
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)')
Zalecenie
Zamiast dostrajać max requests per connection
, upewnij się, że connections per host
ustawiono wartość co najmniej 10. Zobacz sekcję przykładową kodu.
TooManyRequest(429)
Wyjątek OverloadException jest zgłaszany, gdy szybkość żądań jest zbyt duża, co może wystąpić, gdy aprowizacja niewystarczających przepływności dla tabeli i przekroczenie budżetu jednostek ŻĄDANIA. Aby uzyskać więcej informacji, zobacz ponawianie po stronie serwera i żądania po stronie serwera.
Zalecenie
Zastosuj jedną z następujących opcji:
- Jeśli ograniczanie przepustowości jest trwałe, zwiększ aprowizowaną jednostkę RU.
- Jeśli ograniczanie przepustowości jest sporadycznie, użyj zasad ponawiania prób usługi Azure Cosmos DB.
- Jeśli nie można odwołać się do biblioteki rozszerzeń, włącz ponawianie po stronie serwera.
Wszystkie hosty próbowały uruchomić zapytanie nie powiodło się
Gdy klient ma nawiązać połączenie z regionem innym niż podstawowy region punktu kontaktowego, w ciągu pierwszych kilku sekund podczas uruchamiania otrzymasz jeden z następujących komunikatów o wyjątku:
Dla sterownika 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)
Dla sterownika Java 4:
No node was available to execute the query
Dla sterownika C# 3:
System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2
Zalecenie
Użyj elementu CosmosLoadBalancingPolicy w sterowniku Java 3 i sterowniku Java 4. Te zasady wracają do punktu kontaktowego podstawowego regionu zapisu, w którym określone dane lokalne są niedostępne.
Uwaga
Jeśli powyższe zalecenia nie pomogą rozwiązać problemu, skontaktuj się z pomocą techniczną usługi Azure Cosmos DB. Upewnij się, że podano następujące szczegóły: komunikat o wyjątku, stos wyjątku, dziennik sterowników datastax, uniwersalny czas awarii, spójne lub sporadyczne błędy, niepowodzenie przestrzeni kluczy i tabeli, typ żądania, który zakończył się niepowodzeniem i wersja zestawu SDK.
Przykład kodu
Ustawienia sterownika 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();
Ustawienia sterownika 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();
Ustawienia sterowników języka C# w wersji 3
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);
Następne kroki
- Aby zrozumieć różne kody błędów i ich znaczenie, zobacz Diagnostyka po stronie serwera.
- Zobacz Diagnozowanie i rozwiązywanie problemów z zestawem .NET SDK usługi Azure Cosmos DB.
- Dowiedz się więcej o wytycznych dotyczących wydajności platformy .NET w wersji 3 i .NET w wersji 2.
- Zobacz Rozwiązywanie problemów z zestawem Java SDK usługi Azure Cosmos DB w wersji 4 z interfejsem API dla kont NoSQL.
- Zobacz Porady dotyczące wydajności zestawu Java SDK usługi Azure Cosmos DB w wersji 4.