共用方式為


針對 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 驅動程式 3Java 驅動程式 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);

下一步