与数据工作负载结合使用的数据库类型现在有比以往更多的选择。 选择数据库的关键因素之一是数据库或服务的性能,但基准测试性能可能很繁琐且容易出错。 适用于 Azure 数据库的基准测试框架 使用热门的开源基准测试工具简化了衡量性能的过程,这些工具具有实现常见最佳做法的低摩擦方案。 在 Azure Cosmos DB for NoSQL 中,该框架实现了 Java SDK 的最佳做法,并使用开源 YCSB 工具。 在本指南中,你会使用此基准测试框架以实现读取工作负载,从而熟悉该框架。
先决条件
创建 Azure Cosmos DB 帐户资源
首先,在现有的 API for NoSQL 帐户中创建数据库和容器。
- 在 Azure 门户中访问您现有的 NoSQL 帐户的 API。 
- 在资源菜单中,选择“数据资源管理器”。   
 
- 在“数据资源管理器”页上,选择命令栏中的“新建容器”选项。   
 
- 在“新建容器”对话框中,使用以下设置创建新容器: - 
- 
| 设置 | 价值 |  - 
| 数据库 ID | ycsb |  - 
| 数据库吞吐量类型 | 手动 |  - 
| 数据库吞吐量 | 400 |  - 
| 容器 ID | usertable |  - 
| 分区键 | /id |  
   
 
- 如果尚未登录,请使用 - az login命令登录到 Azure CLI。
 
- 为以下值创建 shell 变量: - 
- 现有的 Azure Cosmos DB for NoSQL 帐户名为cosmosAccountName。
- 第一个资源组的名称,其中包含名为 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-* 的存储容器。 观察该工具的输出和诊断数据块。   
 
- 打开 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
 
- 使用 - ycsbbenchmarkingmetadata查询名为- az storage entity query的存储表中的作业记录。
 - 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",
      ...
    }
  ],
  ...
}
 
- 使用 - ycsbbenchmarking-*和- az storage container list查找最近修改的存储容器的名称(前缀为 )。
 - 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….
 
后续步骤