次の方法で共有

诊断并排查多区域环境中的 Azure Cosmos DB SDK 的可用性问题

本文描述了当您遇到与特定区域的连接问题或发生区域故障转移时,最新版本的 Azure Cosmos DB SDK 的行为。

所有 Azure Cosmos DB SDK 都提供自定义区域首选项的选项。 不同 SDK 中使用以下属性:

当 SDK 使用指定区域首选项的配置进行初始化时,它将首先从多区域终结点获取帐户信息,包括可用区域。 然后,它将应用配置的区域首选项与账户的可用区域的交集,并按区域首选项中的顺序对结果进行优先级排序。

如果区域首选项配置包含帐户中没有可用区域的区域,将忽略这些值。 如果这些无效区域稍后添加到帐户,并且它们在首选项配置中具有更高的优先级,SDK 会使用它们。

科目类型 读取数 Writes
单个写入区域 具有最高顺序的首选区域 主要区域
多个写入区域 具有最高顺序的首选区域 具有最高顺序的首选区域

如果未 设置首选区域,SDK 客户端默认为主要区域:

科目类型 读取数 Writes
单个写入区域 主要区域 主要区域
多个写入区域 主要区域 主要区域

注释

主要区域是指 Azure Cosmos DB 帐户区域列表中的第一个区域。 如果指定为区域首选项的值与任何现有 Azure 区域不匹配,将忽略它们。 如果它们与现有区域匹配,但帐户未复制到该区域,则客户端将连接到下一个符合条件的首选区域或主要区域。

警告

本文档中所述的故障转移和可用性逻辑可以在客户端配置上禁用,除非用户应用程序将自行处理可用性错误,否则不建议这样做。 可以通过以下方式来实现此目的:

在正常情况下,SDK 客户端将连接到首选区域(如果设置了区域首选项)或主要区域(如果未设置首选项),除非出现以下任一情况,否则作将限制为该区域。

在这些情况下,使用 Azure Cosmos DB SDK 的客户端公开日志,并在 作诊断信息中包含重试信息:

  • .NET V2 SDK 中响应的 RequestDiagnosticsString 属性。
  • .NET V3 SDK 中响应和异常的 诊断 属性。
  • Java V4 SDK 中响应和异常的 getDiagnostics() 方法。

根据首选项顺序确定下一个区域时,SDK 客户端将使用帐户区域列表,将首选区域(如果有) 作为优先级。

有关这些事件期间 SLA 保证的全面详细信息,请参阅 SLA 的可用性

从帐户中删除区域

从 Azure Cosmos DB 帐户中删除区域时,主动使用该帐户的任何 SDK 客户端都将通过后端响应代码检测区域删除。 然后,客户端将区域终结点标记为不可用。 客户端重试当前操作,所有未来的操作将按首选顺序永久路由到下一个区域。 如果首选项列表只有一个条目(或为空),但该帐户具有其他可用区域,它将路由到帐户列表中的下一个区域。

将区域添加到帐户

Azure Cosmos DB SDK 客户端每隔 5 分钟读取一次帐户配置并刷新其感知的区域。

如果删除某个区域,然后将其添加回帐户,如果 SDK 配置中的区域首选项顺序高于当前连接区域,则 SDK 将切换回此区域以永久使用此区域。 检测到添加的区域后,所有将来的请求都会定向到该区域。

如果将客户端配置为最好连接到 Azure Cosmos DB 帐户没有的区域,则会忽略首选区域。 如果稍后添加该区域,客户端将检测到它,并将永久切换到该区域。

在单个写入区域帐户中故障转移写入区域

如果启动当前写入区域的故障转移,则下一个写入请求将失败并显示已知的后端响应。 检测到此响应后,客户端将查询帐户以了解新的写入区域,并继续重试当前作,并将所有将来的写入作永久路由到新区域。

区域中断

如果帐户是单个写入区域,并且在写入操作期间发生区域性中断,则行为类似于 手动故障转移。 对于读取请求或多个写入区域帐户,行为类似于 删除区域

会话一致性保证

使用 会话一致性时,客户端需要保证它可以读取自己的写入。 在仅有一个写入区域且读取区域偏好与写入区域不同的帐户中,用户可能会执行写入操作,然后再从本地读取数据。在这种情况下,由于光速限制,本地区域可能尚未接收到数据复制。 在这种情况下,SDK 在读取操作时从服务收到特定的失败,并在主要区域重试,以确保会话一致性。

TCP 协议上的暂时性连接问题

在将 Azure Cosmos DB SDK 客户端配置为使用 TCP 协议的给定请求的情况下,可能存在网络条件暂时影响与特定终结点的通信的情况。 这些临时网络条件可以显示为 TCP 超时和服务不可用(HTTP 503)错误。 如果可能,客户端将在本地同一终结点上 重试请求 一些秒。

如果用户配置了具有多个区域的首选区域列表,并且客户端用尽了所有本地重试次数,则可以尝试在首选项列表中的下一个区域中重试该操作。 仅当 Azure Cosmos DB 帐户启用了多个写入区域时,才能在其他区域中重试写入作,同时可以在任何可用区域中重试读取作。

后续步骤