Есть сервер с 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. Проверим какие диски существуют в нашей системе
1 |
ls -l /dev/sd* |
Пример вывода:
1 2 3 4 5 6 7 8 |
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
1 |
cat /proc/mdstat |
Пример вывода:
1 2 3 4 5 6 7 8 9 10 |
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. Занятое дисковое пространство
1 |
df -h |
Пример вывода:
1 2 3 4 5 6 7 8 9 |
Файловая система Размер Использовано Дост Использовано% 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 данными
1 |
mdadm /dev/md127 -f /dev/sdb2 |
Вывод команды:
1 |
mdadm: set /dev/sdb2 faulty in /dev/md127 |
5. Удалим диск из массива:
1 |
mdadm /dev/md127 -r /dev/sdb2 |
Вывод команды:
1 |
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.
1 2 |
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.
1 2 |
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/
1 |
mdadm --create /dev/md2 --uuid=efc0f8c6-c4da-744a-a750-8a7d645d9f67 --level=10 --raid-devices=4 --chunk=2048 missing /dev/sd[bcd]2 |
Вывод команды:
1 2 |
mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md2 started. |
9. Добавляем в /etc/mdadm.conf строчку с новым разделом
1 |
nano /etc/mdadm.conf |
10. Добавляем: ARRAY /dev/md2 level=raid10 num-devices=4 UUID=efc0f8c6-c4da-744a-a750-8a7d645d9f67
1 2 3 4 5 6 |
# 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.
1 |
pvcreate --uuid I0OAVm-27U4-KFWZ-4lMB-F3r9-X2kx-LnWADB --norestorefile /dev/md2 |
Вывод команды:
1 2 |
Writing physical volume data to disk "/dev/md2" Physical volume "/dev/md2" successfully created |
12. Теперь увеличиваем volume group centos
1 |
vgextend centos /dev/md2 |
Вывод команды:
1 |
Volume group "centos" successfully extended |
13. В LVM на Physical volume данные хранятся в блоках называемых PhysicalExtent(PE), вот эти PE’шки можно перемещать между Physical volume, что сейчас и требуется нам проделать.
Перед началом данной процедуры, нужно проверить какой номер md127 или md126 у диска с root и home данными
1 |
pvmove /dev/md127 /dev/md2 |
Вывод команды:
1 2 3 4 5 6 7 8 9 |
/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 массива:
1 |
mdadm --examine /dev/sdc2 | grep UUID |
Вывод команды:
1 |
Array UUID : efc0f8c6:c4da744a:a7508a7d:645d9f67 |
16. Редактируем GRUB2:
1 |
nano /etc/default/grub |
Нам нужно поменять UUID после centos/root rd.md.uuid=
1 2 3 4 5 6 7 |
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
1 |
grub2-mkconfig -o /boot/grub2/grub.cfg |
Перезагружаем систему:
1 |
reboot |
Если у вас CentOS 6
И тут нас ждёт один подарочек, пока что я не разобрался почему такое происходит. После перезагрузки раздел /dev/md2 переименовывается в раздел /dev/md127, но система нормально грузится по uuid. На сколько я знаю это относится к новой версии mdadm — 3.0 и выше, где можно создавать partitionable array, в котором можно именовать md разделы. Если кто нибудь в курсе, почему так происходит, то пожалуйста отпишитесь в комментариях. А пока мне остается только поправить номер раздела в файле /etc/mdadm.conf и удалить строчку отвечающую за /dev/md127.
18. Удаляем из Physical group /dev/md127:
1 |
vgreduce centos /dev/md127 |
Вывод команды:
1 |
Removed "/dev/md127" from volume group "centos" |
19. Удаляем его из списка Physical device
1 |
pvremove /dev/md127 |
Вывод команды:
1 |
Labels on physical volume "/dev/md127" successfully wiped |
20. Останавливаем /dev/md127
1 |
mdadm -S /dev/md127 |
Вывод команды:
1 |
mdadm: stopped /dev/md127 |
21. затираем супер блок у /dev/sda2
1 |
dd if=/dev/zero of=/dev/sda2 bs=512 count=1 |
22. добавляем в /dev/md2
1 |
mdadm /dev/md2 -a /dev/sda2 |
Вывод команды:
1 |
mdadm: added /dev/sda2 |
23. Проверяем наш RAID 10
1 |
cat /proc/mdstat |
Вывод команды:
1 2 3 4 5 6 7 8 |
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 раздела.
Посмотрим сколько дискового места у нас теперь свободно:
1 |
vgdisplay |
Видим, что добавилось еще 15,41 GB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--- 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 |
Добавим дискового места нашим разделам:
1 |
lvextend -L +5G /dev/mapper/centos-root |
И оставшееся место для раздела home
1 |
lvextend --extents +100%FREE /dev/mapper/centos-home |
Теперь нужно увеличить размер файловой системы
1 2 |
resize2fs /dev/mapper/centos-root resize2fs /dev/mapper/centos-home |
Chapter 1. Добавление еще двух дисков в RAID 10
1 2 3 4 5 6 7 8 9 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 |
1 |
lvextend --extents +100%FREE /dev/mapper/centos-home |
1 |
resize2fs /dev/mapper/centos-home |
В заключении, для себя сделал вывод, что лучше всегда пользоваться LVM, т.к. работать с дисками становится легче в разы. Я могу увеличивать разделы, переносить данные с одного физического диска на другой в прозрачном режиме, могу делать снэпшоты и т.д.