This is an old revision of the document!
Настройка гиперконвергентного отказоустойчивого кластера Storage Spaces Direct
'1.
' Развертываем две ноды: настраиваем BIOS и оборудование, устанавливаем системы на отдельные RAID-массивы, подключаем в сети (heartbeat между нодами) и другие.
'2.
' Обновляем прошивки, драйвера, а также устанавливаем одинаковый набор обновлений систем Windows.
'3.
' Диски для Storage Spaces Direct должны быть directly attached, без всяких RAID-контроллеров и должны видеться в системе как обычные диски в диспетчере устройств.
'4.
' Устанавливаем на каждой ноде нужный набор ролей и фич:
Install-WindowsFeature -Name "Hyper-V", "Failover-Clustering", "Data-Center-Bridging", "RSAT-Clustering-PowerShell", "Hyper-V-PowerShell", "FS-FileServer", "FS-Data-Deduplication"
'5.
' MS рекомендует использовать скрипт очистки дисков, которые будут участвовать в массиве. Этот скрипт рассчитан на удаленное использование.
# Fill in these variables with your values $ServerList = "Server01", "Server02", "Server03", "Server04" Invoke-Command ($ServerList) { Update-StorageProviderCache Get-StoragePool | ? IsPrimordial -eq $false | Set-StoragePool -IsReadOnly:$false -ErrorAction SilentlyContinue Get-StoragePool | ? IsPrimordial -eq $false | Get-VirtualDisk | Remove-VirtualDisk -Confirm:$false -ErrorAction SilentlyContinue Get-StoragePool | ? IsPrimordial -eq $false | Remove-StoragePool -Confirm:$false -ErrorAction SilentlyContinue Get-PhysicalDisk | Reset-PhysicalDisk -ErrorAction SilentlyContinue Get-Disk | ? Number -ne $null | ? IsBoot -ne $true | ? IsSystem -ne $true | ? PartitionStyle -ne RAW | % { $_ | Set-Disk -isoffline:$false $_ | Set-Disk -isreadonly:$false $_ | Clear-Disk -RemoveData -RemoveOEM -Confirm:$false $_ | Set-Disk -isreadonly:$true $_ | Set-Disk -isoffline:$true } Get-Disk | Where Number -Ne $Null | Where IsBoot -Ne $True | Where IsSystem -Ne $True | Where PartitionStyle -Eq RAW | Group -NoElement -Property FriendlyName } | Sort -Property PsComputerName, Count
'6.
' Настраиваем heartbeat-сеть кластера. В случае двух нод с двумя 25-гигабитными адаптерами можно подключить каждый к противоположному (по крайней мере, HP рекомендует делать именно так) и сделать две разных сети. В настройках адаптеров и настройках BIOS выставляем iWARP в качестве network-direct technology. Переименовываем адаптеры для наглядности в CLUSTER_1 и CLUSTER_2. CLUSTER_1 одного сервера будет подключен в CLUSTER_2 другого и наоборот.
На всякий случай включаем RDMA явно, командлетом на обоих нодах:
Enable-NetAdapterRdma CLUSTER_1 Enable-NetAdapterRdma CLUSTER_2
И проверяем выполнение:
Get-NetAdapterRdma CLUSTER_1 Get-NetAdapterRdma CLUSTER_2
Должны получить что-то вроде:
CLUSTER_1 Chelsio Network Adapter True
Проверяем, что протокол SMB видит наличие RDMA:
Get-SmbClientNetworkInterface
Должны получить, что:
RDMA capable = true
На сайте Microsoft есть скрипт, который проверяет работу RDMA. В инструкции, которая приложена к статье описывается его выполнение. Сначала нужно скачать DiskSpd.exe, а потом выполнить команду (для iWARP -IsRoCE должно быть именно false
):
C:\TEST\Test-RDMA.PS1 -IfIndex 3 -IsRoCE $false -RemoteIpAddress 10.5.5.2 -PathToDiskspd C:\TEST\Diskspd-v2.0.17\amd64fre\
Скрипт тестирует запись на удаленный сервер при помощи RDMA. В нашем случае скрипт создал файл, успешно передавал данные, но по какой-то причине в конце выдавал странную ошибку о том, что нет прав на запись. Но трафик по RDMA шёл и данные отлично передавались, о чем можно посмотреть было в системном мониторе по группе показателей RDMA. Т.е., на ошибку можно забить потому что данные передаются вполне успешно и передаются именно с использованием RDMA.
'7.
' Производим валидацию кластера со станции управления. Кстати, на ней должен быть установлен RSAT с компонентами администрирования кластера. Проверяем получившийся html-отчёт и если там нет проблем - идем дальше.
Test-Cluster -Node node1, node2 -Include "Storage Spaces Direct", "Inventory", "Network", "System Configuration"
'8.
' Создаем новый кластер с новым статическим адресом и именем. Без общего стораджа, он создается отдельно.
New-Cluster –Name <ClusterName> –Node node1, node2 –StaticAddress <X.X.X.X> –NoStorage
'9.
' Если кластер имеет чётное количество нод, то обязательно сделать witness. Это довольно удобно делать через mmc-оснастку управления кластером. В нашем случае был выбран файловый ресурс на серерве sql03. В права файлового ресурса обязательно нужно добавить учетные записи нод кластера и аккаунт самого кластера с полным доступом.
Посмотреть конфигурацию witness можно используя командлет:
Get-ClusterQuorum | fl
А проверить статус голосования конкретной ноды можно следующим способом:
Get-ClusterNode | Select-Object *
В выводе нужно поискать значение параметра NodeWeight
.
'10.
' Включаем Storage Spaces Direct для кластера командой:
Enable-ClusterStorageSpacesDirect –CimSession <ClusterName>
'11.
' Создаем шаблон стораджа, который мы хотим использовать. Для нашего кластера был выбран nested mirror - сервера зеркалируют друг друга, плюс в каждом массиве каждого сервера есть зеркало. Такой шаблон оставляет для использования лишь 25% общей ёмкости дисков, но является во-первых достаточно надёжным и позволяет кластеру одновременно выдержать два аппаратных сбоя сразу: например, сервер и диск, два диска и т.д., а во-вторых такая конфигурация является более производительной, чем, например, nested mirror accelerated parity, где полезная ёмкость дисков составляет 35-40 процентов, а отказоустойчивость организуется по типу RAID 5.
New-StorageTier -StoragePoolFriendlyName S2D* -FriendlyName NestedMirror -ResiliencySettingName Mirror -MediaType SSD -NumberOfDataCopies 4
'12.
' После создания шаблона мы можем переходить к созданию конкретных разделов, которые будут использоваться для хранения данных. Для того, чтобы понять - какого максимального размера раздел мы сможем создать - лучше подключиться к кластеру при помощи Windows Admin Center и посмотреть, сколько места дисков осталось незарезервированным. Storage Spaces резервирует определенное количество места для нужд восстановления на горячую. Т.е. если в кластере вылетит один из дисков, а новый не будет сразу же воткнут “на горячую” - кластер использует это зарезервированное пространство для восстановления. Итого: нам нужно посмотреть незанятое место и разделить в нашем случае на 4, т.к. nested mirror позволит использовать 25 процентов. Затем мы запускаем создание раздела командой, в которой указываем созданный выше шаблон, название раздела и его объем:
New-Volume -StoragePoolFriendlyName S2D* -FriendlyName Volume01 -StorageTierFriendlyNames NestedMirror -StorageTierSizes 5900GB
'13.
' Теперь общий раздел будет доступен для записи на всех нодах по следующему пути: c:\ClusterStorage\Volume01
. Раздел создается в файловой системе ReFS по умолчанию. Она сильно оптимизирована как для Storage Spaces, так и для задач виртуализации HYPER-V.
'14.
' Для ускорения операций чтения стоит настроить CSV in-memory read cache. Размер обычно используют в районе 2ГБ, но т.к. на серверах нет нехватки в памяти, было решено поставить 4ГБ на каждом. Скрипт, который можно использовать на станции управления, подключаясь к кластеру удаленно:
$ClusterName = "master1" $CSVCacheSize = 4096 #Size in MB Write-Output "Setting the CSV cache..." (Get-Cluster $ClusterName).BlockCacheSize = $CSVCacheSize $CSVCurrentCacheSize = (Get-Cluster $ClusterName).BlockCacheSize Write-Output "$ClusterName CSV cache size: $CSVCurrentCacheSize MB"
'15.
' После создания дискового раздела - не лишним будет измерить его производительность. Для этого лучше использовать утилиту от MS DiskSpd. Некоторые другие утилиты могут показывать неадекватные результаты, поскольку, не умеют работать с CSV-in memory cache. Скачиваем утилиту и запускаем с такими параметрами:
.\diskspd -t2 -o32 -b4k -r4k -w50 -d120 -Sh -D -L -c5G C:\ClusterStorage\Volume01\IO2.dat > test02.txt
В данном случае процент операций записи и чтения будет составлять 50% - за это отвечает параметр -w50
. Результаты можно посмотреть в текстовом файле. В самом конце они разбиты на чтение, запись и полную сумму. Производительность хранилища вышла: 81393.54 I/O per s. Утилиту можно использовать на любых дисках, не обязательно массивах Storage Spaces Direct.
'16.
' После создания радела стоит включить функцию дедупликации данных, которая позволяет не записывать дубликаты данных, экономя место. Удобно это сделать через WAC в свойствах раздела. Если соответствующая роль (“FS-Data-Deduplication”) на обоих нодах была установлена - нужно только отметить соответствующий переключатель, после чего функция заработает.
'17.
' После создания кластера, виртуальные машины можно свободно перемещать между нодами. Выключение одной из нод вызовет автоматическое перемещение виртуальных машин на другую. После включения виртуальные машины вернутся обратно.
'18.
' Для обновления нод нужно использовать механизм cluster aware updating. Можно это делать через WAC. Для того, чтобы он не ругался на ошибку CredSPP - нужно обязательно сохранить свой аккаунт в WAC и отметить использование этих учётных данных для всех соединений.
'19.
' Корректную перезагрузку ноды кластера s2d следует осуществлять в таком порядке:
Проверить все ли диски в нормальном состоянии:
Get-VirtualDisk
Сделать Drain ролей перезагружаемой ноды (виртуальные машины будут мигрированы на другую ноду):
Suspend-ClusterNode -Drain
Кластер переидет в состояние “paused” и после миграции машин можно будет перезагрузить/выключить его. После перезагрузки возвращаем ноду в кластер:
Resume-ClusterNode
Либо, чтобы сразу же вернуть ей прежние роли, запустить:
Resume-ClusterNode –Failback Immediate
После возвращения будет произведена пересинхронизация стораджа, за которой можно наблюдать при помощи команды:
Get-StorageJob
Полезные ссылки
Основная статья по Storage Spaces Direct и всеми его аспектами MS:
Мониторинг здоровья стораджа:
https://docs.microsoft.com/en-us/windows-server/storage/storage-spaces/understand-storage-resync
Механизм обновления прошивок дисков:
https://docs.microsoft.com/en-us/windows-server/storage/update-firmware
Утилита DiskSpd
https://docs.microsoft.com/en-us/azure-stack/hci/manage/diskspd-overview
Неплохой пример деплоя, правда, на Server Core: