Перед каждым, кто собирает хранилище, встаёт вечная дилемма. Твердотельные накопители быстры, но дороги и невелики по объёму. Механические диски ёмки и дёшевы, но медленны. Хочется и скорости, и простора, а бюджет велит выбирать одно. Многоуровневое хранилище в Windows разрешает этот спор изящно: оно объединяет диски обоих типов в единый том, где быстрый уровень хранит горячие, часто используемые данные, а ёмкий уровень держит холодные, редко востребованные. Система сама перемещает данные между уровнями по частоте обращений, и пользователь получает том, который ведёт себя как быстрый, но стоит как ёмкий. Эта технология встроена в Windows и не требует ни дорогих гибридных контроллеров, ни сторонних программ.

Многоуровневое хранилище основано на простом наблюдении: не все данные используются одинаково. Малая часть файлов запрашивается постоянно, а большинство лежит мёртвым грузом, потревоженное от случая к случаю. Логично держать горячую часть на быстрых дисках, а холодную на ёмких. Система отслеживает частоту обращений к блокам данных и автоматически переносит активные на твердотельный уровень, а остывшие на механический. Так дорогая быстрая ёмкость тратится только на то, что действительно нужно быстро, а основной объём лежит на дешёвых дисках.

Подготовка дисков двух типов и создание общего пула

Многоуровневое хранилище строится на пуле, в котором есть диски обоих типов: быстрые твердотельные и ёмкие механические. Сначала проверяют доступные диски и убеждаются, что система верно определила их тип. Просмотр дисков с указанием типа носителя делается командой оболочки PowerShell:

Get-PhysicalDisk -CanPool $True | Select FriendlyName, MediaType, Size

Команда показывает каждый пригодный диск с его типом носителя и размером. Поле типа носителя должно правильно отражать природу диска: твердотельный или механический. Если система не распознала тип верно, его задают вручную, что важно для правильной работы уровней. Установка типа носителя для диска делается командой:

Get-PhysicalDisk -FriendlyName "PhysicalDisk2" | Set-PhysicalDisk -MediaType SSD

Здесь диску явно присваивается тип твердотельного накопителя. После того как типы всех дисков заданы верно, из них создают общий пул, куда войдут диски обоих типов. Создание пула делается обычной командой создания, объединяющей все пригодные диски под общим именем. Правильное определение типа дисков - фундамент многоуровневого хранилища, потому что именно по типу система решает, какой диск отнести к быстрому уровню, а какой к ёмкому.

Создание уровней хранения для быстрых и ёмких дисков

В готовом пуле создают два уровня хранения: быстрый из твердотельных дисков и ёмкий из механических. Каждый уровень привязывается к своему типу носителя. Создание быстрого уровня из твердотельных дисков делается командой:

New-StorageTier -StoragePoolFriendlyName "ПулДанных" -FriendlyName "БыстрыйУровень" -MediaType SSD

Команда создаёт уровень, который будет использовать только твердотельные диски пула. Аналогично создают ёмкий уровень из механических дисков:

New-StorageTier -StoragePoolFriendlyName "ПулДанных" -FriendlyName "ЁмкийУровень" -MediaType HDD

Эта команда создаёт уровень на механических дисках. Теперь в пуле есть два уровня, каждый привязан к своему типу носителя. Просмотреть созданные уровни помогает команда их вывода, показывающая имя и тип каждого уровня. Уровни сами по себе ещё не хранят данных, они лишь задают, какие диски какую роль играют. Это разделение - суть многоуровневого подхода: быстрый уровень становится горячей зоной для активных данных, ёмкий уровень - холодным складом для всего остального, и система сама управляет распределением между ними.

Создание многоуровневого виртуального диска

На основе двух уровней создают виртуальный диск, который использует оба уровня сразу. При его создании задают, сколько места взять с каждого уровня. Сначала уровни получают как объекты, потом создают на них диск. Создание многоуровневого виртуального диска делается так:

$быстрый = Get-StorageTier -FriendlyName "БыстрыйУровень"
$ёмкий = Get-StorageTier -FriendlyName "ЁмкийУровень"
New-VirtualDisk -StoragePoolFriendlyName "ПулДанных" -FriendlyName "ГибридныйТом" -StorageTiers $быстрый, $ёмкий -StorageTierSizes 100GB, 1TB -ResiliencySettingName Mirror -ProvisioningType Fixed

Первые две строки получают уровни как объекты, третья создаёт виртуальный диск, берущий сто гигабайт с быстрого уровня и терабайт с ёмкого. Размеры уровней задают исходя из объёма горячих данных: быстрый уровень делают достаточным, чтобы вместить активную часть, ёмкий - под всё остальное. Многоуровневый диск требует фиксированного выделения, потому что место на каждом уровне резервируется сразу. После создания диск ведёт себя как единое целое, скрывая за собой два уровня. Пользователь видит обычный том, не подозревая, что под ним работает умная система распределения данных по скорости.

Настройка автоматического перемещения данных по уровням

Главная магия многоуровневого хранилища - автоматический перенос данных между уровнями по частоте обращений. Система анализирует, какие блоки запрашиваются часто, и переносит их на быстрый уровень, а остывшие отправляет на ёмкий. Этот перенос выполняется по расписанию через задачу оптимизации. Запуск оптимизации уровней вручную делается командой:

Optimize-Volume -DriveLetter D -TierOptimize

Команда анализирует частоту обращений и перераспределяет блоки данных между уровнями, поднимая горячие на быстрый уровень. По умолчанию эта оптимизация запускается автоматически по расписанию, обычно ночью, чтобы не мешать работе. Проверить и настроить расписание можно через планировщик задач, где есть соответствующая задача обслуживания уровней. Помимо автоматического переноса, отдельные важные файлы можно закрепить на быстром уровне принудительно, чтобы они всегда оставались быстрыми независимо от частоты обращений. Закрепление файла на быстром уровне делается специальной командой с указанием файла и уровня. Это полезно для файлов, которые должны быть мгновенными всегда: загрузочные образы, базы активных приложений, часто открываемые рабочие документы.

Расчёт размера быстрого уровня под реальную нагрузку

Главный вопрос при настройке многоуровневого хранилища - сколько места отдать под быстрый уровень. Слишком маленький быстрый уровень не вместит все горячие данные, и часть активных файлов застрянет на медленном уровне, сводя выигрыш на нет. Слишком большой - это переплата за дорогую твердотельную ёмкость, которая простаивает. Золотая середина зависит от характера нагрузки. Понять, сколько данных реально горячие, помогает наблюдение за тем, как заполняется быстрый уровень после периода работы. Просмотр заполнения уровней делается командой:

Get-StorageTier | Select FriendlyName, MediaType, @{N="ЗанятоГБ";E={$_.FootprintOnPool/1GB}}

Команда показывает, сколько места реально занято на каждом уровне. Если после недели работы быстрый уровень заполнен почти целиком, горячих данных больше, чем он вмещает, и его стоит расширить. Если занята лишь часть, размер выбран с запасом. Общее правило таково: быстрый уровень делают равным объёму активно используемых данных плюс небольшой запас на рост. Для типичной рабочей системы это часто десятая часть общего объёма или около того, потому что активно используется обычно меньшинство файлов. Точную цифру дают только наблюдение и подстройка под конкретную нагрузку, ведь у базы данных и у файлового архива доля горячих данных совершенно разная. Поэтому размер быстрого уровня не угадывают раз и навсегда, а уточняют по факту заполнения, при нужде расширяя добавлением твердотельных дисков.

Закрепление критичных файлов на быстром уровне

Автоматический перенос данных по частоте обращений хорош для большинства случаев, но у него есть задержка: новый горячий файл сначала полежит на медленном уровне и поднимется наверх лишь при следующей оптимизации. Для файлов, которые обязаны быть быстрыми всегда и сразу, есть принудительное закрепление на быстром уровне. Оно держит файл на твердотельных дисках независимо от частоты обращений. Закрепление файла на быстром уровне делается командой с указанием пути и желаемого уровня:

Set-FileStorageTier -FilePath "D:\base\active.db" -DesiredStorageTierFriendlyName "БыстрыйУровень"

Команда закрепляет указанный файл на быстром уровне, и при следующей оптимизации он гарантированно окажется на твердотельных дисках и останется там. Это незаменимо для файлов с предсказуемо высокой важностью: активных баз данных, загрузочных образов виртуальных машин, постоянно открываемых рабочих файлов. В отличие от автоматического переноса, закрепление не зависит от статистики обращений, оно жёстко фиксирует файл на быстром уровне по решению администратора. Проверить, какие файлы закреплены и применилось ли закрепление, помогает команда просмотра назначений файлов по уровням. Закрепление - тонкий инструмент ручной настройки поверх автоматики: основную массу данных система распределяет сама, а несколько критичных файлов администратор прибивает к быстрому уровню вручную, гарантируя им скорость без оглядки на статистику использования.

Проверка работы уровней и итоговые принципы

После настройки убеждаются, что многоуровневый том работает как задумано. Просмотр виртуального диска показывает его уровни и их заполнение. Заодно проверяют, что оба уровня здоровы и задействованы. Команда просмотра уровней с их размерами даёт картину распределения:

Get-StorageTier | Select FriendlyName, MediaType, Size, FootprintOnPool

Команда выводит каждый уровень с его типом, заданным размером и реально занятым местом в пуле. По этим цифрам видно, как данные распределились между быстрым и ёмким уровнями. Если быстрый уровень заполнен под завязку, возможно, горячих данных больше, чем он вмещает, и его стоит расширить добавлением твердотельного диска. Если же он почти пуст, быстрой ёмкости с запасом.

Стоит трезво понимать и границы применимости этой технологии. Многоуровневое хранилище раскрывается там, где есть чёткое разделение данных на горячие и холодные, и доля горячих невелика. Если же обращения распределены равномерно по всему объёму, как бывает при сплошной обработке огромных массивов, перенос между уровнями не успевает за нагрузкой и выигрыш тает. Не подходит оно и для задач, где важна предсказуемая скорость каждой отдельной операции, потому что файл, остывший и сосланный на медленный уровень, при внезапном обращении ответит медленно. Поэтому многоуровневое хранилище - инструмент для типичной смешанной нагрузки с явным ядром активных данных, а не универсальное решение на все случаи. Понимание этой границы избавляет от разочарования, когда технологию пытаются применить там, где её механизм работать не может в принципе.

Многоуровневое хранилище примиряет вечный конфликт скорости и объёма, давая лучшее от обоих миров. Весь путь укладывается в несколько шагов: подготовить диски двух типов с верно заданными типами носителя, собрать их в общий пул, создать быстрый и ёмкий уровни, нарезать многоуровневый виртуальный диск с распределением места между уровнями и наладить автоматическое перемещение данных. Результат - том, который для частых операций работает со скоростью твердотельного накопителя, а основной объём держит на дешёвых ёмких дисках. Система сама заботится о том, чтобы горячие данные были на быстром уровне, освобождая администратора от ручного распределения. Освоив эту настройку, любой превращает разнотипные диски в умное гибридное хранилище, которое тратит дорогую быструю ёмкость с толком, отдавая её только тем данным, что действительно нуждаются в скорости, а всё остальное спокойно складирует на просторных и недорогих механических накопителях, и в итоге получается и быстро, и ёмко, и не разорительно по деньгам.