Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD

Программный RAID1 (зеркало) с помощью mdadm

Теги: Linux

На практике, самый вероятный источник проблем с компьютерами, работающими 24х7 - это диски. За 12 лет я столкнулся с двумя вышедшими из строя сетевыми картами на серверах, но диски, даже серверных серий, выходят из строя регулярно. Что WD, что Seagate, что Hitahi. Поэтому вопрос с мотивацией использования зеркального raid1 считаем закрытым.

Почти все материнские платы сейчас заявляют функционал raid. Только если вы точно знаете, зачем вам использовать raid вашей motherboard, делайте это. К тому же, чаще всего это специфические вариации на тему программного raid, только никто-не-знает-как-сделанные. Т.е. не факт, что плохо сделанные. Но не факт, что вы найдете исчерпывающую информацию по решению проблемы. Далее, специальные контроллеры raid. Опять же, если вы знаете, что именно вы хотите, используйте их. Но вы должны понимать, что любое устройство (что материнка, что отдельный контроллер) могут взбрыкнуть и тогда могут быть проблемы с получением данных с дисков массива. Причем у вас могут возникнуть трудности с поиском информации по решению проблемы, т.к. разбирающихся в конкретной железке или линейки оборудования не так велико. 

Одним из наиболее распространенных решений, по которому вы всегда найдете помощь на форумах, является использование программного raid, не привязанного к железу. В случае Linux это raid массив, созданный mdadm.

Сделаем простейшую систему защиты от сбоя жесткого диска - зеркальный raid массив. Для этого добавим в систему два диска:
/dev/sdb
/dev/sdd

Предположим, на дисках мы разместим файловую шару или ресурс для базы данных. Диски новые, разделов на них нет.

Проверим, что диски в самом деле без разделов:

# fdisk -l /dev/sdb

Не должно быть никаких /dev/sdb1 и прочих! Аналогично для /dev/sdd.

Убедитесь, что вы собираетесь создавать разделы именно на тех дисках, которые для этого добавили.
Проверить модель диска и его S/N: smartctl -i /dev/sdb

На каждом диске создадим раздел на весь диск с прицелом на raid.

Примерно так: Сначала n (add a new partition), потом p (primary), номер раздела 1 (partition number). Все цифры можно оставить по-умолчанию. Записали изменения и вышли: w

# fdisk /dev/sdb

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1953525167, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1953525167, default 1953525167):
Using default value 1953525167
Partition 1 of type Linux and of size 931.5 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Меняем тип раздела /dev/sdb1 на "Linux raid autodetect":

Сначала t (change a partition's system id), потом fd (Linux raid auto), потом p (проверим изменения) и w (сохранили изменения и вышли):

# fdisk /dev/sdb

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1 80  Old Minix
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): p

Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x25413b69

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048  1953525167   976761560   fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Аналогично поступаем с диском /dev/sdd (т.е. создаем primary раздел /dev/sdd1 и меняем тип на "Linux raid autodetect").

Создаем RAID1 массив

Если в вашей системе есть другие диски, внимательно и тщательно проверяйте названия устройств. На моем компьютере это уже не первый массив, поэтому я укажу имя вновь создаваемого массива "/dev/md2".

# mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1

--create - создать
--verbose - больше информации!
/dev/md2 - имя нового raid-массива (фактически, это устройство, на нем потом можно создавать разделы lvm и все что угодно еще)
--raid-devices=2 /dev/sdb1 /dev/sdd1 - указываем кол-во и конкретные устройства, входящие в состав массива.

Проверить, что вышло:

# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdd1[1] sdb1[0]
      976630464 blocks super 1.2 [2/2] [UU]
      [>....................]  resync =  1.4% (13876288/976630464) finish=85.1min speed=188512K/sec
      bitmap: 8/8 pages [32KB], 65536KB chunk

Идет синхронизация. Дождемся ее окончания.

После завершения синхронизации посмотрите параметры вашего массива:

# mdadm --detail --scan --verbose
 

ARRAY /dev/md2 level=raid1 num-devices=2 metadata=1.2 name=localhost.localdomain:2 UUID=3eaa3e42:6f083fc4:0c9281a3:1b9b7452
   devices=/dev/sdb1,/dev/sdd1

Чтобы raid после ребута никуда не делся, сохраняем конфиг в файл /etc/mdadm.conf (путь к файлу верен для CentOS 7):

# mdadm --detail --scan --verbose >> /etc/mdadm.conf

Обратите внимание на ">>" (добавить, а не перезаписать). Не стоит перезаписывать конфиг mdadm, там могут быть важные сведения о других массивах, уже работающих у вас в системе.

Что за UUID "3eaa3e42:6f083fc4:0c9281a3:1b9b7452"? Посмотрите UUID блочных устройств, начинающиеся на "3eaa3e42":

# blkid | grep 3eaa3e42
/dev/sdb1: UUID="3eaa3e42-6f08-3fc4-0c92-81a31b9b7452" UUID_SUB="bb9c4771-20c9-4f4b-5013-f0d6d0f327ae" LABEL="backupmail.localdomain:2" TYPE="linux_raid_member"
/dev/sdd1: UUID="3eaa3e42-6f08-3fc4-0c92-81a31b9b7452" UUID_SUB="37997177-2fd1-6518-3036-2b1d76043816" LABEL="backupmail.localdomain:2" TYPE="linux_raid_member"

Т.е. есть привязка в конфиге raid1 массива не только по имени /dev/sdb1, но и по уникальному идентификатору устройства. Поэтому если вы просто вынете диски и на их место включите другие, то ничего хорошего не выйдет.

Так, теперь вот что: можно просто отформатировать созданный диск (mkfs.ext4 /dev/md2) и указать в файле /etc/fstab точку его монтирования, а можно поиграться с LVM. LVM может дать в дальнейшем определенные преимущества, например, если вы решите изменить размер раздела или даже добавить к нему другие диски, вдруг места будет совсем мало.  

Создаем физический том на устройстве /dev/md2 (т.е. работаем уже с объектом массива, а не конкретными разделами типа /dev/sdb1):

# pvcreate /dev/md2
Physical volume "/dev/md2" successfully created.

Проверяем:

# pvscan
PV /dev/md2                        lvm2 [931.39 GiB]

На томе создаем группу томов (volume group) с именем "datavg" (произвольно, можете брать другое название:

# vgcreate datavg /dev/md2

В группе "datavg" создаем логический том "datalv" (имя выбрано произвольно) размером 931Гб (размер взят из листинга команды pvscan):

# lvcreate --name datalv --size 931G datavg

[не вдаваясь в различия ext4, ext3, xfs и др.] форматируем конечный логический том /dev/datavg/datalv в xfs:

# mkfs.xfs /dev/datavg/datalv
meta-data=/dev/datavg/datalv     isize=512    agcount=4, agsize=61014016 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=244056064, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=119168, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Промежуточный итог: у нас есть "диск" с файловой системой xfs, который можно примонтировать и использовать. Например, чтобы наш raid1 обслуживал какую-то директорию (пусть будет /data), в /etc/fstab добавьте, например:

/dev/mapper/datavg-datalv /data                 xfs     defaults        0 0

Создайте саму директорию /data:

# mkdir /data

Проверьте перед перезагрузкой:

# mount /dev/mapper/datavg-datalv /data

Запишите какой-нибудь файл в /data и перезагрузитесь.

Проверяем. Тестовый файл должен быть на месте.

В первый раз всегда делайте это на тестовом или не важном сервере.

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?