Можно ли добавить диски в raid 10 без потери данных

Обновлено: 06.07.2024

Если replication factor = 2, и зеркалирующих диска выйдут из строя, то весь массив рухнет. Я бы на вашем месте смотрел в строну RAID-5/6, я подробно не читал, но вроде именно они ориентированы на большое количество дисков и большую отказоустойчивость, чем 0/1 ну смотрите. RAID-0 обеспечивает увеличение скорости, а RAID-1 оебспечивает зеркалирование, и, тем самым, отказоустойчивость. Таким образом вы можете увеличить скорость в N раз, сделав массив RAID-0 из N устройств, и увеличить возможные потери дисков до M-1, сделав каждое устройство RAID-1 массивом из M дисков. Тем не менее, для полной потери кластера достаточно потери любого RAID-0 устройства, а для утого нужно, чтобы в RAID-1 диске протухли все физические диски. Поэтому ваша отказоустойчивость на самом деле ограничена только количеством дисков в RAID-1 массиве. RAID-0 же отвечает исключительно за производительность. Более того, этот массив будет работать со скоростью самого медленного диска, поэтому ожидаемый прирост производительности вы можете и не получить. Поэтому я еще раз советую вам посмотреть в сторону 5/6, софт-не софт здесь не играет роли, при реализации на софте вы потеряете как на 0/1, так и на 5/6. А как по Вашему, какое максимальное количество дисков (в raid-10 из восьми дисков) может выйти из строя без потери данных?

RAID-10 в стандартном режиме дублирования без потери данных переживёт выпадение одного любого диска, устойчивость от выпадения второго не гарантирована. Собран как зеркало поверх страйпа, или наоборот страйп поверх зеркала, или mdadm (который ни то ни другое) - разницы не имеет, гарантирована устойчивость только без любого одного диска. Особое внимание на "любого диска".

Каждый блок данных в RAID-10 зеркалируется по двум дискам, из-за этого общая потеря ёмкости - половина. Но поэтому же, если вам не повезло, и выпали хоть даже из 10 дисков только те два, на которых были зеркала одного сектора данных - этот сектор читать больше неоткуда. В случае большой удачи выпадения именно нужных дисков - можно потерять до половины накопителей массива.

Например, в linux raid aka mdadm, возможно указать, сколько копий данных должно реплицироваться по дискам. Например, 3 копии данных на 6 дисках дадут вам возможность пережить выпадение любых двух дисков и не любых 4. Цена этого - доступная ёмкость массива. Вам будет доступна ёмкость только двух дисков из 6.

RAID5 и RAID6, о которых вам в комментариях пишут - переживут выпадение одного и двух дисков соответственно. Выход из строя любого второго диска в raid5 или любого третьего в raid6 - фатален и влечёт потерю всего массива. Цель и удел этих уровней рейда - подстраховаться от смерти диска, но при этом как-нибудь более дёшево, чем зеркало. RAID5 уменьшит форматируемую ёмкость массива на размер только одного диска, RAID6 - на ёмкость только двух дисков. А не вполовину, как RAID1 или RAID10.

Например, из 12 дисков по 1 тб можно собрать:

  • RAID5 ёмкостью в 11 Тб, можно потерять любой 1 диск
  • RAID6 ёмкостью в 10 ТБ, можно потерять любые 2 диска
  • RAID10 ёмкостью в 6 ТБ, можно потерять любой 1 диск
  • RAID10 ёмкостью в 4 ТБ, если настроить, что можно потерять любые 2 диска

Казалось бы, зачем тогда так активно используют raid10 с такой разницей по ёмкости? Ответ: из-за производительности. У RAID10 запрос на чтение может обслужить любой диск из пары, значит у нормально сделанного RAID10 - запросы на чтение можно распараллелить по разным дискам. У raid5/6 один исходный блок данных хранится только в одном месте. Чтобы его прочитать из избыточных данных - надо будет прочитать этот сегмент со всех дисков сразу и применить немного математики. Затем, RAID5/6 помедленнее на записи. И куда более драматичная разница в деградировавшем виде, т.е. если один диск у нас выпал. RAID5/6 просаживаются по производительности более чем чувствительно.

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

И ещё важный момент, который надо при разговорах о рейдах всегда указывать: RAID это не бекап. Бекап у вас должен быть всё равно.

Есть raid1 из 2 дисков, есть 2 дополнительных диска, нужно добавить эти 2 диска в массив и мигрировать на raid10 без потери данных. Ситуация усложняется тем, что boot расположен не в raid, а находит только на одном из дисков, и для усиления отказоустойчивости сервера загрузчик нужно переместить в raid1.

Все описанные действия проводились на рабочем боевом сервере. Схема универсальная, подойдет для любых других начальных условий. Так же аналогично можно мигрировать с raid10 на raid1.

Имеем:
На диске /dev/sdd1 находится /boot
На массиве /dev/md1 находится /
На массиве /dev/md2 находится swap
Если у вас с загрузчиком вопрос уже решен, можете перейти сразу к разделу с миграцией.

Переносим загрузчик

На диске /dev/sdd есть данные и есть загрузчик, поэтому его будем считать эталоном, все остальные диски можно считать пустыми. Для надежности, загрузчик мы не будем размещать на raid10, а оставим на raid1 из 2х дисков (можно и на 3х и на 4х), для большей отказоустойчивости.

Создаем на диске sdb разделы один в один как на sdd. Либо вручную, например, с помощью

Либо просто дублируем разделы

Сам загрузчик находится на /dev/sdd1, поэтому деградированный raid1 /dev/md4 создадим следующим образом

После создания любого нового массива, нужно обновить информацию о всех raid, иначе после перезагрузки все развалится

Теперь перезагрузим сервер, и после перезагрузки увидим странный массив /dev/md127 от которого нужно избавиться, и наш /dev/md4, который может не появиться, т.к. вместо него /dev/md127. Решить эту проблему достаточно просто, достаточно остановить эти 2 массива и добавить заново /dev/md4

Для надежности стоит еще раз перезагрузиться и после этого мы подходим к самой ответственной части, нужно отредактировать загрузчик GRUB2 так, чтобы он грузил сервер с созданного массива. Для этого нужно узнать UUID старого диска с загрузчиком /dev/sdd1 и нового массива /dev/md4

Пример получившегося нового конфига

insmod raid
insmod mdraid
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod ext2
set root='(md/4)'
search --no-floppy --fs-uuid --set 59f76eb9-00d2-479e-b94e-6eb54fc574d4
set locale_dir=($root)/grub/locale

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os insmod raid
insmod mdraid
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod ext2
set root='(md/4)'
search --no-floppy --fs-uuid --set 59f76eb9-00d2-479e-b94e-6eb54fc574d4
echo 'Loading Linux 2.6.32-5-amd64 . '
linux /vmlinuz-2.6.32-5-amd64 root=/dev/md1 ro quiet
echo 'Loading initial ramdisk . '
initrd /initrd.img-2.6.32-5-amd64
>
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os

Очень важно, чтобы теперь вы не перезагружались, поэтому что изменив этот файл, загрузчик уже будет думать, что информация для загрузки находится на /dev/md4, а там пока еще ничего нет. Чтобы оставить себе лазейку, не редактируйте секцию recovery mode, так вы сможете загрузиться со старыми данными, правда для этого вам понадобится доступ через KVM-IP или чтобы сотрудник ДЦ выбрал при загрузке recovery mode.

Теперь необходимо обновить ram-диск, иначе система просто не загрузится

После того, как мы внесли изменения в загрузчик, можно переносить содержимое /boot на созданный массив /dev/md4

Мы должны убедиться, что загрузчик GRUB2 установлен на 2х жестких дисках (или 4х, смотря сколько вы захотели добавить в массив), а так же на массиве /dev/md4. Самый надежный способ это сделать, выполнить

где нужно выбрать все диски, на которые нужно добавить загрузчик.

Кроме загрузчика, и сама система должна правильно понять, что загрузчик теперь в другом месте, для этого достаточно отредактировать файлы /etc/fstab и /etc/mtab. Нас интересует строка, где монтируется /boot. UUID нам не понадобится, вместо него указываем название нашего raid-массива.
В файле /etc/fstab

В файле /etc/mtab

Теперь можно перезагружаться, и если вы все сделали правильно, система загрузится с /dev/md4, а /dev/sdd1 уже не используется. Осталось только дособрать наш деградированный массив

Мигрируем с raid1 на raid10 без потери данных

Ситуация все та же, есть raid1 массив из 2х дисков и 2 свободных диска, нужно собрать это все в raid10 и чтобы данные были целы.
Для новых дисков нужно создать структуру разделов идентичную тем, что уже в raid

На /dev/md4 находится /boot
На /dev/md1 находится /
На /dev/md2 находится swap

/boot мы не будем трогать, оставим его как raid1, данные сохранить нужно только на /dev/md1 (массив состоит из /dev/sda6, /dev/sdb6, /dev/sdc6, /dev/sdd6).

Чтобы сохранить данные, мы соберем деградированный raid10 массив из 3 дисков, и перенесем туда данные с raid1, после этого разберем raid1 и доделаем raid10.

Для начала вытащим 1 диск из raid1, т.к. нам нужно минимум 3 диска для создания raid10

Собираем деградированный RAID10 как /dev/md3 и монтируем его. Обязательно добавим запись о новом массиве, чтобы после перезагрузки он оставался

Если случайно перезагрузились до того, как записали данные о массивах, то выполните

Переносим данные с /dev/md1 на /dev/md3

Всё, данные сохранены на raid10 и миграция почти завершена. Теперь нужно указать системе, чтобы она использовала новый /dev/md3, вместо старого /dev/md1. Для этого надо отредактировать файлы /etc/fstab и /etc/mtab.
В файле /etc/fstab нужно сделать замену UUID /dev/md1 на UUID /dev/md3

В файле /etc/mtab нужно просто заменить везде вместо /dev/md1 новый /dev/md3

Когда меняется устройство для /boot или / нужно обязательно редактировать конфигурацию загрузчика /boot/grub/grub.cfg и выполнять update-initramfs, иначе грузится не будет.

И после этого обязательно выполнить

Нужно перезагрузиться, чтобы корень / стал новым массивом /dev/md3 и обращений к старом raid1 уже не было. Закончить создание raid10 нужно добавлением того диска, который сейчас в raid1 (/dev/sdd6). Но для начала нужно его остановить и очистить раздел

И только теперь добавить диск в массив raid10 и обновить данные о массивах

RAID 10 не представляет большой сложности для понимания. Это страйп зеркал. Т.е. сначала диски объединяются в зеркала, а потом контроллер разбивает данные на части между зеркалами. Все предельно хорошо, пока количество дисков на один спан (span) равняется 2-м. И тут у многих людей случается конфуз. Что такое спан и почему туда можно добавлять диски. Как вообще начинает работать наш массив RAID 10, когда мы его собираем на большем числе дисков нежели 4?

Рассмотри сначала классический пример массива RAID 10 из 4-х дисков:

На картинке на контроллер поступили данные. Контроллер их поделил на куски с заранее известным размером. Этот размер задается при создании массива и не может быть изменен после. Даже если данные не удается поделить на куски указанного размера, контроллер дополнит их нулевыми байтами для того, чтобы сделать эту операцию возможной. Поэтому правильно выбирайте размер блока. Если вы планируете использовать массив для хранения больших файлов, стоит выбрать размер блока побольше, например 1 МегаБайт. Напротив, если вы храните много мельких файлов, эффективнее будет выбрать размер блока не больше 64 КилоБайт.

После того, как данные были разбиты на куски, а в нашем примере количество кусков кратно 2-м, контроллер записывает левую порцию на первый диск и дублирует ее на второй, правую на третий диск и дублирует ее на четвертом. Конечно, лево/право тут условно. Само собой контроллер оперирует другими понятиями.

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

Дальше больше. Что если у нас не 4, а скажем 6 дисков? Смотрим рисунок:

В данном примере поступающие данные делятся уже на три равные части. При таком сценарии массив позволяет нам потерять 3 диска одновременно из разных групп. Можно собрать RAID 10 с зеркалом из 3-х дисков и двумя страйпами? Нет. Зеркало всегда (ВСЕГДА) собирается только из 2-х дисков.

Т.е. все тоже самое, только количество кусков, на которые контроллер будет разбивать данные увеличилось до 4-х. Такой сценарий позволяет нам потерять одновременно 4 диска из разных групп.

И вот наконец пример со спаном. Также 8 дисков:

По сути мы вернулись к первому сценарию. Контроллер разбивает данные на две равный части и дальше записывает левую порцию на диск 1 и дублирует на диск 2, а правую порцию на диск 3 и дублирует на диск 4. А как же диски 5,6,7 и 8, спросите вы? Все просто, они ждут пока первая очередь заполнится. В этом и суть спана. Он логически объединяет диски, увеличивая их объем.

В примере выше диски слева являются частью одного спана, а диски справа другого. При этом диски по прежнему зеркалируются в группах по 2. Т.е., внимание, группа != (не равняется) спан. Если мы еще не перешли границу первого зеркала, то мы можем потенциально потерять одновременно до 6-ти дисков. Но лучше бы вам на это не надеяться. Придерживайтесь теории о том, что потерять одновременно можно по-прежнему только 4 диска из разных групп зеркал.

__________________________________

Нужен лайк👍! Больше про сетевое администрирование - на моем канале . Подпишись!

Всем привет! Есть сервер с Debian 9. Система установлена на RAID1 /dev/md0p1 (состоит из 2х Intel DC S3700 200Gb).

Планируется докупить ещё 2 таких же диска и превратить массив в RAID10.

Как можно это сделать с минимальным простоем и без потери данных?



Вставляешь два новых диска в пул ZFS Mirror.

Копируешь данные с RAID1 на ZFS.

Перезагружаешься и проверяешь, всё ли правильно сделал.

Включаешь старые диски в ZFS-пул в виде второго зеркала (будь внимателен) - получаешь RAID-10.

эдак любой дурак может сделать. А online как?


А это в онлайне.


А если без ZFS? Диски с системой содержат ФС ext4

а если серьезно

Вставляешь два новых диска в пул ZFS Mirror.

вот это интересно. Именно в mirror можно? И потом он расширяется до raid10 ?

а в чем проблема то? Я пытаюсь понять подковырку в вопросе, в чем сложность. Обычно это делается копированием из старого в новый неполный массив (с отсуствтующими дисками).

Я вот за online беспокоюсь, не очень понимаю чем тут поможет zfs.

Еще момент, если не ошибаюсь (рад бы ошибаться!), mdadm raid10 не умеет неполный массив начиная с зеркала, он делает неполный на основе raid0 который потом расширяется до raid10. Таким образом возникает опасный момент без избыточности.

Deleted ( 31.07.18 11:07:02 )
Последнее исправление: Deleted 31.07.18 11:07:28 (всего исправлений: 1)

Собираешь из 2-х новых дисков degraded raid10, переносишь на него данные, ставишь загрузчик, правишь конфиги. Ребутаешься, если все ок, добавляешь старые диски в новый массив. Был бы lvm, можно было бы на живую все провернуть.


Мне кажется при создании неполного рейда по схеме disk missing disk missing этот опасный момент получается миновать, я не прав?


Как собрать недорейд и потом добавить диски я понимаю.

А как тащить данные? Загрузиться с live-usb, смонтировать старый и новый рейд в папки, потом

И как потом лучше установить загрузчик?

Полагаю использовать Linux Mint, он в live режиме вроде умеет в mdadm.

Вот мне как раз кажется, что не получится. 'disk missing disk missing' - получается raid0, а не raid1

Читайте также: