Вопрос или проблема
Я хочу прервать выполняющуюся операцию ресинхронизации на программном RAID в Debian Squeeze. (Это регулярная запланированная проверка ресинхронизации. Массив RAID остается чистым в таком случае. Не путайте это с перестройкой после сбоя и замены диска.)
Как остановить эту запланированную операцию ресинхронизации, пока она выполняется? Другой массив RAID “ожидает ресинхронизацию”, потому что все они проверяются в один и тот же день (в воскресенье ночью) один за другим. Я хочу полностью остановить эту воскресную ночную ресинхронизацию.
[Редактировать: sudo kill -9 1010
не останавливает ее, 1010 – это PID процесса md2_resync]
Я также хотел бы узнать, как я могу контролировать интервалы между ресинхронизациями и оставшееся время до следующей.
[Редактировать2: Что я сделал сейчас – это замедлил процесс ресинхронизации, чтобы он больше не мешал:
sudo sysctl -w dev.raid.speed_limit_max=1000
взято с http://www.cyberciti.biz/tips/linux-raid-increase-resync-rebuild-speed.html
Ночью я установлю обратно на высокое значение, чтобы ресинхронизация могла завершиться.
Этот обходной путь приемлем для большинства ситуаций, тем не менее, было бы интересно узнать, возможно ли то, что я спрашивал. Например, кажется, что нельзя увеличить массив, пока он ресинхронизируется или “ожидает ресинхронизацию”]
Если ваш массив называется md0
, то echo "idle" > /sys/block/md0/md/sync_action
‘idle’ остановит активную
ресинхронизацию/восстановление и т.п. Однако нет
гарантии, что другая ресинхронизация/восстановление
не начнется автоматически снова, хотя для этого потребуется
какое-то событие.
Я хотел замедлить или приостановить процесс ресинхронизации, чтобы сэкономить некотоыре ресурсы для резервного копирования данных на другом компьютере. Этот поток помог мне, но я нашел другое решение.
На моем Debian Lenny :
-
echo "idle" > /sys/block/md0/md/sync_action
работает, но процесс ресинхронизации тут же перезапускается. -
checkarray -x --all
: работает, но тот же результат: процесс ресинхронизации тут же перезапускается.
Так что я использую этот метод:
echo 0 > /proc/sys/dev/raid/speed_limit_max
Вы можете отменить текущую ресинхронизацию массива, используя следующую последовательность команд (от root):
echo frozen > /sys/block/md0/md/sync_action
echo none > /sys/block/md0/md/resync_start
echo idle > /sys/block/md0/md/sync_action
Обратите внимание, что это может оставить ваш массив в несогласованном состоянии. Не делайте этого, если вы не уверены, что массив в хорошем состоянии, и повторите синхронизацию позже.
(Признание там, где оно заслужено: нашел эту инкапсуляцию в этом потоке.)
Как уже упоминалось выше, на системах Debian/Ubuntu скрипт /etc/cron.d/mdadm
вызывает скрипт /usr/share/mdadm/checkarray
для запуска проверок ресинхронизации.
В этом скрипте есть опция для отмены всех запущенных проверок синхронизации:
/usr/share/mdadm/checkarray -x --all
Возможное решение для этого, потребовалось немного времени, чтобы вникнуть в детали.
Моя система: CentOS 6.5
mdadm v3.3.2
Постоянные проверки каждую неделю, хотел приостановить одну из них, RAID чистый, проверка была вызвана через скрипт /etc/cron.d/raid-check, который запускается еженедельно.
Чтобы отменить проверку, используйте функцию –misc –action. Предположим, устройство RAID – /dev/md0, и это просто еженедельная проверка консистентности, а не сбой устройства, тогда вы, от root:
mdadm –misc –action=idle /dev/md0
Аналогично, для начала проверки консистентности
mdadm –misc –action=check /dev/md0
Не уверен, как отменить ресинхронизацию, но расписание контролируется файлом /etc/cron.d/mdadm
на системах Debian/Ubuntu.
Скрипт /usr/share/mdadm/checkarray
может пролить свет на другую часть вашего вопроса, так как он вызывается cron.
Если ваше устройство md – это md0 и вы хотите остановить ресинхронизацию, напишите:
echo "idle" > /sys/block/md0/md/sync_action
echo "idle" > /sys/block/md0/md/sync_action
Не работает, когда /sys/block/md*/md/sync_action равно “resync” (в отличие от состояния “check” или “repair”). Вы можете отправить “idle” в файл sync_action, но это не влияет на прогресс. Этот файл документации ядра здесь неправильно утверждает, что это будет работать, но у меня это никогда не работало:
‘idle’ остановит активную ресинхронизацию/восстановление и т.п. Тем не менее, нет гарантии,
что другая ресинхронизация/восстановление не сможет начаться автоматически снова,
хотя для этого потребуется какое-то событие.
Я попробовал ответ от “@bill.rookard”: “mdadm --misc --action=idle /dev/md0
“, чтобы остановить текущий процесс восстановления, НО процесс восстановления не остановился (или возможно остановился и сразу же перезапустился).
Затем я проверил страницу руководства “mdadm”:
–action=… : Устанавливает “sync_action” для всех указанных md устройств на idle, frozen, check, repair. Установка в idle прервет любую текущую операцию, хотя некоторые действия могут автоматически перезапуститься. Установка в frozen прервет любую текущую операцию и гарантирует, что никакая другая операция не запустится автоматически.
И, наконец, выполнение: “mdadm --misc --action=frozen /dev/md0
” остановило восстановление. Я смог перезагрузиться и выполнить обслуживание сервера. И после возврата в онлайн: “mdadm --misc --action=check /dev/md0
” продолжило процесс восстановления с того места, где он был прекращен. Все в порядке.
Я знаю, что это сообщение было опубликовано 4 года назад, но вы также можете сделать следующее (предполагая, что md0 – массив, а sdb4 – “диск”, находящийся в процессе ресинхронизации):
mdadm /dev/md0 --fail /dev/sdb4 && mdadm /dev/md0 --remove /dev/sdb4
Эта команда притворяется, что sdb4 – это сбойный диск, и поэтому исключает его из массива, останавливая ресинхронизацию. Если при остановке ресинхронизации ошибок не произошло, эта команда также удалит sdb4 из массива md0. Если произошла какая-либо ошибка, то диск остается в состоянии сбоя, но остается в массиве.
Если вы допускаете сбой на диске в любом месте в mdadm
, вы устанавливаете его логически в состояние сбоя. Если массив был чистым (не в деградированном состоянии), то диск остается согласованным и может быть повторно добавлен с помощью опции –add << disk >> –assume-clean без страха. Если после его отключения было предпринято любое действие (например, ресинхронизация, перестройка или даже запись), то –assume-clean, вероятно, даст сбой и сразу же начнется действие ресинхронизации.
Изменение raid.speed_limit_min
и raid.speed_limit_max
– это в некотором роде плохая идея, потому что это влияет не только на скорости ресинхронизации/перестройки, но и на скорости обычных операций, и, вероятно, вы потеряете много производительности, полученной с помощью RAID массивов.
.
Ответ или решение
Прервание процесса ресинхронизации программного RAID на операционной системе Debian Squeeze может быть полезным при необходимости оптимизации использования системы, особенно когда системные ресурсы перенапряжены или требуется выполнить другое критически важное действие. В данном ответе я предложу подробное руководство, основанное на вашем описании проблемы и дополню его другими полезными сведениями.
Теория
Программный RAID в Linux использует mdadm, популярное и мощное ПО для управления RAID-массивами. Оно позволяет администраторам контролировать различные аспекты функционирования RAID, включая запуск и прерывание операций ресинхронизации, которые могут запускаться автоматически в соответствии с заданным расписанием через cron.
При проведении регулярных проверок, таких как "compare resync", RAID-устройство остаётся в "чистом" состоянии, что делает возможным приостановку процесса без риска потери данных. Однако важно понимать, что попытка прервать ресинхронизацию может повлечь за собой необходимость выполнения повторной синхронизации позже для поддержания консистентности данных.
Пример
Рассмотрим несколько способов, которые позволяют прервать ресинхронизацию:
-
Настройка через sysfs:
Вы можете использовать
sysfs
интерфейс для изменения состоянияsync_action
для вашего RAID-устройства. Например, если ваше устройство —md0
, вы можете ввести следующую команду:echo "idle" > /sys/block/md0/md/sync_action
У некоторых пользователей, однако, этот метод не всегда ожидаемо завершает ресинхронизацию, так как она может автоматически перезапуститься. Альтернативным подходом может быть установка состояния в
"frozen"
:echo "frozen" > /sys/block/md0/md/sync_action
Этот метод примораживает текущую операцию и предотвращает автоматический запуск новой.
-
Использование mdadm:
Для более удобного управления можно использовать
mdadm
с опцией действия:mdadm --misc --action=frozen /dev/md0
Это действие установит состояние
sync_action
устройства в "frozen", что, как правило, гарантирует остановку текущей ресинхронизации без её автоматического перезапуска. -
Регулировка скорости:
Если цель состоит в снижении нагрузки на систему без полной остановки процесса, можно изменить лимиты скорости ресинхронизации с помощью команды:
sudo sysctl -w dev.raid.speed_limit_max=1000
Это поможет замедлить процесс и освободить системные ресурсы, сохранив процесс ресинхронизации активным. Позднее лимиты можно увеличить для завершения операции.
-
Управление через cron:
Необходимо также обратить внимание на расписание запуска проверок через cron. Обычно, на системах Debian/Ubuntu скрипт
/etc/cron.d/mdadm
вызывает/usr/share/mdadm/checkarray
. Если необходимо предотвратить автоматический запуск проверок, редактирование или временное отключение этой задачи в cron может быть полезным.
Применение
Теперь, применяя вышеизложенные способы, вы можете адаптировать их под ваши нужды. Например, если у вас есть задача:
-
Прервать текущую ресинхронизацию, не затрагивая данные, можно использовать комбинацию
mdadm --action=frozen
для остановки иmdadm --action=check
для последующего восстановления процесса. -
Для постоянной оптимизации системы вы можете настроить cron на запуск в менее активные часы или полностью отключить автоматическую проверку после оценки соответствующих рисков.
Не забывайте, что вмешательство в операции RAID всегда требует осторожного подхода и понимания возможных последствий. Регулярные бэкапы и знание состояния массивов могут существенно уменьшить риск потери важной информации.