Зеркало здесь, зеркало там: сетевая репликация дисков под Windows
Однажды на моём компьютере сгорел блок питания. С дымом, шумом, и прочими спецэффектами. Жёсткий диск тоже не выжил.
К счастью, там не было ничего ценного. Но я в очередной раз убедился, что RAID-массив не всегда помогает, т.к. может погибнуть вместе с компьютером.
Поэтому лучше, если копия данных будет находиться на другом компьютере. И хорошо, если она будет максимально свежей, чтобы в случае аварии продолжить работу с прерванного места.
Такие решения есть для Linux и FreeBSD — DRBD и HAST. Они позволяют реплицировать блочные устройства хранения по сети. То есть, создать что-то вроде RAID-1, где «половинки» дискового массива находятся на разных компьютерах. Теперь такое решение есть и для Windows.
И это не что-то новое, а тот же DRBD, портированный самими разработчиками из компании Linbit.
WinDRBD работает на 64 битных версиях Windows 10 или Server 2016. А на втором узле может быть как WinDRBD, так и DRBD под Linux. Причём узлы могут быть и виртуальными машинами.
На Хабре уже есть несколько статей по настройке DRBD, поэтому здесь я опишу только WinDRBD. Точнее — настройку репликации между двумя узлами (всего в кластере WinDRBD может быть 32 узла).
▍ Настройка
Скачиваем инсталлятор отсюда, а дальше — как обычно: «Далее», «Далее», «Далее». Установленные в инсталляторе «птички» не трогаем.
Для работы WinDRBD нужен свободный раздел диска. Если свободных разделов нет — можно немного «откусить» от существующего раздела. Или добавить ещё один жёсткий диск. Главное, чтобы размеры выделенных разделов были одинаковы на обоих компьютерах. Если просто хотите попробовать, как оно работает — можете не трогать диски компьютера, а использовать USB-флешки.
Заходим в оснастку «Управление дисками», и на свободном месте создаём простой том нужного размера. Форматировать и назначать букву не нужно.
Стоит учесть, что в этом же разделе будет храниться и служебная информация WinDRBD, поэтому места для пользовательских данных останется меньше. Хотя и существует возможность вынести служебные данные на отдельный раздел, сами разработчики рекомендуют не заморачиваться и хранить всё вместе.
Следующее, что нужно настроить — открыть в брандмауэре TCP порт 7500 на вход и выход, чтобы WinDRBD с двух компьютеров могли между собой общаться. Разумеется, номер порта можно изменить в настройках.
Файл с примером настроек находится в каталоге C:\windrbd\etc\drbd.d
Копируем windrbd-sample.res и даём ему понятное название, например raid1.res
Открываем его в текстовом редакторе и исправляем настройки:
resource "raid1” {
…
on windrbd1 {
address 192.168.0.1:7500;
node-id 1;
…
}
on windrbd2 {
address 192.168.0.2:7500;
node-id 2;
…
}
}
Здесь raid1 — название создаваемого ресурса, windrbd1 и windrbd2 — имена хостов.
Секция c настройками томов выглядит примерно так:
volume 1 {
disk "3e56b893-10bf-11e8-aedd-0800274289ab”;
device minor 1;
meta-disk internal;
}
Здесь раздел, выделенный для WinDRBD, указывается с помощью GUID (который можно посмотреть командой mountvol).
Не рекомендуемый, но допускаемый вариант — указать букву диска:
volume 1 {
disk "E:”;
…
}
Разделу, который появится в системе, тоже можно выдать букву:
device "F:” minor 1;
Но «для уменьшения количества проблем» разработчики рекомендуют делать как в первом варианте, без буквы. В этом случае после старта WinDRBD в системе появится не раздел, а отдельный жёсткий диск, который нужно будет инициализировать (создать таблицу разделов) и отформатировать через «Управление дисками».
Если оба хоста работают под Windows, файлы конфигурации у них будут одинаковыми — можно просто скопировать файл настроек на другой компьютер.
▍ Запуск
Для выполнения приведенных ниже команд используйте командную строку с правами администратора.
Сначала проверим, что в файле настроек нет ошибок (raid1 — название файла):
drbdadm dump raid1
Затем инициализируем служебные метаданные на разделах (отвечайте «yes» на предупреждение об удалении данных):
drbdadm create-md raid1
Инициализировать их нужно на обеих машинах. И на обеих запустить сервис:
drbdadm up raid1
Текущее состояние можно посмотреть командой:
drbdadm status
Если связи со второй стороной нет — в нижней строке статуса будет написано »Connecting».
Когда связь установится — появится сообщение »peer-disk: Inconsistent»
Связь установилась, но этого недостаточно. Нужно явно указать, какой хост будет служить источником синхронизации (первичным). Выполним на первом хосте такую команду:
drbdadm primary raid1 --force
Обратите внимание — параметр force
используется только при первом запуске, иначе потеряются данные.
С помощью команды drbdadm status
можно отслеживать прогресс синхронизации. Когда она завершится, надпись в нижней строке сменится на »peer-disk: UpToDate»
Разумеется, синхронизация займёт некоторое время, зависящее от размера раздела и скорости сети.
▍ Проверка работоспособности
На первичном хосте во вновь появившемся разделе создаём файл test1.
Отключаем на первичном хосте WinDRBD:
drbdadm down raid1
Заходим на второй узел и переключаем его в режим первичного:
drbdadm primary raid1
При этом в системе появится новый раздел, на котором будет присутствовать файл test1.
Стоит отметить, что синхронизируемый раздел виден только на первичном узле. На вторичных узлах он скрыт.
Создадим на втором хосте ещё один файл — test2 и переключим хост обратно в режим вторичного:
drbdadm secondary raid1
Раздел скроется.
Вновь запускаем WinDRBD на первичном хосте:
drbdadm up raid1
drbdadm primary raid1
На появившемся разделе видим два файла — test1 и test2. То есть, синхронизация в обратную сторону также сработала.
▍ Итого
У Linstor получилось сделать простое в настройке средство, увеличивающее надёжность хранения данных. Пока что оно не имеет всех возможностей Linux версии (географически распределённые системы, работа в кластерах и т.п.), но это обещают добавить в следующих релизах.
Кроме WinDRBD есть ещё один порт DRBD на Windows — WDRBD от компании ManTech. Возможности там примерно такие-же, как у WinDRBD, но для получения инсталлятора нужно писать запрос разработчикам, или компилировать из исходников самостоятельно.