Поделиться через


Устранение неполадок при использовании Azure Cosmos DB Python SDK с API для учетных записей NoSQL

Это важно

В этой статье описывается устранение неполадок только пакета SDK для Python для Azure Cosmos DB. Дополнительные сведения см. в Readme, заметках о выпуске SDK Azure Cosmos DB для Python, на странице пакета (PyPI), пакета (Conda) и советах по производительности.

В этой статье рассматриваются распространенные проблемы, обходные пути, этапы диагностики и инструменты при использовании Python SDK “Azure Cosmos DB” с учетными записями Azure Cosmos DB для NoSQL. Пакет SDK для Python для Azure Cosmos DB предоставляет логическое представление на стороне клиента для доступа к Azure Cosmos DB для NoSQL. В этой статье описываются средства и подходы, которые помогут вам, если вы столкнетесь с проблемами.

Начните со следующего списка:

Ведение журнала и запись диагностики

Это важно

Рекомендуется использовать последнюю версию пакета SDK для Python. Журнал выпусков можно проверить здесь

Эта библиотека использует стандартную библиотеку ведения журнала для диагностики ведения журнала. Основные сведения о сеансах HTTP (URL-адресах, заголовках и т. д.) регистрируются на уровне INFO.

Подробное логирование уровня отладки, включая содержимое запросов и ответов и нередактированные заголовки, можно активировать на клиенте с помощью аргумента logging_enable:

import sys
import logging
from azure.cosmos import CosmosClient

# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

# This client will log detailed information about its HTTP sessions, at DEBUG level
client = CosmosClient(URL, credential=KEY, logging_enable=True)

Аналогичным образом с помощью параметра logging_enable можно включить подробное журналирование для отдельной операции (даже если этот режим не включен в клиенте):

database = client.create_database(DATABASE_NAME, logging_enable=True)

Кроме того, вы можете вести журнал с помощью функции CosmosHttpLoggingPolicy, которая является расширением ядра HttpLoggingPolicy Azure, передавая ваш логгер в качестве аргумента logger. По умолчанию оно будет использовать поведение из HttpLoggingPolicy. Передача аргумента enable_diagnostics_logging будет включать CosmosHttpLoggingPolicy и предоставлять дополнительные сведения в ответе, относящиеся к отладке проблем Cosmos.

import logging
from azure.cosmos import CosmosClient

#Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a file output
handler = logging.FileHandler(filename="azure")
logger.addHandler(handler)

# This client will log diagnostic information from the HTTP session by using the CosmosHttpLoggingPolicy.
# Since we passed in the logger to the client, it will log information on every request.
client = CosmosClient(URL, credential=KEY, logger=logger, enable_diagnostics_logging=True)

Аналогичным образом, журналирование можно включить для одной операции, передав его в отдельный запрос. Однако если вы хотите использовать CosmosHttpLoggingPolicy для получения дополнительной информации, аргумент enable_diagnostics_logging необходимо передать в конструкторе клиента.

# This example enables the `CosmosHttpLoggingPolicy` and uses it with the `logger` passed in to the `create_database` request.
client = CosmosClient(URL, credential=KEY, enable_diagnostics_logging=True)
database = client.create_database(DATABASE_NAME, logger=logger)

Повторная попытка разработки

Ознакомьтесь с нашим руководством по проектированию устойчивых приложений с помощью SDK для Azure Cosmos DB, чтобы узнать, как проектировать устойчивые приложения и понять, какие повторные попытки поддерживаются SDK.

Распространенные проблемы и обходные решения для них

Общие рекомендации

Обеспечить наилучшую производительность можно так.

  • Убедитесь, что приложение запущено в том же регионе, что и учетная запись Azure Cosmos DB.
  • Проверьте использование ЦП на узле, где работает приложение. Если загрузка ЦП составляет 50 процентов или больше, запустите приложение на узле с более высокой конфигурацией. Кроме того, вы можете распределить нагрузку на другие компьютеры.

Проверка метрик портала

Проверка метрик портала поможет определить, связана ли проблема с клиентом или со службой. Например, если метрики содержат много запросов подряд с кодом состояния HTTP 429 (ограничение количества), значит, к запросам применяется регулирование. В этом случае просмотрите сведения в разделе Слишком высокая частота запросов.

Регулирование подключений

Регулирование подключений может произойти из-за [ограничения подключения на хост-компьютере] или [исчерпания портов SNAT (PAT) Azure].

Ограничение подключения на хост-компьютере

Некоторые системы Linux, такие как Red Hat, имеют верхний предел общего количества открытых файлов. Сокеты в Linux реализованы в виде файлов, поэтому это число также ограничивает общее количество подключений. Выполните следующую команду.

ulimit -a

Максимально допустимое количество разрешенных открытых файлов, которые определяются как "nofile", должно быть по крайней мере в два раза больше размера пула подключений. Дополнительные сведения см. в советах по производительности пакета SDK для Python для Azure Cosmos DB.

Исчерпание портов SNAT (PAT) Azure

Если приложение развернуто на виртуальных машинах Azure без общедоступного IP-адреса, по умолчанию порты SNAT Azure устанавливают подключения к любой конечной точке за пределами виртуальной машины. Количество разрешенных подключений от виртуальной машины к конечной точке Azure Cosmos DB ограничивается конфигурацией Azure SNAT.

Порты SNAT Azure используются только в том случае, если у виртуальной машины есть частный IP-адрес, а процесс из виртуальной машины пытается подключиться к общедоступному IP-адресу. Существует два обходных решения, чтобы избежать ограничения SNAT Azure:

  • Добавьте конечную точку службы Azure Cosmos DB к подсети виртуальной сети для службы "Виртуальные машины Azure". Дополнительные сведения см. в статье Конечные точки служб для виртуальной сети Azure.

    При включении конечной точки службы запросы больше не отправляются с общедоступного IP-адреса в Azure Cosmos DB. Вместо этого отправляются идентификаторы виртуальной сети и подсети. Это изменение может привести к сбою брандмауэра, если разрешены только общедоступные IP-адреса. Если вы используете брандмауэр, при включении конечной точки службы добавьте подсеть в брандмауэр с помощью ACL виртуальной сети.

  • Назначьте общедоступный IP-адрес виртуальной машине Azure.

Не удается связаться со службой — брандмауэр

azure.core.exceptions.ServiceRequestError: указывает, что пакет SDK не может связаться со службой. Следуйте ограничению подключения на хост-компьютере.

Сбой подключения к эмулятору Azure Cosmos DB

Сертификат HTTPS эмулятора Azure Cosmos DB самозаверяется. Чтобы пакет SDK Python работал с эмулятором, импортируйте сертификат эмулятора. Дополнительные сведения см. в статье "Экспорт сертификатов эмулятора Azure Cosmos DB".

Прокси-сервер HTTP

При использовании прокси-сервера HTTP убедитесь, что он может поддерживать число подключений, указанное в свойстве ConnectionPolicy пакета SDK. В противном случае возникнут проблемы с подключением.

Типичные проблемы с запросами

Метрики запроса помогут определить, на что запрос тратит больше всего времени. С помощью метрик запроса можно узнать, какая часть работы выполняется во внутренней службе, а какая в клиенте. Дополнительные сведения см. в руководстве по повышению производительности запросов.

Дальнейшие шаги