Есть сервер с CentOS7 и высоким %iowait. Нужно без простоя, или максимум 10 минут желательно ночью, перенести систему с md raid1 на md raid10. В моём случае реально уложиться в 10 минут, или даже меньше, потому что у сервера есть hot-swap корзины.
Перед началом упомяну одну деталь, без неё не получиться мигрировать следуя этому топику. Вся система, кроме /boot, должна быть установлена на LVM. Точка монтирования /boot находится на разделе md0, т.к. grub 0,97 не умеет грузиться с LVM.
Итак, сервер загружен и в нём четыре диска. Раздел /dev/md0 — /boot, раздел /dev/md1 — LVM Physical device и на нём стоит система.
1. Проверим какие диски существуют в нашей системе
ls -l /dev/sd*
Пример вывода:
brw-rw---- 1 root disk 8, 0 ноя 23 10:50 /dev/sda brw-rw---- 1 root disk 8, 1 ноя 23 10:50 /dev/sda1 brw-rw---- 1 root disk 8, 2 ноя 23 10:50 /dev/sda2 brw-rw---- 1 root disk 8, 16 ноя 23 10:50 /dev/sdb brw-rw---- 1 root disk 8, 17 ноя 23 10:50 /dev/sdb1 brw-rw---- 1 root disk 8, 18 ноя 23 10:50 /dev/sdb2 brw-rw---- 1 root disk 8, 32 ноя 23 10:50 /dev/sdc brw-rw---- 1 root disk 8, 48 ноя 23 10:50 /dev/sdd
2. Проверим текущее состояние Software Raid
cat /proc/mdstat
Пример вывода:
Personalities : [raid1] md126 : active raid1 sda1[0] sdb1[1] 488384 blocks super 1.0 [2/2] [UU] bitmap: 0/1 pages [0KB], 65536KB chunk md127 : active raid1 sdb2[1] sda2[0] 16279552 blocks super 1.2 [2/2] [UU] bitmap: 0/1 pages [0KB], 65536KB chunk unused devices: <none>
3. Занятое дисковое пространство
df -h
Пример вывода:
Файловая система Размер Использовано Дост Использовано% Cмонтировано в /dev/mapper/centos-root 5,4G 1,1G 4,1G 21% / devtmpfs 487M 0 487M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6,6M 490M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/md126 454M 100M 327M 24% /boot /dev/mapper/centos-home 8,7G 37M 8,2G 1% /home tmpfs 100M 0 100M 0% /run/user/0
В примере диски значатся как /dev/sdX, т.к. для примера использовалась виртуальная машина с использованием паравиртуализированных драйверов диска VirtIO.
Для начала извлечем из /dev/md127 раздел /dev/sdb2
4. Перед началом данной процедуры, нужно проверить какой номер md127 или md126 у диска с root и home данными
mdadm /dev/md127 -f /dev/sdb2
Вывод команды:
mdadm: set /dev/sdb2 faulty in /dev/md127
5. Удалим диск из массива:
mdadm /dev/md127 -r /dev/sdb2
Вывод команды:
mdadm: hot removed /dev/sdb2 from /dev/md127
6. Далее нам нужно затереть супер блок раздела и забить нулями небольшую часть раздела, т.к. если этого не сделать, то данные на /dev/md1 и разделе с raid10, как я понял, будут консистенты из-за этого возникнут проблемы с созданием раздела с raid10(mdadm будет ругаться что раздел /dev/sdb2 уже используется в /dev/md1, не смотря на то что мы его извлекли ранее) и после перезагрузки система попытается загрузиться не с /dev/md1, а c /dev/md2 и закончится всё на kernel panic.
dd if=/dev/zero of=/dev/sdb2 bs=512 count=1 dd if=/dev/zero of=/dev/sdb2 bs=1M count=100
Я знаю, что можно обойтись только второй командой, но изначально начал делать так, поэтому на реальной машине экспериментировать не решился.
7. Далее нам нужно скопировать таблицу разделов с /dev/sdb на /dev/sdc и /dev/sdd. Воспользуемся утилитой sfdisk. sfdisk будет ругаться и говорить, что не буду ничего делать т.к. раздел начинается не на границе цилиндра, добавляем ему ключ -f.
sfdisk -d /dev/sdb | sfdisk -f /dev/sdc sfdisk -d /dev/sdb | sfdisk -f /dev/sdd
8. Разделы готовы, самое время для создания нового raid10 в degraded режиме. Указываю свой uuid тоже для страховки, т.к. во время экспериментов были проблемы.
Сгенерировать UUID вы можете на сайте: https://www.uuidgenerator.net/
mdadm --create /dev/md2 --uuid=efc0f8c6-c4da-744a-a750-8a7d645d9f67 --level=10 --raid-devices=4 --chunk=2048 missing /dev/sd[bcd]2
Вывод команды:
mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md2 started.
9. Добавляем в /etc/mdadm.conf строчку с новым разделом
nano /etc/mdadm.conf
10. Добавляем: ARRAY /dev/md2 level=raid10 num-devices=4 UUID=efc0f8c6-c4da-744a-a750-8a7d645d9f67
# mdadm.conf written out by anaconda MAILADDR root AUTO +imsm +1.x -all ARRAY /dev/md0 level=raid1 num-devices=2 UUID=7872830a:c480f8c4:ac316f53:c6ea2b52 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=3846bee5:d9317441:f8fb6391:c4024454 ARRAY /dev/md2 level=raid10 num-devices=4 UUID=efc0f8c6-c4da-744a-a750-8a7d645d9f67
11. Перезагружаемся, при загрузке видим что раздел /dev/md2 загружается в degraded режиме
md/raid10:md2: active with 3 out of 4 devices
Создаем physical volume из новоиспеченного раздела, так же указываю свой uuid для избежания duplicate uuid.
pvcreate --uuid I0OAVm-27U4-KFWZ-4lMB-F3r9-X2kx-LnWADB --norestorefile /dev/md2
Вывод команды:
Writing physical volume data to disk "/dev/md2" Physical volume "/dev/md2" successfully created
12. Теперь увеличиваем volume group centos
vgextend centos /dev/md2
Вывод команды:
Volume group "centos" successfully extended
13. В LVM на Physical volume данные хранятся в блоках называемых PhysicalExtent(PE), вот эти PE’шки можно перемещать между Physical volume, что сейчас и требуется нам проделать.
Перед началом данной процедуры, нужно проверить какой номер md127 или md126 у диска с root и home данными
pvmove /dev/md127 /dev/md2
Вывод команды:
/dev/md127: Moved: 0,9% /dev/md127: Moved: 6,0% /dev/md127: Moved: 9,9% /dev/md127: Moved: 13,3% /dev/md127: Moved: 17,4% /dev/md127: Moved: 22,1% /dev/md127: Moved: 42,0% /dev/md127: Moved: 81,1% /dev/md127: Moved: 100,0%
14. Если у вас CentOS 6, примените данную инструкцию:
####Сейчас нужно открыть файл /boot/grub/menu.lst и в строчке команд для ядра поправить параметр rd_MD_UUID на uuid раздела /dev/md2 в моем случае это 3846bee5:d9317441:f8fb6391:4c024445, если этого не сделать, то система будет пытаться найти рутовый раздел на /dev/md1, а том то уже пусто. Так же в эту строку ##желательно добавить полезный, при удаленной работе, параметр panic=10, что означает при kernel panic делать авторебут через 10 сек. Далее нам нужно перезагрузить сервер.
15. Для CentOS 7:
Проверим UUID нашего RAID массива:
mdadm --examine /dev/sdc2 | grep UUID
Вывод команды:
Array UUID : efc0f8c6:c4da744a:a7508a7d:645d9f67
16. Редактируем GRUB2:
nano /etc/default/grub
Нам нужно поменять UUID после centos/root rd.md.uuid=
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.md.uuid=efc0f8c6:c4da744a:a7508a7d:645d9f67 rd.md.uuid=240b1c62:cee6ff48:6202e925:ff58f206 rd.lvm.lv=centos/sw$ GRUB_DISABLE_RECOVERY="true"
Второй UUID оставляем неизменным, т.к. он служит для RAID массива раздела /boot
17. Обновляем GRUB2
grub2-mkconfig -o /boot/grub2/grub.cfg
Перезагружаем систему:
reboot
Если у вас CentOS 6
И тут нас ждёт один подарочек, пока что я не разобрался почему такое происходит. После перезагрузки раздел /dev/md2 переименовывается в раздел /dev/md127, но система нормально грузится по uuid. На сколько я знаю это относится к новой версии mdadm — 3.0 и выше, где можно создавать partitionable array, в котором можно именовать md разделы. Если кто нибудь в курсе, почему так происходит, то пожалуйста отпишитесь в комментариях. А пока мне остается только поправить номер раздела в файле /etc/mdadm.conf и удалить строчку отвечающую за /dev/md127.
18. Удаляем из Physical group /dev/md127:
vgreduce centos /dev/md127
Вывод команды:
Removed "/dev/md127" from volume group "centos"
19. Удаляем его из списка Physical device
pvremove /dev/md127
Вывод команды:
Labels on physical volume "/dev/md127" successfully wiped
20. Останавливаем /dev/md127
mdadm -S /dev/md127
Вывод команды:
mdadm: stopped /dev/md127
21. затираем супер блок у /dev/sda2
dd if=/dev/zero of=/dev/sda2 bs=512 count=1
22. добавляем в /dev/md2
mdadm /dev/md2 -a /dev/sda2
Вывод команды:
mdadm: added /dev/sda2
23. Проверяем наш RAID 10
cat /proc/mdstat
Вывод команды:
Personalities : [raid1] [raid10] md2 : active raid10 sda2[4] sdd2[3] sdb2[1] sdc2[2] 32559104 blocks super 1.2 2048K chunks 2 near-copies [4/3] [_UUU] [>....................] recovery = 4.3% (704128/16279552) finish=2.5min speed=100589K/sec md127 : active raid1 sdb1[1] sda1[0] 488384 blocks super 1.0 [2/2] [UU] bitmap: 0/1 pages [0KB], 65536KB chunk
Всё, система мигрирована на RAID 10.
Работать это должно и на CentOS 5 только там не придется изменять uuid в menu.lst, т.к. там нет такого параметра. В Debian Sid разница будет только в grub, т.к. там grub2.
Теперь нужно увеличить размер LVM раздела.
Посмотрим сколько дискового места у нас теперь свободно:
vgdisplay
Видим, что добавилось еще 15,41 GB
--- Volume group --- VG Name centos System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 11 VG Access read/write VG Status resizable MAX LV 0 Cur LV 3 Open LV 3 Max PV 0 Cur PV 1 Act PV 1 VG Size 31,05 GiB PE Size 4,00 MiB Total PE 7948 Alloc PE / Size 3944 / 15,41 GiB Free PE / Size 4004 / 15,64 GiB VG UUID WVrP2B-NsXo-IOZd-0tT3-ue0h-ieEy-syMkgk
Добавим дискового места нашим разделам:
lvextend -L +5G /dev/mapper/centos-root
И оставшееся место для раздела home
lvextend --extents +100%FREE /dev/mapper/centos-home
Теперь нужно увеличить размер файловой системы
resize2fs /dev/mapper/centos-root resize2fs /dev/mapper/centos-home
Chapter 1. Добавление еще двух дисков в RAID 10
sfdisk -d /dev/sdb | sfdisk -f /dev/sde sfdisk -d /dev/sdb | sfdisk -f /dev/sdf mdadm /dev/md2 -a /dev/sde2 mdadm /dev/md2 -a /dev/sdf2 mdadm -G /dev/md2 --raid-devices=6 pvresize /dev/md2
lvextend --extents +100%FREE /dev/mapper/centos-home
resize2fs /dev/mapper/centos-home
В заключении, для себя сделал вывод, что лучше всегда пользоваться LVM, т.к. работать с дисками становится легче в разы. Я могу увеличивать разделы, переносить данные с одного физического диска на другой в прозрачном режиме, могу делать снэпшоты и т.д.