9

我有几个在 Azure 上运行的 Windows VM,它们被配置为收集性能计数器和事件日志。

所有这些都在 Azure 门户内 VM 资源的“诊断设置...”中进行配置。有一个 Windows Azure 诊断代理可在 VM 上收集此数据并将其存储到存储帐户(在表存储内)。

所有这些收集的数据(性能计数器、指标、日志等)都没有任何保留策略,似乎也没有任何设置方法。所以它只是永远累积在存储帐户的表存储中。

这就是我的问题所在——现在这些表中的数据太多了(在我的例子中是几个 TB),而且仅仅为了保留它就需要花费很多钱。而且它只会随着时间的推移而不断增加。

相关的存储帐户表是如下表:

  • WADMetrics*(Windows Azure 诊断指标表)
  • WADPerformanceCountersTable(Windows Azure 诊断性能计数器表)
  • WASWindowsEventLogsTable(Windows Azure 诊断 Windows 事件日志表)

有什么方法可以删除这些表中的旧数据,这样它就不会破坏任何东西?或者更好的是,是否有某种方法可以配置保留策略或将其设置为不会永远累积?

4

3 回答 3

3

有什么方法可以删除这些表中的旧数据,这样它就不会破坏任何东西?

您需要手动执行此操作。这样做的方式是,您将首先查询需要删除的数据,然后在获得数据后将其删除。PartitionKey存储在这些表中的实体的属性实际上表示一个日期/时间值(在刻度前加零以使其成为等长字符串),因此您需要获取 from 和 to 日期/时间值,将它们转换为刻度,制作它是一个 19 个字符长的字符串(通过在前面加上适当数量的零)并查询数据。在客户端获取数据后,您会将删除请求发送回表存储。

为了加快整个过程,您可以做一些事情:

  • 查询数据时,使用查询投影只返回PartitionKeyRowKey属性,因为删除时只需要这两个属性。
  • 对于删除,您可以使用实体批量事务。这可以大大加快删除操作。
  • 为了更快地删除,您可以在与您的存储帐户相同的区域中启动 VM。这样您就无需支付数据出口费用。

我前段时间写了一篇博文,您可能会觉得有帮助:https ://gauravmantri.com/2012/02/17/effective-way-of-fetching-diagnostics-data-from-windows-azure-diagnostics-table-提示使用分区键/

或者更好的是,是否有某种方法可以配置保留策略或将其设置为不会永远累积?

不幸的是,至少到今天为止还没有。有一个保留设置,但这仅适用于 blob。

于 2019-02-05T15:56:05.967 回答
1

另一种解决方案是编写一个小型 C# 程序来擦除 Windows Azure 诊断 (WAD) 数据。

下面的文章为您提供了一个或多或少的开箱即用解决方案,用于可以擦除WADMetrics*包含在中的表和行的方法WADDiagnosticInfrastructureLogsTableWADPerformanceCountersTableWADWindowsEventLogsTable

使用这两种方法DeleteOldTables()DeleteOldData()很容易编写一个可以每月执行的小程序来清理 WAD 数据。请注意,代码使用 WindowsAzure.Storage NuGet 包,因此需要将其安装在您的项目中。

https://mysharepointlearnings.wordpress.com/2019/08/20/managing-azure-vm-diagnostics-data-in-table-storage/

于 2019-11-27T22:14:06.300 回答
1

刚刚遇到这个问题,因为我正在追踪订阅中的成本最高。

一种有用的工具是Azure 存储资源管理器。您可以浏览表格、检查其内容、使用表格统计按钮来计算表格行数、多选和删除行。

对于一个自 2016 年以来一直在运行的小型 VM,我发现 WADMetrics 表似乎每 10 天滚动一次,但其他表则没有。示例 WADMetrics 表包含 5724 个条目。WASWindowsEventLogsTable 包含 10,022 个条目。当 WADPerformanceCountersTable 达到 500 万个条目时,我取消了它。存储统计信息的成本高于 VM 的 VHD。

本文总结了有关用于操作表的 PowerShell 命令的有用信息。不幸的是,Azure Cloud Shell 还不支持表中工作的命令,例如 Get-AzTableRow(请参阅此报告)。我认为如果您在本地设置最新的 Az PowerShell 命令,这将起作用。然后,您可以使用筛选器进行选择并使用 Remove-AzTableRow 删除一些行。就我而言,这台机器已经退役,所以我只需要一种方法来删除大量表,而无需单击仪表板中的每个表。以下是一些示例命令:

$location = "uswest"
$resourceGroup = "myRG"
$storageAccountName = "myData"
$storageAccount = get-AzStorageAccount -ResourceGroupName $resourceGroup -Name $storageAccountName
$ctx = $storageAccount.Context
# List all tables in storage account
Get-AzStorageTable -Context $ctx
# Count the WADMetrics tables
(Get-AzStorageTable -Context $ctx -Name "WADMetrics*").count
# Count the WADMetrics tables with "2018" in their name
(Get-AzStorageTable -Context $ctx -Name "WADMetrics*2018*").count
# Remove all WADMetrics tables with "2018" in their name without confirmation, then re-count 
# Only Get- supports wilcards, so pipe to Remove-AzStorageTable command
Get-AzStorageTable -Context $ctx -Name "WADMetrics*2018*" | Remove-AzStorageTable -Force
(Get-AzStorageTable -Context $ctx -Name "WADMetrics*2018*").count
# Remove the big tables. Confirmation takes a long time, so suppress it.
Remove-AzStorageTable -Context $ctx -Name "WADWindowsEventLogsTable" -Force
Remove-AzStorageTable -Context $ctx -Name "WADPerformanceCountersTable" -Force

# The following do NOT work in Azure Cloud Shell as of 07/16/2019.  See 
# https://github.com/MicrosoftDocs/azure-docs/issues/28608

# Count the rows in WADWindowsEventLogsTable
$tableName = "WADWindowsEventLogsTable"
$cloudTable = (Get-AzStorageTable -Context $ctx -Name $tableName).CloudTable
$cloudTableResults = Get-AzTableRow -table $cloudTable -columnName "RowKey"
$cloudTableResults.count
于 2019-07-16T23:08:13.147 回答