針對 NoHostAvailableException 和 NoNodeAvailableException 進行疑難排解
NoHostAvailableException 是最上層的包裝函式例外狀況,有許多可能的原因和內部例外狀況,其中有許多原因都與用戶端相關。 如果叢集或連線設定發生一些問題,或如果有一或多個 Cassandra 節點無法使用,就會發生此例外狀況。
本文探討此例外狀況的可能原因,並討論所使用用戶端驅動程式的特定詳細資料。
驅動程式設定
NoHostAvailableException 的其中一個最常見原因是預設驅動程式設定。 建議您使用本文結尾所列的設定。 以下是一些說明資訊:
- 每部主機的連線預設值為 1,我們針對 Azure Cosmos DB 不建議此值。 建議的最小值為 10。 雖然提供了更多的彙總要求單位 (RU),但是請增加連線計數。 一般指導方針為每 20 萬個 RU 有 10 個連線。
- 使用 Azure Cosmos DB 重試原則來處理間歇性節流回應。 如需詳細資訊,請參閱 Azure Cosmos DB 延伸模組程式庫:
- 針對多區域帳戶,請使用延伸模組中的 Azure Cosmos DB 負載平衡原則。
- 讀取要求逾時應設定為大於 1 分鐘。 建議使用 90 秒。
例外狀況訊息
如果在您進行建議的變更之後,例外狀況仍然存在,請參閱接下來三個章節中的例外狀況訊息。 如果您的錯誤記錄檔包含這裡的任何例外狀況訊息,請遵循該例外狀況的建議。
BusyPoolException
此用戶端錯誤表示已達到主機的要求連線數目上限。 如果您無法從佇列中移除要求,您可能會看到此錯誤。 如果每部主機的連線已設定為最小值 10,則可能是因為伺服器端延遲很高所造成的例外狀況。
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)')
建議
請確定 connections per host
至少設定為 10,而不是微調 max requests per connection
。 請參閱程式碼範例一節。
TooManyRequest(429)
當要求速率太大時,就會擲回 OverloadException,而當您為資料表佈建的輸送量不足,而且超過 RU 預算時,就會發生這種情況。 如需詳細資訊,請參閱大型要求和伺服器端重試。
建議
套用下列其中一個選項:
- 如果節流持續發生,請增加佈建的 RU。
- 如果節流是間歇性的,請使用 Azure Cosmos DB 重試原則。
- 如果無法參考延伸模組程式庫,請啟用伺服器端重試。
所有嘗試查詢的主機都失敗
當用戶端設定為連線到主要連絡點區域以外的區域時,在一開始的幾秒鐘內,您將會收到下列其中一個例外狀況訊息:
針對 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)
針對 Java 驅動程式 4:
No node was available to execute the query
針對 C# 驅動程式 3:
System.ArgumentException: Datacenter West US does not match any of the nodes, available datacenters: West US 2
建議
在 Java 驅動程式 3 和 Java 驅動程式 4 中使用 CosmosLoadBalancingPolicy。 這項原則會回復至主要寫入區域的連絡點,指出無法使用指定的本機資料。
注意
如果上述建議無法協助您解決問題,請連絡 Azure Cosmos DB 支援。 請務必提供下列詳細資料:例外狀況訊息、例外狀況堆疊追蹤、datastax 驅動程式記錄檔、失敗的國際標準時間、一致或間歇性失敗、失敗的 keyspace 和資料表、失敗的要求類型和 SDK 版本。
程式碼範例
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();
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();
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);
下一步
- 若要了解各種錯誤碼及其意義,請參閱伺服器端診斷。
- 請參閱針對 Azure Cosmos DB .NET SDK 的問題進行診斷和疑難排解。
- 了解 .NET v3 和 .NET v2 的效能指導方針。
- 請參閱針對使用 Azure Cosmos DB Java SDK v4 搭配適用於 NoSQL 的 API 帳戶時的問題進行疑難排解。
- 請參閱 Azure Cosmos DB Java SDK v4 的效能秘訣。