适用对象:
卡珊德拉
重要
你是否正在寻找一种数据库解决方案,以应对需要高扩展性、99.999% 可用性服务级别协议(SLA)、即时自动扩展和跨多个区域的自动故障转移的场景? 请考虑使用 Azure Cosmos DB for NoSQL。
Azure Cosmos DB for Apache Cassandra 提供了各种弹性缩放选项。 若要了解如何在Azure Cosmos DB中有效缩放,需要了解如何预配正确的请求单位量(RU/秒)。 若要了解请求单位的详细信息,请参阅请求单位一文。
对于 Cassandra 的 API,可以使用 .NET 和 Java SDK 检索单个查询的请求单位费用。 这些信息可帮助你确定需要在该服务中预配多少 RU/s。
处理速率限制(429 错误)
如果客户端消耗的资源数(RU/s)多于预配的量,则Azure Cosmos DB返回速率限制(429)错误。 Azure Cosmos DB 中的 API for Cassandra 在 Cassandra 本机协议中将这些异常解释为过载错误。
如果系统对延迟不敏感,则使用重试处理吞吐量速率限制可能已经足够了。 查看 Apache Cassandra Java 驱动程序的版本 3 和版本 4 的 Java 代码示例,了解如何以透明方式处理速率限制。 这些示例在 Java 中实现默认 Cassandra 重试策略的自定义版本。 还可以使用 Spark 扩展来处理速率限制。 使用 Spark 时,请确保遵循有关优化 Spark 连接器吞吐量配置的指南。
管理缩放
如果需要最大程度地减少延迟,可以使用各种选项来管理 Cassandra API 中的缩放和预配吞吐量(RU):
下面的几节介绍了这些方法的优缺点。 然后,可以确定最佳的策略,以便在系统的缩放需求、整体成本以及解决方案的效率需求之间做出平衡。
使用 Azure 门户
可以使用 Azure 门户在 Apache Cassandra 帐户的 Azure Cosmos DB 中缩放资源。 若要了解详细信息,请参阅 在容器和数据库上预配吞吐量。 此文解释了通过 Azure 门户在数据库或容器级别设置吞吐量的相对优势。 这些文章中提到的术语“数据库”和“容器”分别对应于 Cassandra API 的“密钥空间”和“表”。
此方法的优点是,它是管理数据库吞吐量容量的简单通关方法。 但是,缺点是,在许多情况下,你的扩展方案可能需要一定程度的自动化,才能同时做到成本效益高和高性能。 后续部分将介绍相关的方案和方法。
使用控制平面
适用于 Cassandra 的 Azure Cosmos DB API 提供了使用各种控制平面功能以编程方式调整吞吐量的功能。 有关指南和示例,请参阅 Azure 资源管理器、PowerShell 和Azure CLI文章。
此方法的优点是可以根据计时器自动扩展或缩减资源,以反映活动的高峰或低活动期。 若要了解如何使用 Azure Functions 和 PowerShell 完成此操作,请参阅有关GitHub的示例。
这种方法的一个缺点可能在于,你无法实时响应不可预测且不断变化的扩缩容需求。 而是,您可能需要在系统中、客户端/SDK 层面,或借助 Autoscale 使用应用程序上下文。
将 CQL 查询与特定的 SDK 配合使用
可以针对给定的数据库或容器执行 CQL ALTER 命令,通过代码动态缩放系统。
此方法的优点在于,能够以适合应用程序的自定义方式动态应对缩放需求。 使用此方法时,仍可使用标准 RU/s 费用和费率。 如果系统的缩放需求大多是可预测的(大约 70% 或更多),则将 SDK 与 CQL 配合使用可能是比使用自动缩放更具成本效益的自动缩放方法。 此方法的缺点是实现重试可能相当复杂,而速率限制可能会增加延迟。
使用可自动缩放的预配置吞吐量
除了通过标准(手动)或编程方式预配吞吐量之外,还可以将 Azure Cosmos DB 容器配置为使用自动缩放预配吞吐量。 自动缩放并即时缩放到指定 RU 范围内的消耗需求,而不会影响 SLA。 若要了解详细信息,请参阅在自动缩放中创建Azure Cosmos DB容器和数据库。
此方法的优点是,这是管理系统中缩放需求的最简单方法。 它不会在 配置的 RU 范围内应用速率限制。 缺点在于,如果系统中的扩展需求是可预测的,那么与使用前面提到的定制控制平面或 SDK 级方法相比,自动缩放可能并不是一种更具成本效益的满足这些扩展需求的方式。
若要使用 CQL 设置或更改自动缩放的最大吞吐量(RU),请使用以下代码。 将键空间和表名替换为相应的值。
# to set max throughput (RUs) for autoscale at keyspace level:
create keyspace <keyspace name> WITH cosmosdb_autoscale_max_throughput=5000;
# to alter max throughput (RUs) for autoscale at keyspace level:
alter keyspace <keyspace name> WITH cosmosdb_autoscale_max_throughput=4000;
# to set max throughput (RUs) for autoscale at table level:
create table <keyspace name>.<table name> (pk int PRIMARY KEY, ck int) WITH cosmosdb_autoscale_max_throughput=5000;
# to alter max throughput (RUs) for autoscale at table level:
alter table <keyspace name>.<table name> WITH cosmosdb_autoscale_max_throughput=4000;
后续步骤
- 开始使用 Java 应用程序创建用于 Cassandra 帐户、数据库和表的 API。