Эксплуатация Ceph: что такое Scrub и как им управлять
Scrub — это процесс фоновой проверки консистентности данных в Ceph. Он позволяет выявить и устранить несоответствия в копиях, а также найти рассыпающиеся диски, чтобы вовремя их заменить. При этом сам Scrub может создавать высокую нагрузку на кластер и мешать другим процессам. Сегодня расскажем о настройках, которые помогут оптимизировать его работу и сделать нагрузку практически незаметной.
Статья подготовлена на основе лекции Александра Руденко, ведущего инженера в группе разработки «Облака КРОК». Лекция доступна в рамках курса по Ceph в «Слёрме».
Как работает Scrub
Scrub или scrubbing — это специальный фоновый процесс, который проверяет консистентность данных в placement group. Например, есть пул с тройной репликацией, то есть одна placement group в нём имеет три копии. Данные в этих копиях должны быть полностью идентичны, что и проверяет Scrub.
Если Scrub обнаруживает расхождения (например, в какой-то placement group объект имеет контрольную сумму не такую, как на двух других, либо вообще отсутствует), то возникает ошибка, администратор о ней узнаёт и может исправить.
В Erasure coded pool нет копий, но принцип тот же: Scrub выявляет расхождения в данных, неконсистентность, возникшую по тем или иным причинам. Одна из основных причин — «тихие» повреждения магнитных дисков. Вчера вы записали данные, а сегодня некоторые секторы на диске посыпались и данные оказались повреждены.
Scrub бывает двух типов: обычный и глубокий.
В примере на скриншоте четыре placement groups находятся в состоянии scrubbing, и они же находятся в состоянии scrubbing+deep. «Deep» — это значит глубокий Scrub.

Сначала всегда выполняется обычный Scrub, и только если он завершился успешно, запускается глубокий.
Обычный Scrub проверяет атрибуты и размер объектов. Он проходит быстро и незаметно с точки зрения нагрузки.
Глубокий Scrub читает практически каждый байтик объектов и сверяет их на всех OSD в рамках проверки одной placement group. То есть все данные читаются, проверяются их контрольные суммы и контрольные суммы сверяются. Это достаточно затратный по ресурсам процесс. Он может затрагивать несколько placement group сразу. В примере выше параллельно проверяются данные четырёх placement groups.
Максимальная частота проверки одной placement group — раз в сутки, чаще Scrub не запускается. При этом у процесса есть дедлайн: одна placement group должна быть проверена в течение недели. То есть Scrub может проходить раз в сутки, но не реже раза в семь дней. Если placement group не проверялась больше семи дней, то возникает сообщение об ошибке.
Пример такого сообщения на скриншоте. Здесь показано, сколько placement group не успело пройти проверку в отведённые 7 дней.

Когда Scrub находит различие в данных в одной placement group, возникает такая ошибка:

Первая строчка показывает, что есть ошибки scrub error, и сколько их. Вторая строчка говорит, в скольки placement group обнаружена неконсистентность данных. Такие алерты может выдавать только Scrub. По-другому вы не узнаете, что placement group в неконсистентном состоянии.
Фактически алерт говорит: по какой-то причине данные некорректно записались на одну OSD и нужно запустить процесс repair — восстановление консистентности.
Мы считаем процесс Scrub очень важным ещё и потому, что он позволяет выявлять повреждения дисков.
Во время проверки данные placement group читаются целиком. То есть в течение 7 дней 100% данных кластера оказываются прочитаны и сверены на разных OSD. В результате мы получаем проверку состояния дисков: способны ли они отдавать данные, работает ли чтение с них.
Scrub читает данные, которые пользователь, возможно, не читал несколько месяцев и не будет читать ещё год. Если при чтении на диске возникает проблема (например, сектор магнитного диска отказал), то это провоцирует ошибку.
В логе ядра Linux мы видим ошибку типа input/output error. Ceph сообщает, что возникла ошибка при проверке. В мониторинге появляется алерт, в котором фигурирует идентификатор диска. Мы понимаем, что на нём возникли input/output-ошибки, внимательно его смотрим и практически всегда меняем.
Управление проверкой
Если Scrub заканчивается с ошибкой, нужно выяснить детали: какая именно placement group в неконсистентном состоянии и на каких OSD она сейчас находится. Сделать это можно следующей командой:
Вывод будет примерно такой:

После этого можно пойти в логи ядра конкретной OSD и проверить. Скорее всего там обнаружится ошибка ввода/вывода и станет понятно, что диск нужно менять.
Чтобы узнать, какую именно ошибку выдал Scrub, используйте команду:
В длинном выводе будет примерно такая секция, как на скриншоте ниже. В ней показаны OSD и состояния проблемного объекта на них.
На скриншоте видно, что на двух OSD (875 и 925), в том числе и на primary, объект есть, у него есть есть контрольная сумма, а вот на третьей (463) его просто нет.
Когда есть primary-копия, и она корректная, можно запустить восстановление командой:
Процесс repair может идти несколько часов. После этого в логе Ceph можно будет найти эту placement group по id и увидеть результат восстановления. Там будет написано, сколько ошибок исправлено, а сколько нет. Но когда большинство данных в порядке и повреждена только одна копия, процесс repair без проблем восстанавливает объект, беря его из primary OSD.
Оптимизация проверки
При всей полезности у скраббинга есть недостаток — он создаёт большую нагрузку. Когда идёт глубокий Scrub, данные из placement group читаются, чтение этих данных никак не отражается в системах мониторинга (это внутреннее io) и этот идущий Scrub может создавать нагрузку сам по себе. Раньше это была колоссальная нагрузка.
Кластеры на более ранних версиях сильно страдали от проверки. Scrub был невероятной проблемой. Можно было встретить много статей, как его лимитировать, чтобы он шёл медленнее и не создавал такую нагрузку.
Сейчас Scrub в Ceph стал более интеллектуальным, к нему прикрутили много параметров, которые позволяют его оптимизировать и практически в любом кластере сделать так, чтобы нагрузка от него не была сильно заметна.
Рассмотрим некоторые из этих параметров. Посмотрим на osd параметры, в которых есть слово “scrub”, так увидим все связанные с ним настройки.

“osd_max_scrubs” — определяет, сколько placement group может параллельно «скрабить» одна OSD. По умолчанию стоит значение “1”, то есть Scrub максимально зажат.
Есть параметры, которые полезно настроить с самого начала:
“osd_scrub_begin_hour” и “osd_scrub_end_hour”. В нашем примере в первом параметре стоит значение “0”, во втором “24”, то есть процессу разрешено идти в любое время.
Поменяем значения: поставим время начала “02”, время окончания “08”:
Таким образом мы задаём желательный интервал времени для проверки.
Но есть важный момент: это будет работать хорошо только поначалу. Как только какие-то placement group не смогут из-за этого интервала успевать «скрабиться» в течение недели, Scrub будет запускаться сразу по истечении недельного срока, независимо от ограничений по времени. Дедлайн для Scrub критичнее, чем эти интервалы.
Иными словами, этими параметрами вы задаёте время, когда вы хотели бы, чтобы Ceph делал Scrub, если он может это делать. Если у него настал дедлайн для какой-то placement group, то он проигнорирует интервалы, потому что дедлайн критичен.
“osd_scrub_sleep” — ещё один важный параметр. Для обычного скраба его значение “0.00000”. Можно задать “0.1”, хотя для обычного Scrub это не особо важно.
“osd_debug_deep_scrub_sleep” — задаёт sleep для Deep Scrub. По умолчанию его значение тоже “0”, но мы его у себя ставим “0.2”.
Меняется значение параметра аналогично:
Нужно понимать, что настройки Scrub в каждом кластере индивидуальны. Очень большие кластеры могут даже с дефолтными настройками не испытывать проблем. На кластерах меньшего размера он может быть заметен сильно. А если это кластер небольшого размера и у него ещё очень интенсивное io, то Scrub может быть проблемой.
“osd_scrub_chunk_max” и “osd_scrub_chunk_min” — это самые важные параметры, определяющие интенсивность проверки; то, что сильно зажимает или отпускает Scrub.
Если задать такое значение, то интенсивность идущего скраба упадёт в 5 раз — настолько медленнее будут читаться данные.
Хотя скорее всего, вы не заметите никакого эффекта, но получите алерты о том, что placement group не успевают пройти Scrub вовремя. Просто потому что слишком мало объектов берётся за одну итерацию, слишком медленное чтение.
Этими параметрами вы можете играть, задавая различные значения, чтобы достигнуть того баланса, когда Scrub успевает проходить за неделю и при этом не создаёт видимой нагрузки. Они меняются на лету, и вы можете ими в любой момент ускорять или зажимать Scrub.
“osd_scrub_auto_repair” — ещё один интересный параметр. В начале статьи вы видели ошибку о том, что placement group в состоянии inconsistent. Если в значении этого параметра поставить “false”, то Ceph запустит repair на эту placement group, но только если количество ошибок до 5. Если ошибок больше, то он не запустит автоматический repair, будет висеть ошибка, и вам надо будет посмотреть, что же произошло. Ceph считает, что повреждённых объектов слишком много, чтобы их автоматически чинить. Нужно разобраться, в чём дело.
“osd_scrub_during_recovery” — это относительно новый параметр. Если он активирован, то Scrub не будет запускаться, когда на OSD запущен backfilling, то есть идёт recovery io. Если у вас будет настроен когда-нибудь мониторинг текущего количества скрабов, то вы сможете увидеть, как во время запущенного rebalance график скрабов начинает стремительно снижаться.
Scrubbing io старается не конфликтовать с recovery io, и это ещё одна причина, по которой Scrub может откладываться. Если вы в течение недели делаете сильный rebalance — увеличиваете число placement group, добавляете сервер — Scrub откладывается, и через неделю вы получите множество сообщений о том, что Scrub не успел пройти за неделю, и вам нужно будет его либо ускорить, либо ждать, пока он «рассосётся».
Общая рекомендация: если вы видите проблему аномальной производительности в кластере и не понимаете, в чём дело, вы всегда можете отключить Scrub с помощью флагов:
Кроме того, скраб можно отключать для конкретного пула. Если у вас несколько пулов, и вы хотите для конкретного пула отключить скраб, то это можно сделать командой:
Флаги отразятся в cluster health:

Эти флаги блокируют новый Scrub, но уже запущенные проверки не отклоняются и будут завершены. Когда текущие проверки закончатся, вы сможете оценить, изменилась ли ситуация с производительностью.
Если проблема исчезла, значит вам нужно немного зажать Scrub. Если сохранилась, то дело не в Scrub, его можно запускать снова и искать другую причину аномальной производительности.
Конфигурируем дисковые системы HP StorageWorks MSA 2000sa
Виртуальный диск (vdisk) — это группа дисков, объединенных в RAID-группу, при этом отдельные виртуальные диски могут формироваться различным уровнем RAID. В состав виртуального диска могут входить либо устройства SATA, либо SAS. но смешивать их нельзя. В системе HP StorageWorks MSA2000 может быть до 16 виртуальных дисков на контроллер — максимум 32 виртуальных диска в двухконтроллерной конфигурации.
Создавая дисковые группы, виртуальные диски целесообразнее укрупнять, а не дробить. В RAID 3-конфигурациях с точки зрения эффективного использования пространства иметь много " мелких" виртуальных дисков неэффективно -если в группе из двенадцати дисков служебным (на нем хранятся контрольные суммы) является только один, а одиннадцать заняты данными, то в четырех группах, содержащих по три диска, служебных будет уже четыре, а «полезных» — восемь.
Объем виртуального диска может превышать 2 Гбайт, поэтому, создавая диски большого объема в массивах RAID с контролем четности, число служебных дисков можно сократить, однако в общем случае для работы с логическими томами объемом свыше 2 Тбайт могут потребоваться специальные версии операционных систем, адаптеров НВА и поддержка прикладных программ.
Кстати, устройство MSA2000sa поддерживает виртуальные диски объемом до 16 Тбайт. В RAID 0,3,5,6, 10 может быть до 16 дисков (1 Тбайт на устройство SATA, или всего 16 Тбайт). В RAID 50 может быть до 32 дисков (1 Тбайт на устройство SATA, или всего 32 Тбайт).
При организации больших объемов внешней памяти следует тщательно взвесить преимущества и недостатки нескольких укрупненных виртуальных дисков по сравнению с большим числом менее «емких» виртуальных дисков с меньшим количеством накопителей. Чтобы увеличить КПД дисковой памяти (но не производительность), можно создать виртуальные диски объемом больше 2 Тбайт и разделить их на несколько логических томов объемом до 2 Тбайт. Максимально поддерживаемый объем виртуального диска определяется произведением количества дисковых устройств в данной конфигурации RAID на наибольший объем одного устройства.
Лучше всего добавлять виртуальные диски, распределяя их равномерно по обоим контроллерам. Если к каждому контроллеру подсоединить хотя бы по одному виртуальному диску, контроллеры начинают работать по принципy «активный-активный» (active-active). Подобная конфигурация обеспечивает эффективность использования ресурсов в случае применения двух контроллеров в системе хранения MSA2000sa. Кроме того, для предотвращения потери данных при отказе дисковой полки (shelf enclosure) надо целиком сделать «страйпинг» (stripe) виртуальных дисков по нескольким дисковым полкам. Виртуальный диск с конфигурацией RAID 1,10,3,5,50 в зависимости от числа задействованных дисковых полок может противостоять угрозе потери данных при выходе из строя целой дисковой полки.
Создавая виртуальный диск, можно выбрать размер непрерывного фрагмента данных (chunk) по умолчанию или наилучшим образом подходящий для работы с приложением. Размер непрерывного фрагмента (stripe unit) — это количество расположенных друг за другом данных, записываемых на виртуальный диск, после создания которого эту характеристику уже изменить нельзя. Страйп — совокупность непрерывных фрагментов (stripe units), записываемых в одни и те же логические области каждого жесткого диска в составе виртуального. Параметры страйпинга определяются количеством физических жестких дисков в составе виртуального диска. Эти параметры могут меняться. Допустимы значения 16,32 и 64 Кбайт (значение по умолчанию). Например, если хост-сервер отдает данные порциями по 16 Кбайт, то такой размер страйпа при случайном доступе обеспечит равномерное распределение нагрузки по операциям чтения между всеми устройствами, что положительно скажется на производительности. Если же данные запрашиваются по 16 Кбайт, а размер блока данных равен 64 Кбайт, то некоторые операции доступа будут обращаться к одному и тому же жесткому диску — каждый фрагмент страйпа включает в себя четыре возможные группы размером 16 Кбайт, к которым может обратиться хост-сервер, что нельзя признать оптимальным. С другой стороны, если доступ осуществлялся порциями по 128 Кбайт, то при чтении хост-серверу потребуется обращаться к обоим устройствам, составляющим виртуальный диск.
Рекомендуется устанавливать размер непрерывного фрагмента равным размеру блока данных, которым оперирует приложение.
Выбор уровня RAID для массива зависит от цели оптимизации конфигурации: повышение отказоустойчивости или повышение производительности. Если не требуется отказоустойчивость или производительность, обеспечиваемые применением групп RAID, то разумно воспользоваться конфигурациями без избыточности.
Вылечить Vdisk
Доброго дня.
Помогите советом — как вылечить vDisk собранный на СХД HP MSA2312sa
Сейчас состояние:
Health Fault
Health Reason The virtual disk is quarantined and is offline.
Name vd01
Size 3597.0GB
Free 0B
Current Owner A
Preferred Owner A
Serial Number 00c0ff1070e70000146b9d4d00000000
RAID RAID5
Disks 7
Spares 1
Chunk Size 64k
Created 2011-04-07 07:43:16
Minimum Disk Size 599.5GB
Status QTOF
Current Job
Команда Dequarantine приводит вот к такому сообщению:
Unable to dequarantine the vdisk.
Command failed.
Принимаю любые советы.
Спасибо.
Stranger03 Сотрудник Тринити
Сообщения: 12979 Зарегистрирован: 14 ноя 2003, 16:25 Откуда: СПб, Екатеринбург Контактная информация:
HP MSA2000, как обнаружить неисправные диски?
У меня HP MSA2012fc, несколько раз случалось, что мой большой виртуальный диск (6x 1TB raid 5) отключался, кажется, что некоторые диски неисправны, журнал событий показывает только, что на 2 из дисков были «плохие блоки», а некоторые ошибки чтения диска сообщается в журнале событий, и некоторые другие диски попадают в оставшееся состояние без регистрации ошибок этими двумя. Кто-нибудь может подсказать, как сканировать все диски на наличие дефектов и замены, чтобы предотвратить будущие потери?
2 ответа
В вашей сети MSA2012/P2000 SAN должен быть включен запланированный фоновый процесс очистки. Если нет, его можно запустить вручную, выбрав виртуальный диск и выбрав «Media Scrub Vdisk«.
Что касается уведомлений, настройте параметры уведомлений по электронной почте в массиве. Это лучший способ получить информацию о неисправности от устройства.