你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
本文内容
与数据工作负载结合使用的数据库类型现在有比以往更多的选择。 选择数据库的关键因素之一是数据库或服务的性能,但基准测试性能可能很繁琐且容易出错。 适用于 Azure 数据库的基准测试框架 使用热门的开源基准测试工具简化了衡量性能的过程,这些工具具有实现常见最佳做法的低摩擦方案。 在 Azure Cosmos DB for NoSQL 中,该框架实现了 Java SDK 的最佳做法 ,并使用开源 YCSB 工具。 在本指南中,你会使用此基准测试框架以实现读取工作负载,从而熟悉该框架。
先决条件
创建 Azure Cosmos DB 帐户资源
首先,在现有的 API for NoSQL 帐户中创建数据库和容器。
在 Azure 门户 中导航到现有的 API for NoSQL 帐户。
在资源菜单中,选择“数据资源管理器”。
在“数据资源管理器”页上,选择命令栏中的“新建容器”选项。
在“新建容器”对话框中,使用以下设置创建新容器:
设置
值
数据库 ID
ycsb
数据库吞吐量类型
手动
数据库吞吐量
400
容器 ID
usertable
分区键
/id
如果尚未登录,请使用 az login
命令登录到 Azure CLI。
为以下值创建 shell 变量:
名为 cosmosAccountName
的现有 Azure Cosmos DB for NoSQL 帐户的名称。
第一个资源组的名称,其中包含名为 sourceResourceGroupName
的资源。
名为 targetResourceGroupName
的第二个空资源组的名称。
名为 cosmosEndpoint
的现有 Azure Cosmos DB for NoSQL 帐户终结点 URI
名为 cosmosPrimaryKey
的现有 Azure Cosmos DB for 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
属性中包含时间戳。
导航到同一帐户中前缀为 ycsbbenchmarking- *的存储容器。 观察该工具的输出和诊断 blob。
打开 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
、JobStatus
和 JobFinishTime
属性的单个作业。 最初,作业的状态为 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",
...
}
],
...
}
使用 az storage container list
和 JMESPath 查询 查找最近修改的存储容器的名称(前缀为 ycsbbenchmarking-*
)。
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 错误或无法访问,会在客户端 VM 和存储帐户的 agent.out 文件中列出此错误。
Caused by: java.net.UnknownHostException: rtcosmosdbsss.documents.azure.com: Name or service not known
如果 Azure Cosmos DB 键错误,会在客户端 VM 和存储帐户的 agent.out 文件中列出此错误。
The input authorization token can't serve the request. The wrong key is being used….
后续步骤