Предисловие
Вот и пришла пора увеличить место на своём домашнем сервере, для этого было куплено 2 диска разных производителей, но одинакового объёма.
Захотелось сделать soft RAID1, но мне не очень подходит mdadm, так как я хочу иметь более гибкое зеркало, которое можно будет легко расширить в будущем, а не выделять сразу большой объём.
Решил попытать счастья с LVM RAID, но информации по нему, в сжатом виде, мало, в основном всё заканчивает на том, как его создать. Попробую исправить этот пробел.
LVM
Нам понадобится 2 диска, если вы собираетесь настраивать RAID, если нет, то просто пропускайте части с настройкой второго диска.
Для тестирования необязательно иметь настоящие диски, можно использовать обычные файлы: How to create virtual block device (loop device/filesystem) in Linux
Имена дисков заменены на sdX, sdY, sdZ
, во избежание потери данных на реальных носителях.
Инициализация
Казалось бы, сделал pvcreate
над диском и готово, но не тут то было…
Согласно рекомендациям1 2, стоит всегда создавать разделы на диске, во избежание проблем с софтом, который не знает об LVM и будет считать диск пустым.
Для разбивки диска я буду использовать gdisk
, обычно уже установлен, но если что, устанавливается командой:
|
|
Убедитесь, что вы используете верный диск в командах, так как это уничтожит все данные на диске!
|
|
|
|
проделываем то же самое со вторым диском.
Добавляем диски в LVM
|
|
Создаём группу vgdata
из двух дисков
|
|
Простой логический диск
Создаём простой логический диск с именем lv0
на 3ГБ:
|
|
RAID 1 (mirror)
Создаём логический диск с RAID 1 под именем lvmirror
на 3ГБ:
|
|
можно указать флаг --nosync
, чтобы пропустить синхронизацию пустого зеркала.
Смотрим что получилось
|
|
Колонка Cpy%Sync
показывает, процент синхронизации, а Devices
, устройства, на которых находятся данные логического диска.
FS
Осталось создать файловую систему:
|
|
И можно примонтировать и пользоваться
|
|
Тестируем LVM RAID 1 и учимся чинить
Как можно доверять свои данные технологии, когда ты не знаешь, что произойдёт в случае нештатной ситуации и как всё починить без потери данных.
Для начала, посмотрим, как у нас всё выглядит до начала тестов:
|
|
|
|
Теперь мы можем приступать к тестированию, но сначала:
Убедитесь, что вы используете верный диск в командах, так как это может привести к потере данные на диске!
Отвал диска (ресинхронизация) и его замена
В данном случае, мы будем симулировать отвал диска, через изменение его состояния 3
Отключаем диск sdX
:
|
|
Теперь, чтобы LVM понял, что с диском что-то не то, нужно записать на диск данные.
Если FS есть:
|
|
Если FS нет(эта команда уничтожит FS, если она есть!):
|
|
Смотрим результат:
|
|
|
|
Обратите внимание, статус Health
стал partial
Теперь запишем рандомные данные на диск, чтобы можно было увидеть рассинхронизацию:
FS есть, пишем в файл /mnt/random.file
:
|
|
FS нет(эта команда уничтожит FS, если она есть!):
|
|
Включаем диск sdX
обратно:
|
|
Смотрим результат:
|
|
|
|
Ошибки и предупреждения об отсутствии диска пропали, но статус Health
изменился на refresh needed
Чиним
Запускаем синхронизацию командой:
|
|
Но если диск выпал, я бы рекомендовал его заменить на новый, проинициализировав его как в начале статьи и добавив в PV и VG:
|
|
И заменив диск у зеркала:
|
|
Замена мёртвого диска
Теперь давайте просимулируем замену мёртвого диска, для этого нам придётся стереть заголовок нашего диска, чтобы он выглядел как новый:
Эта команда уничтожит данные на диске!
|
|
При вызове
|
|
Мы увидим тот же результат, что и при отвале диска, статус Health
стал partial
, но чинится это по другому.
Чиним
Удалим старый диск из VG
|
|
Так как мы стёрли заголовки диска, нам придётся проинициализировать диск заново и добавить его в PV и VG:
|
|
И нужно починить наше зеркало
|
|
Автоматически запуститься ресинхронизация.
Конвертируем логический диск из RAID 1 в обычный
|
|
Конвертируем логический диск из обычного в RAID 1
|
|
Увеличиваем размер диска с зеркалом
|
|
Уменьшаем размер диска с зеркалом
|
|
Мониторинг
Для мониторинга состояния LVM я написал exporter для prometheus
lvm_exporter
Как я всё сломал
Пока писал статью, успел сломать тестовый LVM
Inconsistent metadata
Когда отключил диск, я решил удалить лишнее зеркало (у меня было 2 LV зеркальных), после подключения диска обратно, у меня появилась ошибка при любой команде LVM:
|
|
После долгих поисков, нашёл нужную мне команду в багтрекере 4, которая мне помогла:
|
|