在 Windows Server 2012 R2 上添加驱动器后,存储池上的镜像虚拟磁盘无法扩展

在 Windows Server 2012 R2 上添加驱动器后,存储池上的镜像虚拟磁盘无法扩展

我最近开始将几个镜像 RAID1 阵列转换为一个大型存储池。我有两个 2TB 磁盘和两个 3TB 磁盘,总共 10TB,镜像后应该会给我 5TB 的可用空间。

我使用两个 2TB 磁盘和两个 3TB 磁盘中的一个启动了存储池,使用最后的 3TB 磁盘作为旧数据的备份,以移动到新的池存储。我在新池的顶部将虚拟磁盘设置为“镜像”,并且有不到 3TB 的可用空间。

将备份从额外的 3TB 驱动器移至新池后,我清理了它并将其添加到池中。但是,我现在无法扩展镜像虚拟磁盘以利用增加的空间。

不幸的是,由于我的新手声誉不佳,我无法发布图片,但我的池显示容量为 9.09TB,可用空间为 2.64TB。尝试扩展虚拟磁盘时,允许的最大大小为 3.22 TB,仅比我添加 3TB 驱动器之前多一点点。物理磁盘显示几乎没有新磁盘被使用,而其余磁盘已满。

我在其他地方读到过,列数可以限制虚拟磁盘的扩展方式,但我的列数设置为 1,这应该允许扩展到任意数量的磁盘。

这是我的虚拟磁盘的 powershell 输出:

ObjectId                          : {1}\\SERVER\root/Microsoft/Windows/Storage/Providers_v2\SPACES_VirtualDisk.ObjectId
                                    ="{fdf741fe-cae8-11e4-80b4-806e6f6e6963}:VD:{d734cabd-cabf-11e4-80bf-000c41ebb9a3}{
                                    d734cad6-cabf-11e4-80bf-000c41ebb9a3}"
PassThroughClass                  :
PassThroughIds                    :
PassThroughNamespace              :
PassThroughServer                 :
UniqueId                          : D6CA34D7BFCAE41180BF000C41EBB9A3
Access                            : Read/Write
AllocatedSize                     : 3545495502848
DetachedReason                    : None
FootprintOnPool                   : 7090991005696
FriendlyName                      : McAfee Primary
HealthStatus                      : Healthy
Interleave                        : 262144
IsDeduplicationEnabled            : False
IsEnclosureAware                  : False
IsManualAttach                    : False
IsSnapshot                        : False
LogicalSectorSize                 : 4096
Name                              :
NameFormat                        :
NumberOfAvailableCopies           :
NumberOfColumns                   : 1
NumberOfDataCopies                : 2
OperationalStatus                 : OK
OtherOperationalStatusDescription :
OtherUsageDescription             :
ParityLayout                      : Unknown
PhysicalDiskRedundancy            : 1
PhysicalSectorSize                : 4096
ProvisioningType                  : Fixed
RequestNoSinglePointOfFailure     : False
ResiliencySettingName             : Mirror
Size                              : 3545495502848
UniqueIdFormat                    : Vendor Specific
UniqueIdFormatDescription         :
Usage                             : Other
WriteCacheSize                    : 0
PSComputerName                    :

以下是该池的 powershell 输出:

PS H:\> Get-StoragePool -FriendlyName "McAfee Primary Pool"

FriendlyName            OperationalStatus       HealthStatus            IsPrimordial            IsReadOnly
------------            -----------------       ------------            ------------            ----------
McAfee Primary Pool     OK                      Healthy                 False                   False


PS H:\> Get-StoragePool -FriendlyName "McAfee Primary Pool" | FL


ObjectId                          : {1}\\SERVER\root/Microsoft/Windows/Storage/Providers_v2\SPACES_StoragePool.ObjectId
                                    ="{fdf741fe-cae8-11e4-80b4-806e6f6e6963}:SP:{d734cabd-cabf-11e4-80bf-000c41ebb9a3}"
PassThroughClass                  :
PassThroughIds                    :
PassThroughNamespace              :
PassThroughServer                 :
UniqueId                          : {d734cabd-cabf-11e4-80bf-000c41ebb9a3}
AllocatedSize                     : 7092601618432
ClearOnDeallocate                 : False
EnclosureAwareDefault             : False
FriendlyName                      : McAfee Primary Pool
HealthStatus                      : Healthy
IsClustered                       : False
IsPowerProtected                  : False
IsPrimordial                      : False
IsReadOnly                        : False
LogicalSectorSize                 : 4096
Name                              :
OperationalStatus                 : OK
OtherOperationalStatusDescription :
OtherUsageDescription             :
PhysicalSectorSize                : 4096
ProvisioningTypeDefault           : Fixed
ReadOnlyReason                    : None
RepairPolicy                      : Parallel
ResiliencySettingNameDefault      : Mirror
RetireMissingPhysicalDisks        : Auto
Size                              : 9998683865088
SupportedProvisioningTypes        : {Thin, Fixed}
SupportsDeduplication             : False
ThinProvisioningAlertThresholds   : {70}
Usage                             : Other
Version                           : Windows Server 2012 R2
WriteCacheSizeDefault             : Auto
WriteCacheSizeMax                 : 107374182400
WriteCacheSizeMin                 : 0
PSComputerName                    :
FileSystem                        : Unknown

有什么想法可以让我重新获得我的空间吗?

答案1

我遇到了同样的问题。Neograph 的评论在这种情况下无关紧要,他谈论的是传统的 Windows Server 磁盘镜像,而不是存储空间。精简配置在这种情况下也无关紧要。您可以将其用作一种解决方法,但我认为更谨慎的规划在预算和性能方面都会更好,请继续阅读,您就会明白。

在花了相当长的时间阅读和操作服务器管理器后,我想我弄清楚了发生了什么。问题是,SS 有一个叫做“列”的东西。它定义了数据分布在多少个磁盘上。如果你的虚拟磁盘是用 4 列创建的,那么数据只会分布在 4 个磁盘上,简单的布局(即 RAID0)或 8 个磁盘双向镜子(即 RAID10),但不是全部。这可能会让那些来自传统 HW RAID 的人(比如我)感到困惑,但事实就是如此。

注意:从现在开始,我将把列数称为列大小,因为这样对我来说更直观。

所以无论如何,列大小还定义了如何扩展虚拟磁盘。显然,如果您当前的 VD 有 4 个磁盘组(= 列大小为 4),则不能通过添加 2 个新磁盘来添加“半”组。因此,扩展所需的磁盘数量基本上是

n x NumberOfColumns x NumberOfDataCopies

因此,如果您有一个双向镜像,并且列大小为 1,则只能添加成对的磁盘。如果您的镜像的列大小为 3,则只能添加 6、12、18 个左右的磁盘。

据我了解,虚拟磁盘的默认列大小是磁盘数除以副本数,但最大为 8,例如,如果双向镜像中有 10 个磁盘,则列大小为 5;如果有 16 个磁盘,则列大小为 8;但如果有 24 个磁盘,则列大小仍为 8 - 默认情况下。注意:您可以在虚拟磁盘属性 (列数数据副本数属性下细节)。

接下来会出现很多令人头痛的问题:

  • 如果您想扩展 VD,默认列大小要求您将磁盘数量增加一倍(大多数情况下)
  • 如果磁盘使用率设置为,则只能选择列大小手动的在创建池期间
  • 默认磁盘使用情况是自动的(当然)
  • 一旦创建了 VD,就无法更改列大小
  • 一旦创建池,您就无法将磁盘使用情况更改为手动

因此,为了正确设置,您需要删除:

  • 音量
  • 虚拟磁盘
  • 存储池

即所有内容。顺便提一下,条带大小(称为交错大小如果磁盘使用设置为自动,则 SS 中的磁盘管理 (FS) 也不可用。

现在您可能想知道为什么有人会使用大于 1 的列大小。答案当然是性能。列大小越大,性能越好。实际上,它可能相当引人注目,这是列大小为 1 和 6 的基准:

列数:1

列数:6

您需要明智地规划。只有当您确信一旦磁盘空间耗尽,您就能负担得起购买大量磁盘时,才使用较大的列大小。

关于这个话题的一些好书:

答案2

我现在还不能投反对票,但我想强调的是,基本的bviktors 帖子中提供的信息是错误的 - 他是仍然思考袭击通过说不能使用半个磁盘组进行扩展

  • 如果您有一个具有 4 列的存储池 - 则可以使用任意数量的磁盘,从 4 开始。
  • 存储空间将始终利用您拥有的所有磁盘!
  • 列数仅定义写入磁盘的数据量同时(这就是所谓的条纹
  • 下一个条纹(默认情况下大小为 256 KB,称为交错) 但是可以(并且将)被写入 4 个不同的磁盘!

因此,要扩展 4 列的存储池 - 您不需要添加4 个磁盘 - 你只需要确保有池中剩余 4 个磁盘,磁盘空间剩余

因此,如果 1 已满,但 3 有剩余空间,则添加后池将再次运行磁盘!

(这允许按需要混合容量 - 无需保持相等磁盘大小的 raid 约束)

作为一个最佳实践,你应该总是添加更多的磁盘,比#数据副本数 * #列数将会:

考虑一个 2 列 2 复制磁盘 - 它需要最低限度4 个磁盘。如果您丢失了一个磁盘,您仍然可以访问您的数据 - 但您无法再写入任何内容,因为您没有剩余的 4 列来存储数据!

假设您已向该池添加了 5 个磁盘(存储空间子系统将根据大小使用这些磁盘,以最佳方式填充以使所有磁盘同时达到 100%)——丢失一个磁盘仍会保留您的数据——并让您的池继续工作以进行新的写入,因为您仍然至少剩下 4 列。

此外,如果一个磁盘出现故障,您可以立即重建池,而无需先购买新磁盘!

 Set-PhysicalDisk -FriendlyName "BrokenDisk" -Usage Retired
 Get-PhysicalDisk -FriendlyName "BrokenDisk" | Get-VirtualDisk | Repair-VirtualDisk -AsJob

如果剩余空间足够,数据现在将被“移动”到剩余磁盘。重建后:

 $disk = Get-PhysicalDisk -FriendlyName "BrokenDisk"
 Remove-PhysicalDisk -StoragePoolFriendlyName "My Pool" -PhysicalDisks $disk

(您可以使用相同的命令退出“功能性”磁盘并将数据移动到其他磁盘 - 这将允许某一些重新分配数据,一旦您添加磁盘 - 但最后您将始终有一个磁盘“空”。但是,由于磁盘数量较少,因此在您的情况下,它不起作用。例如,在 10 个磁盘池中,您可以通过将少至 200 MB 分配给其他每个磁盘来释放 2 TB 磁盘。重新运行该操作现在将优先写入空磁盘。存储空间基本上总是说:“我必须写入:8 个块(列数 * 数据副本数),每个块大小为 64 KB(交错/列数) - 从 10 个使用率最低的磁盘中给我 8 个不同的磁盘,这样我就可以把数据扔到那里!”)


在您提到的例子中:

我使用两个 2TB 磁盘和两个 3TB 磁盘中的一个启动了存储池,使用最后的 3TB 磁盘作为旧数据的备份,以移动到新的池存储。我在新池的顶部将虚拟磁盘设置为“镜像”,并且有不到 3TB 的可用空间。

您从 2+2+3 TB 开始 - 存储空间现在会在 3TB 磁盘上放置比其他磁盘多 1/3 的数据,而维护所需的镜子,以便它们均匀地填满。

(“2 个数据副本,1 列:我必须写入:2 个块(列数 * 数据副本数),每个块大小为 256 KB(交错/列数)- 从 3 个使用率最低的磁盘中给我 2 个不同的磁盘,这样我就可以将数据放到那里!”)

物理磁盘显示新磁盘几乎没有被使用,其余磁盘都已满。

现在,您的磁盘“几乎已满”,并且您添加了一个“新”磁盘:

disk | size | usage
1    | 2TB  | 1.9 TB
2    | 2TB  | 1.9 TB
3    | 3TB  | 2.8 TB
4    | 3TB  | 0 TB

现在,请记住你有一个镜像虚拟磁盘:如果要扩展该磁盘,存储空间至少需要两个1MB在两个磁盘上,通过以下方式扩展虚拟磁盘1MB

你的池现在会做以下事情:所有写入的数据都会被写入磁盘 4 - 而所有写入的副本都会被写入磁盘 1、2 或 3,因为这会给你最多可用的磁盘空间。

在扩展(固定)这个时,将评估以下等式:

MAX_EXTEND = Math.MIN(100+100+200 , 3000) = 400 MB

A精简配置可以超出可用的物理大小 - 一旦写入 400 MB,它就会停止接受数据!

因此,可用磁盘空间为 100+100+200 - 您的虚拟磁盘只能增加400MB,因为磁盘 1、2、3 已满 - 而磁盘 4 还剩下 2.6 TB 空间。没有更多存储空间来保持双镜像正常运行。

现在,您只需添加 1 个磁盘 - 假设为 8 TB,即可再次将虚拟磁盘扩展 2.6 TB(磁盘 4 上为 2.6 TB,“新 8 TB 磁盘”上为 2.6 TB)

相关内容