Есть сервер с 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, т.к. работать с дисками становится легче в разы. Я могу увеличивать разделы, переносить данные с одного физического диска на другой в прозрачном режиме, могу делать снэпшоты и т.д.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.