Visitors have accessed this post 1271 times.

Программный RAID в Linux. Часть 2

3
0
1271
18 декабря 2020 9:22
Автор: Rebrain Me
Linux

Visitors have accessed this post 1271 times.

Автор — Максим Рязанов

Давайте продолжим нашу тему про RAID. Напомню, что первую часть статьи можно найти тут.

Обслуживание RAID

Очистка RAID — Scrubbing

Рекомендуется регулярно выполнять scrubbing данных, чтобы проверять и исправлять ошибки. В зависимости от размера / конфигурации массива очистка может занять несколько часов.

Чтобы инициировать scrubbing данных:

echo check > /sys/block/md0/md/sync_action

Операция проверки сканирует диски на наличие поврежденных секторов и автоматически восстанавливает их. Если она находит хорошие сектора, которые содержат неверные данные (данные в секторе не согласуются с тем, что это должно быть по данным с другого диска), то никаких действий не предпринимает, но событие регистрируется (см. ниже). Это позволяет администраторам проверять данные в секторе и полученные при восстановлении секторов из избыточной информации и выбирать те, что нужно хранить.

Как и во многих задачах, относящихся к mdadm, состояние scrub можно узнать, прочитав / proc / mdstat.

Пример:

cat /proc/mdstat 

Personalities : [raid6] [raid5] [raid4] [raid1]  

md0 : active raid1 sdb1[0] sdc1[1] 

      3906778112 blocks super 1.2 [2/2] [UU] 

      [>....................]  check =  4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec 

      bitmap: 0/30 pages [0KB], 65536KB chunk

Чтобы безопасно остановить текущий scrubbing данных:

echo idle > /sys/block/md0/md/sync_action

Примечание. Если система будет перезагружена после того, как частичный scrubbing был приостановлен, он начнется заново.

Когда scrubbing завершен, администраторы могут проверить, сколько блоков (если они есть) были помечены как плохие:

cat < /sys/block/md0/md/mismatch_cnt

Общие замечания по scrubbing:

В качестве альтернативы пользователи могут использовать восстановление в /sys/block/md0/md/sync_action, но это не рекомендуется, поскольку в случае обнаружения несоответствия в данных они будут автоматически обновляться. Опасность заключается в том, что мы действительно не знаем, является ли правильным паритет или блок данных (или какой блок данных в случае RAID1). И получит ли операция правильные данные вместо неверных.

Хорошей идеей будет установить задание cron как root для планирования периодической очистки. Смотрите raid-check, который может помочь с этим. Чтобы выполнить периодическую очистку с использованием systemd таймеров вместо cron, см. раздел raid-check-systemd, который содержит тот же сценарий вместе со связанными файлами модулей таймера systemd.

Для типичных массивов с жесткими дисками scrubbing может занимать приблизительно шесть секунд на гигабайт (то есть один час сорок пять минут на терабайт), поэтому спланируйте запуск задания cron или таймера соответствующим образом.

Заметки по scrubbing для RAID1 и RAID10

Из-за того, что записи RAID1 и RAID10 в ядре не буферизованы, массив может иметь ненулевое число несоответствий, даже если он исправен. Эти ненулевые значения будут существовать только в переходных областях данных, где они не представляют проблемы. Но мы не можем определить разницу между счетчиком, отличным от 0, который находится просто в переходных данных, и счетчиком, отличным от 0, который указывает на реальную проблему. Это является источником ложных срабатываний для массивов RAID1 и RAID10. Тем не менее по-прежнему рекомендуется регулярно выполнять очистку, чтобы обнаруживать и исправлять любые поврежденные сектора в устройствах.

Удаление устройств из массива

Можно удалить устройство из массива, сначала пометив его как неисправное:

mdadm --fail /dev/md0 /dev/sdX

И уже после непосредственно удалить из массива:

mdadm --remove /dev/md0 /dev/sdX

Для удаления устройства навсегда (например, чтобы использовать его отдельно с этого момента): введите две команды, описанные выше, затем:

mdadm --zero-superblock /dev/sdX

Предупреждение:

  • Не вводите эту команду для линейных массивов или массивов RAID0, иначе произойдет потеря данных!
  • Повторное использование удаленного диска без обнуления суперблока приведет к потере всех данных при следующей загрузке. (после того как mdadm попытается использовать его как часть массива raid).

Для того чтобы прекратить использовать массив:

  1. Отмонтируйте его.
  1. Остановите массив с помощью команды: mdadm —stop /dev/md0.
  1. Повторите три команды, описанные в начале этого раздела, на каждом устройстве.
  1. Удалите соответствующую строку из /etc/mdadm.conf.

Добавление нового устройства в массив

Добавление новых устройств с помощью mdadm можно выполнить в работающей системе с подключенными устройствами. Разбейте новое устройство, используя ту же схему, что и в массивах, как описано выше.

Соберите массив RAID, если он еще не собран:

mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1

Добавьте новое устройство в массив:

mdadm --add /dev/md0 /dev/sdc1

Это не должно занять много времени для mdadm.

В зависимости от типа RAID (например, с RAID1), mdadm может добавить устройство в качестве запасного без синхронизации данных на нем. Вы можете увеличить количество дисков, используемых RAID, при помощи —grow с опцией —raid-devices. Например, чтобы увеличить массив до четырех дисков:

mdadm --grow /dev/md0 --raid-devices=4

И наблюдать за прогрессом добавления:

cat < /proc/mdstat

Проверить, что устройство было добавлено к массиву, можно командой:

mdadm --misc --detail /dev/md0

Примечание: для массивов RAID0 вы можете получить следующее сообщение об ошибке:

mdadm: add new device failed for /dev/sdc1 as 2: Invalid argument

Это связано с тем, что приведенные выше команды добавят новый диск как «запасной», но RAID0 не имеет резервных дисков. Если вы хотите добавить устройство в массив RAID0, вам нужно «увеличить» его и «добавить» командой, показанной ниже:

mdadm --grow /dev/md0 --raid-devices=3 --add /dev/sdc1

Увеличение размера тома RAID

Если в массиве RAID установлены диски большего размера или размер раздела увеличен, есть возможность увеличить том RAID, чтобы заполнить больший доступный объем. Этот процесс можно начать, следуя приведенным командам для замены дисков. После того, как том RAID был перестроен на большие диски, его необходимо «увеличить», чтобы заполнить пространство.

mdadm --grow /dev/md0 --size=max

Затем, возможно, потребуется изменить размер разделов на томе RAID / dev / md0. Наконец нужно изменить файловую систему в разделе. Если разбиение делали с помощью gparted, это произойдет автоматически. Если использовали другие инструменты, размонтируйте, а затем измените размер файловой системы вручную.

umount /storage 

fsck.ext4 -f /dev/md0p1 

resize2fs /dev/md0p1

Изменение ограничения скорости синхронизации

Синхронизация может занять некоторое время. Если машина не нужна для других задач, ограничение скорости можно увеличить.

Проверьте текущий предел скорости:

cat < /proc/sys/dev/raid/speed_limit_min 

1000 

cat < /proc/sys/dev/raid/speed_limit_max 

200000

Увеличим имеющиеся лимиты:

echo 400000 >/proc/sys/dev/raid/speed_limit_min 

echo 400000 >/proc/sys/dev/raid/speed_limit_max 

Затем проверьте скорость синхронизации и примерное время окончания. 

cat /proc/mdstat 




 Personalities : [raid1] 

 md0 : active raid1 sda3[2] sdb3[1] 

       155042219 blocks super 1.2 [2/1] [_U] 

       [>....................]  recovery =  1.3% (2136640/155042219) finish=158.2min speed=16102K/sec 




 unused devices: <none>

Используя sysctl, также можно изменить нижний и верхний предел скорости./etc/sysctl.d/md_speedX

# Set maximum and minimum speed of raid resyncing operations 

dev.raid.speed_limit_max = 10000 

dev.raid.speed_limit_min = 1000

Если mdadm скомпилирован как модуль md_mod, эти настройки доступны только после его загрузки. Если настройки должны быть загружены через /etc/sysctl.d, модуль md_mod может быть загружен заранее через /etc/modules-load.d.

Мониторинг

Простой однострочник, который распечатывает состояние устройств RAID:

awk '/^md/ {printf "%s: ", $1}; /blocks/ {print $NF}' </proc/mdstat 





md1: [UU] 

md0: [UU]

Наблюдение за mdstat

watch -t 'cat /proc/mdstat'

Если желаете, с использованием Tmux:

tmux split-window -l 12 "watch -t 'cat /proc/mdstat'"

Отслеживание ввода-вывода с iotop

Пакет iotop отображает статистику ввода / вывода для процессов. Используйте эту команду для просмотра ввода-вывода для потоков RAID.

iotop -a -p $(sed 's, , -p ,g' <<<pgrep "_raid|_resync|jbd2")

Отслеживание ввода-вывода с iostat

Утилита iostat из пакета sysstat отображает статистику ввода / вывода для устройств и разделов.

iostat -dmy 1 /dev/md0 

iostat -dmy 1 # all

Рассылка по событиям

Для этого требуется почтовый сервер smtp (sendmail) или хотя бы сервер пересылки электронной почты (ssmtp / msmtp). Возможно, самое простое решение — это использовать пакет dma, он очень маленький (устанавливает до 0,08 МБ) и не требует настройки.

Отредактируйте /etc/mdadm.conf, указав адрес электронной почты, на который будут поступать уведомления.

Примечание: При использовании dma пользователи могут просто отправлять почту непосредственно на имя пользователя на локальном хосте, а не на внешний адрес электронной почты.

Для тестирования конфигурации:

mdadm --monitor --scan --oneshot --test

mdadm включает в себя mdmonitor.service для мониторинга, поэтому вам больше нечего делать. Если вы не зададите адрес электронной почты в /etc/mdadm.conf, эта служба не будет работать. Если вы не хотите получать почту о событиях mdadm, сбой можно игнорировать; если вы не хотите получать уведомления и чувствительны к сообщениям об ошибках, вы можете замаскировать устройство.

Альтернативный метод

Чтобы избежать установки почтового сервера smtp или сервера пересылки электронной почты, вы можете использовать инструмент S-nail (не забудьте настроить), уже установленный в вашей системе.

Создайте файл с именем /etc/mdadm_warning.sh:

#!/bin/bash 

event=$1 

device=$2 




echo " " | /usr/bin/mailx -s "$event on $device" '''destination@email.com'''

И дайте ему разрешение на выполнение chmod + x /etc/mdadm_warning.sh.Затем добавьте это в mdadm.conf

PROGRAM /etc/mdadm_warning.sh

Для тестирования и включения используйте те же операции, что и в предыдущем методе.

Отладка

Если вы получаете сообщение об ошибке, когда перезагружаетесь из-за «недопустимой магии суперблока raid», и у вас есть дополнительные жесткие диски, отличные от тех, на которые вы установили, убедитесь, что порядок этих дисков правильный. Во время установки RAID-устройства могут быть hdd, hde и hdf, но во время загрузки — hda, hdb и hdc. Отрегулируйте строку ядра соответственно.

Error: «kernel: ataX.00: revalidation failed»

Если у вас внезапно появляются сообщения об ошибках типа:

Feb  9 08:15:46 hostserver kernel: ata8.00: revalidation failed (errno=-5)

Это не обязательно означает, что диск сломан. Возможно, вы просто изменили настройки APIC или ACPI в параметрах BIOS или ядра. Поменяйте их обратно, и все будет хорошо. Обычно должно помочь отключение ACPI и / или ACPI.

Запуск массивов только для чтения

Когда запускается массив md, суперблок будет записан, и может начаться повторная синхронизация. Для запуска только для чтения установите в модуле ядра параметр md_mod start_ro. После этого новые массивы получают режим ‘auto-ro’, который отключает все внутренние операции ввода-вывода (обновления суперблока, повторную синхронизацию, восстановление) и автоматически переключается на ‘rw’, когда поступает первый запрос на запись.

Примечание: массив может быть переведен в режим ‘только чтение’ с использованием mdadm —readonly перед первым запросом на запись. Повторная синхронизация может быть запущена без записи с использованием mdadm —readwrite.

Для установки параметра при загрузке добавьте md_mod.start_ro=1 к строке ядра.

Или установите его во время загрузки модуля из файла /etc/modprobe.d/ или непосредственно из /sys/:

echo 1 > /sys/module/md_mod/parameters/start_ro

Восстановление из сломанного или пропавшего диска в RAID

Вы можете получить вышеупомянутую ошибку, когда один из дисков ломается. В этом случае вам придется заставить raid по-прежнему включаться даже без одного диска. Введите:

mdadm --manage /dev/md0 --run

Теперь вы сможете смонтировать его снова примерно так:

mount /dev/md0

Теперь рейд должен снова работать и быть доступным для использования, однако без одного диска! Добавьте один раздел диска. Как только это будет сделано, вы можете добавить новый диск в рейд, выполнив:

mdadm --manage --add /dev/md0 /dev/sdd1

Если вы пропишете:

cat < /proc/mdstat

Вы, вероятно, видите, что рейд сейчас активен и восстанавливается.

Вы также можете обновить свою конфигурацию.

Эталонное тестирование (Benchmarking)

Существует несколько инструментов для бенчмаркинга RAID. Самое заметное улучшение — это увеличение скорости при чтении нескольких потоков с одного тома RAID.

tiobench оценивает эти улучшения при помощи измерения полнопроточного ввода-вывода на диске.

bonnie++ проверяет модель базы данных, пробуя доступ к одному или нескольким файлам, а также создавая, читая и удаляя небольшие файлы, которые могут имитировать использование таких программ, как Squid, INN или директорию почтового ящика в формате электронной почты. Прилагаемая программа ZCAV проверяет производительность различных зон жесткого диска без записи данных.

hdparm не следует использовать для тестирования RAID, поскольку он дает противоречивые результаты.

И напоследок, несколько полезных ссылок:

mdadm

Forum threads

RAID with encryption

Linux/Fedora: Encrypt /home and swap over RAID with dm-crypt by Justin Wells

От редакции

Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN

*Анонсы мероприятий каждую неделю

Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.

Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.

Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.

Комментарии (3)
Введено символов из возможных
Не отвечать

Вам также может понравится

7 шагов HighLoad
array(1) { [0]=> object(WP_Term)#11247 (16) { ["term_id"]=> int(9) ["name"]=> string(8) "HighLoad" ["slug"]=> string(8) "highload" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(9) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(3) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(9) ["category_count"]=> int(3) ["category_description"]=> string(0) "" ["cat_name"]=> string(8) "HighLoad" ["category_nicename"]=> string(8) "highload" ["category_parent"]=> int(0) } } HighLoad

Автор - Александр Пряхин

Все! Хочу работать с высоконагруженными системами, - решили вы. Начинаю учиться.

Ну что ж, давайте попробуем. Разберем пошагово, какие этапы вам нужно пройти, чтобы стать специалистом по высоким нагрузкам.

Предположим, у нас есть проект. Сайт, который пропускает через себя за день очень много клиентов. Посмотрим,...

0
0
4 декабря 2020
Основы DevOps
array(1) { [0]=> object(WP_Term)#912 (16) { ["term_id"]=> int(7) ["name"]=> string(6) "DevOps" ["slug"]=> string(6) "devops" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(7) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(14) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(7) ["category_count"]=> int(14) ["category_description"]=> string(0) "" ["cat_name"]=> string(6) "DevOps" ["category_nicename"]=> string(6) "devops" ["category_parent"]=> int(0) } } DevOps

Появление DevOps в 2009 (хотя, по некоторым источникам, это все-таки было в 2008) в корне поменяло процесс взаимодействия между отделами разработки и эксплуатации. До этого момента это были два совершенно разные подразделения со своими целями, задачами и KPI. Как следствие, они не слишком вникали в деятельность друга и часто возникала абсолютно...

4
0
25 сентября 2020
Программный RAID в Linux. Часть 1
array(1) { [0]=> object(WP_Term)#11248 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(27) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(27) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

Автор — Максим Рязанов

Смотрите также — Wikipedia:RAID.

Избыточный массив независимых дисков (RAID) — это технология хранения, которая объединяет несколько компонентов дисков (как правило, дисководы или их разделы) в логическое устройство. В зависимости от реализации RAID эта логическая единица может быть файловой системой или дополнительным...

6
0
11 декабря 2020