你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在使用 Azure Cosmos DB 的应用程序配置多区域写入

适用范围: NoSQL

在多区域写入方案中,可以通过仅写入靠近应用程序实例的区域来获得性能优势。 Azure Cosmos DB 将在后台处理复制。

为多个写入区域启用帐户后,必须在应用程序中对 ConnectionPolicy 进行两次更改。 在 ConnectionPolicy 内,将 UseMultipleWriteLocations 设置为 true,并传递从中将应用程序部署到 ApplicationRegion 的区域的名称。 此操作将根据传入位置的地理邻近度填充 PreferredLocations 属性。 如果以后将新区域添加到帐户,则无需更新或重新部署应用程序。 如果发生区域事件,则它会自动检测更靠近的区域,并自动返回该区域。

注意

最初配置有单个写入区域的 Azure Cosmos DB 帐户可以配置为多个写入区域且停机时间为零。 若要了解详细信息,请参阅配置多个写入区域

Azure 门户

若要使用多区域写入,请使用 Azure 门户为多个区域启用 Azure Cosmos DB 帐户。 指定应用程序可以写入的区域。

若要启用多区域写入,请执行以下步骤:

  1. 登录到 Azure 门户

  2. 导航到 Azure Cosmos DB 帐户,然后从菜单中打开“全局复制数据”窗格。

  3. 在“多区域写入”选项下,选择“启用”。 它会自动将现有区域添加到读取和写入区域。

  4. 可以通过选择地图上的图标或选择“添加区域”按钮来添加更多区域。 你添加的所有区域都会启用读取和写入功能。

  5. 更新区域列表后,请选择“保存”以应用所做的更改。

    使用 Azure 门户启用多区域写入的屏幕截图。

.NET SDK v2

若要在应用程序中启用多区域写入,请将 UseMultipleWriteLocations 设置为 true。 此外,将 SetCurrentLocation 设置为在其中部署应用程序并复制 Azure Cosmos DB 的区域:

ConnectionPolicy policy = new ConnectionPolicy
    {
        ConnectionMode = ConnectionMode.Direct,
        ConnectionProtocol = Protocol.Tcp,
        UseMultipleWriteLocations = true
    };
policy.SetCurrentLocation("West US 2");

.NET SDK v3

若要在应用程序中启用多区域写入,请将 ApplicationRegion 设置为在其中部署应用程序并复制 Azure Cosmos DB 的区域:

CosmosClient cosmosClient = new CosmosClient(
    "<connection-string-from-portal>", 
    new CosmosClientOptions()
    {
        ApplicationRegion = Regions.WestUS2,
    });

(可选)可以使用 CosmosClientBuilderWithApplicationRegion 来获得相同的结果:

CosmosClientBuilder cosmosClientBuilder = new CosmosClientBuilder("<connection-string-from-portal>")
            .WithApplicationRegion(Regions.WestUS2);
CosmosClient client = cosmosClientBuilder.Build();

Java V4 SDK

若要在应用程序中启用多区域写入,请在客户端生成器中调用 .multipleWriteRegionsEnabled(true).preferredRegions(preferredRegions),其中 preferredRegions 是数据所复制到的区域的 List,这些区域按偏好排序 - 理想情况下,距离最短/延迟最短的区域优先:

Java SDK V4 (Maven com.azure::azure-cosmos) 异步 API:


ArrayList<String> preferredRegions = new ArrayList<String>();
preferredRegions.add(region);

CosmosAsyncClient client =
        new CosmosClientBuilder()
                .endpoint(HOST)
                .key(MASTER_KEY)
                .multipleWriteRegionsEnabled(true)
                .preferredRegions(preferredRegions)
                .buildAsyncClient();

Async Java V2 SDK

Java V2 SDK 使用 Maven com.microsoft.azure::azure-cosmosdb。 若要在应用程序中启用多区域写入,请设置 policy.setUsingMultipleWriteLocations(true),并将 policy.setPreferredLocations 设置为数据所复制到的区域的 List,这些区域按偏好排序 - 理想情况下,距离最短/延迟最短的区域优先:

ConnectionPolicy policy = new ConnectionPolicy();
policy.setUsingMultipleWriteLocations(true);
policy.setPreferredLocations(Collections.singletonList(region));

AsyncDocumentClient client =
    new AsyncDocumentClient.Builder()
        .withMasterKeyOrResourceToken(this.accountKey)
        .withServiceEndpoint(this.accountEndpoint)
        .withConsistencyLevel(ConsistencyLevel.Eventual)
        .withConnectionPolicy(policy).build();

Node.js、JavaScript 和 TypeScript SDK

若要在应用程序中启用多区域写入,请将 connectionPolicy.UseMultipleWriteLocations 设置为 true。 此外,将 connectionPolicy.PreferredLocations 设置为数据所复制到的区域,这些区域按偏好排序 - 理想情况下,距离最短/延迟最短的区域优先:

const connectionPolicy: ConnectionPolicy = new ConnectionPolicy();
connectionPolicy.UseMultipleWriteLocations = true;
connectionPolicy.PreferredLocations = [region];

const client = new CosmosClient({
  endpoint: config.endpoint,
  auth: { masterKey: config.key },
  connectionPolicy,
  consistencyLevel: ConsistencyLevel.Eventual
});

Python SDK

若要在应用程序中启用多区域写入,请将 connection_policy.UseMultipleWriteLocations 设置为 true。 此外,将 connection_policy.PreferredLocations 设置为数据所复制到的区域,这些区域按偏好排序 - 理想情况下,距离最短/延迟最短的区域优先。

connection_policy = documents.ConnectionPolicy()
connection_policy.UseMultipleWriteLocations = True
connection_policy.PreferredLocations = [region]

client = cosmos_client.CosmosClient(self.account_endpoint, {
                                    'masterKey': self.account_key}, connection_policy, documents.ConsistencyLevel.Session)

后续步骤