Бөлісу құралы:


Устранение неполадок, связанных с NoHostAvailableException и NoNodeAvailableException

Исключение NoHostAvailableException — это исключение оболочки верхнего уровня со множеством возможных причин и внутренними исключениями, многие из которых могут быть связаны с клиентом. Это исключение обычно возникает при наличии проблем с кластером, проблем с параметрами подключения или при недоступности одного или нескольких узлов Cassandra.

В этой статье рассмотрены возможные причины этого исключения, а также предоставлены конкретные сведения об используемом клиентском драйвере.

Параметры драйвера

Одна из самых распространенных причин исключения NoHostAvailableException — параметры драйвера по умолчанию. Рекомендуем использовать параметры, указанные в конце этой статьи. Вот некоторые пояснительные сведения:

  • По умолчанию для каждого хоста задается значение 1, которое не рекомендуется использовать для Azure Cosmos DB. Рекомендуется использовать значение не меньше 10. Несмотря на то, что предоставляются дополнительные агрегатные единицы запроса (ЕЗ), увеличьте число подключений. В общем случае рекомендуется использовать 10 подключений на 200 тысяч ЕЗ.
  • Используйте политику повтора 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)')

Рекомендация

Вместо настройки max requests per connection убедитесь, что connections per host имеет значение не менее 10. См. раздел с примером кода.

TooManyRequest(429)

Исключение OverloadException возникает при превышении частоты запросов, которое может возникнуть, если для таблицы подготовлена недостаточная пропускная способность и превышен бюджет ЕЗ. См. дополнительные сведения о крупных запросах и о том, как повторить попытку на стороне сервера.

Рекомендация

Воспользуйтесь одним один из следующих вариантов:

  • Если регулирование возникает постоянно, увеличьте число подготовленных ЕЗ.
  • Если регулирование возникает периодически, используйте политику повтора Cosmos Azure 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

Рекомендация

Используйте CosmosLoadBalancingPolicy в драйвере Java версии 3 и драйвере Java версии 4. Эта политика использует точку контакта основного региона записи, в котором указанные локальные данные недоступны.

Примечание.

Если предыдущие рекомендации не помогли устранить проблему, обратитесь в службу поддержки Azure Cosmos DB. Укажите следующие сведения: сообщение об исключении, стек исключений, журнал драйвера datastax, универсальное время сбоя, согласованные или периодические сбои, сбой в пространство ключей и таблице, тип запроса, при котором произошел сбой, и версия пакета 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# версии 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);

Следующие шаги