现在,可以选择的数据库类型比以往任何时候都要多,以满足您的数据工作负载。 选择数据库的关键因素之一是数据库或服务的性能,但基准测试性能可能比较繁琐且容易出错。
Azure 数据库的基准测试框架简化了使用常用开源基准测试工具来衡量性能的过程,这些工具采用低摩擦方案来实现常见最佳做法。 在 Azure Cosmos DB for NoSQL 中,框架实现 Java SDK 的最佳做法 ,并使用开源 YCSB 工具。 在本指南中,你将使用此基准测试框架来实现读取工作负载,以熟悉该框架。
先决条件
创建 Azure Cosmos DB 帐户资源
首先,在现有的 NoSQL 帐户 API 中创建数据库和容器。
在 Azure 门户中导航到现有的 NoSQL API 帐户。
在资源菜单中,选择“数据资源管理器”。
在 “数据资源管理器” 页上,在命令栏中选择 “新建容器 ”选项。
在“ 新建容器 ”对话框中,使用以下设置创建新容器:
| 设置 |
价值 |
|
数据库 ID |
ycsb |
|
数据库吞吐量类型 |
手动 |
|
数据库吞吐量 |
400 |
|
容器 ID |
usertable |
|
分区键 |
/id |
如果尚未登录,请使用 az login 命令登录到 Azure CLI。
为以下值创建 shell 变量:
- 现有的 Azure Cosmos DB for NoSQL 帐户的名称为
cosmosAccountName。
- 第一个包含名为
sourceResourceGroupName的资源的资源组名称。
- 第二个空资源组的名称为
targetResourceGroupName。
- 现有名为 NoSQL 的 Azure Cosmos DB 帐户终结点 URI
cosmosEndpoint
- 名为
cosmosPrimaryKey的现有 Azure Cosmos DB NoSQL 帐户主密钥
# Variable for Azure Cosmos DB for NoSQL account name
cosmosAccountName="<cosmos-db-nosql-account-name>"
# Variable for resource group with Azure Cosmos DB and Azure Storage accounts
sourceResourceGroupName="<first-resource-group-name>"
# Variable for empty resource group
targetResourceGroupName="<second-resource-group-name>"
# Variable for API for NoSQL endpoint URI
cosmosEndpoint="<cosmos-db-nosql-endpoint-uri>"
# Variable for API for NoSQL primary key
cosmosPrimaryKey="<cosmos-db-nosql-primary-key>"
# Variable for Azure Storage account name
storageAccountName="<storage-account-name>"
# Variable for storage account connection string
storageConnectionString="<storage-connection-string>"
az cosmosdb sql database create使用此命令,使用以下设置创建新数据库:
| 设置 |
价值 |
|
数据库 ID |
ycsb |
|
数据库吞吐量类型 |
手动 |
|
数据库吞吐量 |
400 |
az cosmosdb sql database create \
--resource-group $sourceResourceGroupName \
--account-name $cosmosAccountName \
--name "ycsb" \
--throughput 400
az cosmosdb sql container create使用命令,使用以下设置创建新容器:
| 设置 |
价值 |
|
数据库 ID |
ycsb |
|
容器 ID |
usertable |
|
分区键 |
/id |
az cosmosdb sql container create \
--resource-group $sourceResourceGroupName \
--account-name $cosmosAccountName \
--database-name "ycsb" \
--name "usertable" \
--partition-key-path "/id"
将基准测试框架部署到 Azure
现在,使用 Azure 资源管理器模板 使用默认读取方案将基准测试框架部署到 Azure。
使用此链接中提供的 Azure 资源管理器模板部署基准框架。
在“自定义部署”页面上,以下参数
选择 “查看 + 创建 ”,然后选择 “创建” 以部署模板。
等待部署完成。
使用 az deployment group create 部署基准框架,采用 Azure 资源管理器模板。
# Variable for raw template JSON on GitHub
templateUri="https://raw.githubusercontent.com/Azure/azure-db-benchmarking/main/cosmos/sql/tools/java/ycsb/recipes/read/try-it-read/azuredeploy.json"
az deployment group create \
--resource-group $targetResourceGroupName \
--name "benchmarking-framework" \
--template-uri $templateUri \
--parameters \
adminPassword='P@ssw.rd' \
resultsStorageConnectionString=$storageConnectionString \
cosmosURI=$cosmosEndpoint \
cosmosKey=$cosmosPrimaryKey
等待部署完成。
查看基准的结果
现在,可以使用现有的 Azure 存储帐户来检查基准作业的状态并查看聚合结果。 状态使用存储表存储,结果使用 CSV 格式聚合到存储 Blob 中。
在 Azure 门户中导航到现有的 Azure 存储帐户。
导航到名为 ycsbbenchmarkingmetadata 的存储表,找到具有分区键的 ycsb_sql实体。
观察表实体的JobStatus字段。 最初,作业的状态是 Started,它在属性 JobStartTime 中包含时间戳,但在属性 JobFinishTime 中不包含。
等到作业的状态变为 Finished 并且 JobFinishTime 属性中包含时间戳。
小窍门
作业可能需要大约 20-30 分钟才能完成。
导航到同一帐户中的存储容器,其前缀为 ycsbbenchmarking-*。 观察该工具的输出和诊断数据块。
打开 aggregation.csv blob 并观察内容。 现在,应该有一个 CSV 数据集,其中包含来自所有基准客户端的聚合结果。
Operation,Count,Throughput,Min(microsecond),Max(microsecond),Avg(microsecond),P9S(microsecond),P99(microsecond)
READ,180000,299,706,448255,1079,1159,2867
使用 az storage entity query 查询名为 ycsbbenchmarkingmetadata 的存储表中作业记录。
az storage entity query \
--account-name $storageAccountName \
--connection-string $storageConnectionString \
--table-name ycsbbenchmarkingmetadata
观察此查询的结果。 结果应返回包含JobStartTime和JobStatusJobFinishTime属性的单个作业。 最初,作业的状态是 Started ,它包括 JobStartTime 属性中的时间戳,但不包括在 JobFinishTime 属性中。
{
"items": [
{
"JobFinishTime": "",
"JobStartTime": "2023-02-02T13:59:42Z",
"JobStatus": "Started",
"NoOfClientsCompleted": "0",
"NoOfClientsStarted": {
"edm_type": "Edm.Int64",
"value": 1
},
"PartitionKey": "ycsb_sql",
...
}
],
...
}
如有必要,请多次运行 az storage entity query,直到作业的状态为 Finished,并且在 JobFinishTime 属性中包含时间戳。
{
"items": [
{
"JobFinishTime": "2023-02-02T14:21:12Z",
"JobStartTime": "2023-02-02T13:59:42Z",
"JobStatus": "Finished",
...
}
],
...
}
小窍门
作业可能需要大约 20-30 分钟才能完成。
查找前缀为 ycsbbenchmarking-* 的最近修改的存储容器的名称,使用 az storage container list 和 JMESPath 查询。
az storage container list \
--account-name $storageAccountName \
--connection-string $storageConnectionString \
--query "sort_by([?starts_with(name, 'ycsbbenchmarking-')], &properties.lastModified)[-1].name" \
--output tsv
将容器字符串存储在名为 .. 的 storageConnectionString变量中。
storageContainerName=$( \
az storage container list \
--account-name $storageAccountName \
--connection-string $storageConnectionString \
--query "sort_by([?starts_with(name, 'ycsbbenchmarking-')], &properties.lastModified)[-1].name" \
--output tsv \
)
使用 [az storage blob query]/cli/azure/storage/blob#az-storage-blob-query)查询存储在以前所在容器中的存储 Blob 中的作业结果。
az storage blob query \
--account-name $storageAccountName \
--connection-string $storageConnectionString \
--container-name $storageContainerName \
--name aggregation.csv \
--query-expression "SELECT * FROM BlobStorage"
观察此查询的结果。 现在,应该有一个 CSV 数据集,其中包含来自所有基准客户端的聚合结果。
Operation,Count,Throughput,Min(microsecond),Max(microsecond),Avg(microsecond),P9S(microsecond),P99(microsecond)
READ,180000,299,706,448255,1079,1159,2867
食谱
Azure 数据库的基准测试框架包括封装传递到底层基准测试工具的工作负载定义的配置,以实现“一键”体验。 工作负荷定义是根据 Azure Cosmos DB 团队和基准测试工具团队发布的最佳做法设计的。 这些食谱已经过测试和验证,以获取一致的结果。
在 GitHub 存储库中,预计会看到所有读写操作的以下延迟。
读取延迟
写入延迟
常见问题
本部分包括运行基准测试工具时可能发生的常见错误。 该工具的错误日志通常在 Azure 存储帐户中的容器中可用。
如果存储帐户中没有日志,则此问题通常是由于存储连接字符串不正确或缺失所致。 在这种情况下,此错误列在客户端虚拟机的 /home/benchmarking 文件夹中的 agent.out 文件中。
Error while accessing storage account, exiting from this machine in agent.out on the VM
如果 Azure Cosmos DB 终结点 URI 不正确或无法访问,则此错误会列在 client VM 和存储帐户中的 agent.out 文件中。
Caused by: java.net.UnknownHostException: rtcosmosdbsss.documents.azure.com: Name or service not known
如果 Azure Cosmos DB 密钥不正确,则会在 client VM 和存储帐户的 agent.out 文件中列出此错误。
The input authorization token can't serve the request. The wrong key is being used….
后续步骤