如何使用 Cassandra API 将 Python 的 cosmos_client 连接到 Cosmos DB 实例?
How to connect Python's cosmos_client to Cosmos DB instance using Cassandra API?
我设置了一个 Cosmos DB (Cassandra API) 实例,我想通过 Python 应用程序管理它的吞吐量。我能够使用 Azure 中列出的 cassandra 端点和主密码创建 azure.cosmos.cosmos_client 而不会出现错误,但与客户端的所有尝试交互都会导致 "azure.cosmos.errors.HTTPFailure: Status code: 404"。
我已经在 Python 中通过 cassandra-driver 成功地与这个数据库交互,但我想访问 cosmos-client 以通过代码管理吞吐量配置。我想自动缩放吞吐量,因为数据库使用在高利用率和几乎没有 activity.
之间波动
创建 cosmos_client 需要包含架构(https/http/ftp 等...)的有效 URI。 azure 上列出的端点已成功用于通过 cqlsh 以及 Python cassandra-driver 进行连接,但未指定架构。
我将 "https://" 添加到提供的端点的开头,并且能够在 Python 中创建客户端("http://" 会导致错误,而且验证不正确的地址也会导致错误,即使 "https://").
现在我已经创建了一个客户端对象,我尝试与它进行任何交互都会出现 404 错误。
client = cosmos_client.CosmosClient(f'https://{COSMOS_CASSANDRA_ENDPOINT}', {'masterKey': COSMOS_CASSANDRA_PASSWORD} )
client.ReadEndpoint
#'https://COSMOS_CASSANDRA_ENDPOINT'
client.GetDatabaseAccount(COSMOS_CASSANDRA_ENDPOINT)
#azure.cosmos.errors.HTTPFailure: Status code: 404
client.ReadDatabase(EXISTING_KEYSPACE_NAME)
#azure.cosmos.errors.HTTPFailure: Status code: 404
我想知道使用 cosmos_client 是否是与 Cosmos Cassandra 实例交互以修改我的 Python 应用程序的吞吐量的正确方法。如果是这样,我应该如何正确设置 cosmos_client ?
也许有一种方法可以直接通过使用 cassandra-driver 修改数据库来做到这一点。
在尝试通过 Python 和 .NET 中的 CosmosClient 或 DocumentClient 访问数据库并失败后,我一直无法使它工作。最终,我发现了 2 种方法,不幸的是,每种方法都有些老套,并且提出了一些看似不必要的挑战。
我最终做的是通过调用 Azure CLI 的子进程来更改吞吐量来完成此操作。这是执行的命令:
f'az cosmosdb cassandra table throughput update --account-name {__cosmos_instance_name} --keyspace-name {__cassandra_keyspace} --name {table_name} --resource-group {__cosmos_resource_group} --throughput {new_throughput}'
我发现这两种方法都有效,但非常不幸的是,当目标数据库由于速率限制而受到限制时,这两种方法都不起作用。这意味着在调用代码执行缩放之前,我们还必须实施一些逻辑来限制我们自己的服务与数据库的交互。
关于我们的解决方案的一些其他注意事项:
该服务托管在 kubernetes 中,因此我们将指标评估和扩展执行添加到 pod 的生命周期挂钩中。当我们在处理 cassandra.cluster.NoHostAvailable 异常时在 cassandra 交互过程中遇到可疑的速率限制时,也会执行自动缩放器。
...
我可以通过代码设置预配置吞吐量的另一种方法是通过 cassandra-driver 直接执行 cql,方法是执行以下操作(在 Python 中):
from cassandra.cqlengine import connection
connection.setup(<CONNECTION_SETUP_ARGS>)
session = connection.get_session()
session.execute("use <CASSANDRA_NAMESPACE>")
session.execute("alter table <CASSANDRA_TABLE_NAME> with cosmosdb_provisioned_throughput=<DESIRED_THROUGHPUT>")
如果有机会,我会改用这种方法,因为它不需要 Azure CLI 安装和子进程调用。
我想这个想法最初来自 here。
我设置了一个 Cosmos DB (Cassandra API) 实例,我想通过 Python 应用程序管理它的吞吐量。我能够使用 Azure 中列出的 cassandra 端点和主密码创建 azure.cosmos.cosmos_client 而不会出现错误,但与客户端的所有尝试交互都会导致 "azure.cosmos.errors.HTTPFailure: Status code: 404"。
我已经在 Python 中通过 cassandra-driver 成功地与这个数据库交互,但我想访问 cosmos-client 以通过代码管理吞吐量配置。我想自动缩放吞吐量,因为数据库使用在高利用率和几乎没有 activity.
之间波动创建 cosmos_client 需要包含架构(https/http/ftp 等...)的有效 URI。 azure 上列出的端点已成功用于通过 cqlsh 以及 Python cassandra-driver 进行连接,但未指定架构。 我将 "https://" 添加到提供的端点的开头,并且能够在 Python 中创建客户端("http://" 会导致错误,而且验证不正确的地址也会导致错误,即使 "https://"). 现在我已经创建了一个客户端对象,我尝试与它进行任何交互都会出现 404 错误。
client = cosmos_client.CosmosClient(f'https://{COSMOS_CASSANDRA_ENDPOINT}', {'masterKey': COSMOS_CASSANDRA_PASSWORD} )
client.ReadEndpoint
#'https://COSMOS_CASSANDRA_ENDPOINT'
client.GetDatabaseAccount(COSMOS_CASSANDRA_ENDPOINT)
#azure.cosmos.errors.HTTPFailure: Status code: 404
client.ReadDatabase(EXISTING_KEYSPACE_NAME)
#azure.cosmos.errors.HTTPFailure: Status code: 404
我想知道使用 cosmos_client 是否是与 Cosmos Cassandra 实例交互以修改我的 Python 应用程序的吞吐量的正确方法。如果是这样,我应该如何正确设置 cosmos_client ? 也许有一种方法可以直接通过使用 cassandra-driver 修改数据库来做到这一点。
在尝试通过 Python 和 .NET 中的 CosmosClient 或 DocumentClient 访问数据库并失败后,我一直无法使它工作。最终,我发现了 2 种方法,不幸的是,每种方法都有些老套,并且提出了一些看似不必要的挑战。
我最终做的是通过调用 Azure CLI 的子进程来更改吞吐量来完成此操作。这是执行的命令:
f'az cosmosdb cassandra table throughput update --account-name {__cosmos_instance_name} --keyspace-name {__cassandra_keyspace} --name {table_name} --resource-group {__cosmos_resource_group} --throughput {new_throughput}'
我发现这两种方法都有效,但非常不幸的是,当目标数据库由于速率限制而受到限制时,这两种方法都不起作用。这意味着在调用代码执行缩放之前,我们还必须实施一些逻辑来限制我们自己的服务与数据库的交互。
关于我们的解决方案的一些其他注意事项: 该服务托管在 kubernetes 中,因此我们将指标评估和扩展执行添加到 pod 的生命周期挂钩中。当我们在处理 cassandra.cluster.NoHostAvailable 异常时在 cassandra 交互过程中遇到可疑的速率限制时,也会执行自动缩放器。
...
我可以通过代码设置预配置吞吐量的另一种方法是通过 cassandra-driver 直接执行 cql,方法是执行以下操作(在 Python 中):
from cassandra.cqlengine import connection
connection.setup(<CONNECTION_SETUP_ARGS>)
session = connection.get_session()
session.execute("use <CASSANDRA_NAMESPACE>")
session.execute("alter table <CASSANDRA_TABLE_NAME> with cosmosdb_provisioned_throughput=<DESIRED_THROUGHPUT>")
如果有机会,我会改用这种方法,因为它不需要 Azure CLI 安装和子进程调用。
我想这个想法最初来自 here。