Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
В этой статье рассматривается управление уровнями согласованности в Azure Cosmos DB. Вы узнаете, как настроить уровень согласованности по умолчанию, а также как переопределить ее и управлять маркерами сеанса вручную. Кроме того, здесь приведены общие сведения о метрике вероятностного ограниченного устаревания (PBS).
При изменении согласованности на уровне учетной записи необходимо повторно развернуть приложения и внести необходимые изменения кода для применения этих изменений.
Примечание.
Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Чтобы начать работу, см. статью Установка Azure PowerShell. Чтобы узнать, как выполнить миграцию на модуль Az PowerShell, см. Перенос Azure PowerShell с AzureRM на Az.
Настройка уровня согласованности по умолчанию
Клиенты по умолчанию используют стандартный уровень согласованности.
Чтобы просмотреть или изменить уровень согласованности по умолчанию, войдите на портал Azure. Найдите учетную запись Azure Cosmos DB и откройте панель Согласованность по умолчанию. Выберите требуемый уровень согласованности в качестве нового значения по умолчанию, а затем выберите Сохранить. На портале Azure также представлена визуализация разных уровней согласованности на основе музыкальных нот.
Переопределение уровня согласованности по умолчанию
Служба задает уровень согласованности по умолчанию, но клиенты могут переопределить его. Уровень согласованности можно задать на каждый запрос, что позволяет переопределить уровень согласованности по умолчанию на уровне учетной записи.
Совет
Согласованность может быть ослаблена только на уровне экземпляра пакета SDK или запроса. Чтобы перейти от более слабой к более сильной согласованности, обновите согласованность по умолчанию для учетной записи Azure Cosmos DB.
Совет
Переопределение уровня согласованности по умолчанию применяется только к операциям чтения в клиенте SDK. Учетная запись, настроенная на строгую согласованность по умолчанию, по-прежнему будет записывать и реплицировать данные синхронно в каждый регион в учетной записи. Когда экземпляр клиента пакета SDK или запрос переопределяет уровень согласованности на уровне сеанса или более слабой согласованности, операции чтения выполняются с помощью одной реплики. Дополнительные сведения см. в разделе Уровни согласованности и пропускная способность.
Пакет SDK для .NET
// Override consistency at the client level
documentClient = new DocumentClient(new Uri(endpoint), authKey, connectionPolicy, ConsistencyLevel.Eventual);
// Override consistency at the request level via request options
RequestOptions requestOptions = new RequestOptions { ConsistencyLevel = ConsistencyLevel.Eventual };
var response = await client.ReadDocumentAsync(collectionUri, document, requestOptions);
Пакет SDK для Java версии 4
Асинхронный API пакета SDK для Java версии 4 (Maven com.azure::azure-cosmos)
CosmosAsyncClient client =
new CosmosClientBuilder()
.endpoint(HOST)
.key(MASTER_KEY)
.consistencyLevel(ConsistencyLevel.EVENTUAL)
.buildAsyncClient();
Пакеты средств разработки для Java версии 2
Асинхронный пакет средств разработки для Java версии 2 (maven com.microsoft.azure::azure-cosmosdb)
// Override consistency at the client level
ConnectionPolicy policy = new ConnectionPolicy();
AsyncDocumentClient client =
new AsyncDocumentClient.Builder()
.withMasterKey(this.accountKey)
.withServiceEndpoint(this.accountEndpoint)
.withConsistencyLevel(ConsistencyLevel.Eventual)
.withConnectionPolicy(policy).build();
Пакет SDK для Node.js, JavaScript и TypeScript
// Override consistency at the client level
const client = new CosmosClient({
/* other config... */
consistencyLevel: ConsistencyLevel.Eventual
});
// Override consistency at the request level via request options
const { body } = await item.read({ consistencyLevel: ConsistencyLevel.Eventual });
Пакет SDK для Python
# Override consistency at the client level
connection_policy = documents.ConnectionPolicy()
client = cosmos_client.CosmosClient(self.account_endpoint, {
'masterKey': self.account_key}, connection_policy, documents.ConsistencyLevel.Eventual)
Пакет SDK для GO
Определите уровень согласованности в запросе:
container, _ := c.NewContainer("moviesdb", "movies")
container.NewQueryItemsPager("select * from c", azcosmos.NewPartitionKey(), &azcosmos.QueryOptions{
ConsistencyLevel: azcosmos.ConsistencyLevelEventual.ToPtr(),
})
container.ReadItem(context.Background(), azcosmos.NewPartitionKeyString("Quentin Tarantino"), "Pulp Fiction", &azcosmos.ItemOptions{
ConsistencyLevel: azcosmos.ConsistencyLevelStrong.ToPtr(),
})
Используйте маркеры сеанса
Один из этих уровней согласованности в Azure Cosmos DB — согласованность сеансов. Этот уровень по умолчанию применяется к учетным записям Azure Cosmos DB по умолчанию. При работе с сеансовой согласованностью каждому новому запросу на запись в Azure Cosmos DB присваивается новый сеансовый токен. CosmosClient использует этот токен при каждом запросе на чтение или выборку, чтобы обеспечить поддержание задаваемого уровня согласованности.
В некоторых сценариях необходимо самостоятельно управлять этим сеансом. Рассмотрим веб-приложение с несколькими узлами, каждый узел имеет собственный экземпляр CosmosClient. Если вы хотите, чтобы эти узлы участвовали в той же сессии (чтобы иметь возможность последовательно читать собственные записи на всех уровнях веб-приложения), вам придется отправить SessionToken из FeedResponse<T> действия записи пользователю с помощью файла cookie или другого механизма, и обеспечить, чтобы этот маркер вернулся на веб-уровень и в конечном итоге достиг CosmosClient для последующих операций чтения. Если вы используете балансировщик нагрузки с циклическим распределением запросов, который не сохраняет привязку сессии между запросами, например, Azure Load Balancer, чтение может потенциально выполняться на другом узле, чем запись, где была создана сессия.
Если вы не передаете маркер сеанса Azure Cosmos DB, как описано выше, вы можете в конечном итоге получить временно неоднородные результаты чтения.
Маркеры сеансов в Azure Cosmos DB связаны с партицией, то есть они связаны исключительно с одной партицией. Чтобы обеспечить возможность чтения ваших записей, используйте последний сгенерированный маркер сеанса для соответствующих элементов. Чтобы управлять токенами сеанса вручную, получите токен сеанса из ответа и установите их для каждого запроса. Если у вас нет необходимости управлять токенами сеанса вручную, то вам не нужно использовать эти примеры. Пакет SDK отслеживает токены сеанса автоматически. Если токен сеанса не задан вручную, по умолчанию в пакете SDK используется последний.
Пакет SDK для .NET
var response = await client.ReadDocumentAsync(
UriFactory.CreateDocumentUri(databaseName, collectionName, "SalesOrder1"));
string sessionToken = response.SessionToken;
RequestOptions options = new RequestOptions();
options.SessionToken = sessionToken;
var response = await client.ReadDocumentAsync(
UriFactory.CreateDocumentUri(databaseName, collectionName, "SalesOrder1"), options);
Пакет SDK для Java версии 4
Асинхронный API пакета SDK для Java версии 4 (Maven com.azure::azure-cosmos)
// Get session token from response
CosmosItemResponse<JsonNode> response = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class).block();
String sessionToken = response.getSessionToken();
// Resume the session by setting the session token on the RequestOptions
CosmosItemRequestOptions options = new CosmosItemRequestOptions();
options.setSessionToken(sessionToken);
CosmosItemResponse<JsonNode> response2 = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class).block();
Пакеты средств разработки для Java версии 2
Асинхронный пакет средств разработки для Java версии 2 (maven com.microsoft.azure::azure-cosmosdb)
// Get session token from response
RequestOptions options = new RequestOptions();
options.setPartitionKey(new PartitionKey(document.get("mypk")));
Observable<ResourceResponse<Document>> readObservable = client.readDocument(document.getSelfLink(), options);
readObservable.single() // we know there will be one response
.subscribe(
documentResourceResponse -> {
System.out.println(documentResourceResponse.getSessionToken());
},
error -> {
System.err.println("an error happened: " + error.getMessage());
});
// Resume the session by setting the session token on RequestOptions
RequestOptions options = new RequestOptions();
requestOptions.setSessionToken(sessionToken);
Observable<ResourceResponse<Document>> readObservable = client.readDocument(document.getSelfLink(), options);
Пакет SDK для Node.js, JavaScript и TypeScript
// Get session token from response
const { headers, item } = await container.items.create({ id: "meaningful-id" });
const sessionToken = headers["x-ms-session-token"];
// Immediately or later, you can use that sessionToken from the header to resume that session.
const { body } = await item.read({ sessionToken });
Пакет SDK для Python
// Get the session token from the last response headers
item = client.ReadItem(item_link)
session_token = client.last_response_headers["x-ms-session-token"]
// Resume the session by setting the session token on the options for the request
options = {
"sessionToken": session_token
}
item = client.ReadItem(doc_link, options)
Пакет SDK для GO
// Get the session token from the create item response
resp, _ := container.CreateItem(context.Background(), azcosmos.NewPartitionKeyString("Quentin Tarantino"), movie, &azcosmos.ItemOptions{
ConsistencyLevel: azcosmos.ConsistencyLevelSession.ToPtr(),
})
// Use the session token to read the item
container.ReadItem(context.Background(), azcosmos.NewPartitionKeyString("Quentin Tarantino"), movieId, &azcosmos.ItemOptions{
SessionToken: resp.SessionToken,
})
Мониторинг метрики вероятностного ограниченного устаревания (PBS)
Насколько итоговая согласованность является итоговой? В среднем варианте мы можем предложить пределы устаревания в отношении истории версий и времени. Метрика Probabilistically Bounded Staleness (PBS) (Вероятностное ограниченное устаревание) пытается количественно оценить вероятность устаревания и отображает полученные результаты.
Чтобы просмотреть метрики PBS, перейдите к учетной записи Azure Cosmos DB на портале Azure. Откройте панель метрик (классическая модель) и перейдите на вкладку "Согласованность". Просмотрите граф с именем "Вероятность строго согласованных операций чтения" на основе рабочей нагрузки (см. раздел PBS).
Следующие шаги
Узнайте больше о том, как управлять конфликтами данных, или перейдите к следующей ключевой концепции в Azure Cosmos DB. См. следующие статьи:
- Настраиваемые уровни согласованности данных в Azure Cosmos DB
- Секционирование и масштабирование в Azure Cosmos DB
- Управление конфликтами между регионами
- Секционирование и масштабирование в Azure Cosmos DB
- Consistency Tradeoffs in Modern Distributed Database Systems Design (Достижение компромиссов согласованности в современных распределенных базах данных)
- Высокая доступность
- Соглашение об уровне обслуживания для Azure Cosmos DB