Наблюдение за кластером¶
Страница для инженера эксплуатации: что проверять в первую очередь, как отличить исправный кластер от неисправного, где смотреть состояние дисков, групп размещения, свободного места и репликации между площадками. В конце — справочник метрик и сообщений журнала.
Как устранять найденное, описано на страницах Поведение при отказах, Действия с дисками, Контроль целостности и Диагностика неполадок.
Что проверять в первую очередь¶
У кластера четыре источника сведений о состоянии. Они отвечают на разные вопросы и доступны по-разному.
| Источник | Что показывает | Где и кому доступен |
|---|---|---|
GET /-/health |
инстанс принимает соединения на порту S3. Диски, группы размещения и фоновые процессы не проверяются | порт эндпоинта S3, без подписи и без аутентификации |
GET /-/ready |
инстанс готов обслуживать запросы: кластер прошёл начальное формирование, инстанс загрузил свои группы размещения | там же, без подписи и без аутентификации |
GET /v2/health, GET /v2/repair |
состояние всего кластера: сводка по подсистемам и четыре области контроля целостности (см. «Состояние по областям») | API управления на HTTP-порту Picodata; требуется аутентификация с ролью s3r_superuser или s3r_observer |
/metrics |
числовые ряды каждого инстанса (см. «Метрики») | HTTP-порт Picodata (instance.http_listen) |
Состояние отдельных таблиц читается запросами SQL (см. «Состояние кластера»), сообщения инстанса — в его журнале (см. «Журнал»).
«Процесс работает» не значит «инстанс готов»
Ответ /-/health подтверждает только работу слушателя S3. Готовность показывает /-/ready:
ответ 200 означает, что кластер прошёл начальное формирование, а инстанс загрузил свои
группы размещения. Балансировщик проверяет именно /-/ready (см.
«Балансировка нагрузки»). Состояние отдельных дисков на
ответ /-/ready не влияет, поэтому за дисками и группами следят по метрикам и по
GET /v2/repair.
Диагностические эндпоинты /-/debug/* и /-/bench/* тоже обслуживаются на порту S3 без подписи.
По умолчанию они выключены, а часть из них изменяет данные (см.
«Диагностические эндпоинты»).
Признаки исправного кластера¶
| Что смотреть | Исправный кластер | На что указывает отклонение |
|---|---|---|
GET /-/ready на каждом инстансе |
ответ 200 |
начальное формирование не завершено или инстанс не загрузил свои группы |
s3r_resync_outstanding с меткой kind |
0 | ресинхронизации ещё есть что исправить. Значение needs_resync — число групп, в которых участник хранит меньше, чем записано в каталоге (строках объектов в таблицах Picodata): обычно это замена диска, за которой ещё не поспело перестроение. Пока число не равно нулю, выведенный диск извлекать рано |
s3r_ec_reconstructions_total |
не растёт | полосы при чтении восстанавливаются из сохранившихся фрагментов |
s3r_scrub_inconsistent_total |
не растёт | расхождения данных чётности: ошибка записи или искажение данных |
s3r_worker_runs_total |
растёт, пока есть задания | если очередь растёт, а счётчик не меняется, фоновый процесс не выполняет задания |
Эти метрики контролируются в первую очередь. Остальные перечислены в разделе «Метрики»; там же названы готовые панель Grafana и правила Prometheus.
Состояние кластера¶
Диски и группы размещения описаны глобальными таблицами, и их состояние доступно через запросы SQL.
-- Диски, их принадлежность, домены отказа и ярусы
SELECT instance_name, path, site, failure_domain, tier, state,
capacity_bytes, extent_count
FROM s3r_disk
ORDER BY instance_name;
-- Состояние кластера, шаг начального формирования, площадки и записанные ярусы
SELECT state, step, state_changed_at, sites, founding_members, tiers FROM s3r_cluster;
-- Регистрация инстансов
SELECT instance_name, replicaset_name, failure_domain, reason, updated_at
FROM s3r_instance;
-- Группы размещения, их состояние, пределы и геометрия
SELECT pg_id, state, epoch, site, tier, k, m, stripe_bytes, owner, resynced_at_epoch,
limit_blocks_large, limit_blocks_small, members
FROM s3r_pg
ORDER BY pg_id;
-- Раскладка групп: номер в цепочке, позиции плана, выбывающие диски
SELECT pg_id, layout, n, intended, leaving, reform_requested FROM s3r_pg
ORDER BY pg_id;
-- Занятость дисков по числу экстентов
SELECT d.disk_id, d.extent_count, f.free_extents, d.state
FROM s3r_disk d JOIN s3r_disk_free f ON f.disk_id = d.disk_id
ORDER BY d.disk_id;
-- Распределение объектов тенанта 0 по способу хранения
SELECT encoding, count(*) FROM s3r_t0_object
WHERE part_no = 0 GROUP BY encoding;
-- Распределение объектов тенанта 0 по классам хранения S3
SELECT storage_class, count(*) FROM s3r_t0_object
WHERE part_no = 0 GROUP BY storage_class;
Таблицы объектов свои у каждого тенанта: в примерах
s3r_t0_object — таблица тенанта 0.
Состояния диска перечислены в разделе «Идентификация диска».
Группа размещения принимает записи в состоянии active, пока у неё есть
владелец и владелец закончил её монтирование (см.
«Группы размещения»).
Столбцы таблицы s3r_pg, по которым судят о состоянии группы:
| Столбец | Что означает |
|---|---|
limit_blocks_large, limit_blocks_small |
сколько блоков каждого класса группа выдаёт на каждом участнике |
epoch |
эпоха группы; увеличивается при смене состава группы |
resynced_at_epoch |
равен epoch, когда каждый участник сверен с владельцем и выделил свои экстенты, а отстающие экстенты проверены (см. «Контроль целостности»). После смены состава значения перестают совпадать. Запись, которой не хватило фрагмента, столбец не меняет |
extents_behind |
отстающие экстенты в виде [номер фрагмента, [[класс, номер экстента], …]]; NULL означает, что таких экстентов нет. Пока столбец не пуст, resynced_at_epoch пуст |
members |
участники группы по порядку: номер в массиве является номером фрагмента. Каждый элемент содержит диск, инстанс, состояние участника и номер форматирования диска |
leaving |
прежние диски, которые ещё не освободили экстенты группы |
Состояния участника в столбце members:
| Состояние | Что означает |
|---|---|
active |
обычное состояние |
new |
участник ещё не выделил все экстенты группы, например после замены выбывшего диска или после переформатирования диска. Его фрагменты не учитываются в кворуме записи |
draining |
участника переносит действие «Восстановить размещение» |
Занятость и освобождение места¶
Место, занятое удалённым объектом, освобождается не сразу и без участия администратора. Раздел объясняет, когда его ждать и что на это влияет.
Удаление объекта состоит из одной операции: строка объекта исключается из пространства имён. Очереди освобождения нет, фрагменты на дисках при этом не переписываются. Дальше место освобождается в три шага:
- Позиции блоков объекта становятся свободными. Это происходит, когда об удалении узнаёт владелец группы: он ведёт учёт занятых и свободных позиций блоков группы (вид группы). Удаляющий инстанс отправляет владельцу подсказку, и позиции блоков освобождаются сразу. Если подсказка потеряна, их освобождает ближайшая сверка вида группы с каталогом. Потеря подсказки стоит одной сверки и никогда не стоит места.
- Свободная позиция блока выдерживается
refill_after_sсекунд и только потом выдаётся под запись: клиент, который уже прочитал строку объекта, может ещё читать его фрагменты. - Экстент, все блоки которого свободны дольше
refill_after_s, возвращается в свободный пул диска, и группа больше его не использует. Процессextentgcпомечает такой экстент пустым к сроку, когда заканчивается карантин последнего освободившегося в нём блока, а процессgroupосвобождает его на участниках.
Примечание
Копирование на другую площадку читает полосу из очереди, а не в ходе запроса, поэтому задержка
refill_after_s её не защищает.
Свободные позиции блоков считает владелец группы:
-- Группы и их владельцы: свободные позиции блоков считает владелец
SELECT pg_id, tier, epoch, owner FROM s3r_pg ORDER BY pg_id;
Удаление тенанта¶
Удаление тенанта подсказок не отправляет: его таблицы удаляются целиком, и позиции блоков его объектов освобождает сверка. Когда сверку не запускает ни потеря подсказки, ни новая группа, она выполняется раз в час. Поэтому место удалённого тенанта освобождается в течение часа.
Очередь подсказок¶
Подсказки ждут отправки в очереди процесса chunkgc, которая вмещает 4096 сообщений. Сообщение,
которое не поместилось в очередь, теряется, и позиции блоков освобождает сверка.
Фоновые процессы, которые удаляют объекты, не заполняют очередь целиком: вторая её половина остаётся для удалений по запросам клиентов.
- Процессы
lifecycle,mpugc,transitionиdedupперед каждым шагом удаления проверяют очередь своего инстанса и продолжают работу, когда в ней остаётся половина сообщений или меньше. - Очистка удалённого бакета (процесс
bucketgc) и освобождение ссылок дедупликации при удалении тенанта удаляют строки на мастерах всех репликасетов, а координатор видит только свою очередь. Поэтому вызов координатора ждёт на мастере, пока очередь этого мастера заполнена больше чем наполовину, и удаляет следующую страницу, когда в очереди остаётся половина сообщений или меньше.
Ожидание на мастере ограничено сроком вызова. Если срок истёк, вызов ничего не удаляет, шаг процесса завершается ошибкой и бакет остаётся в очереди очистки. Процесс повторяет шаг по общему правилу, описанному в разделе «Фоновые процессы», и возвращается к этому бакету при следующем проходе по очереди.
Наблюдение за репликацией между площадками¶
Репликация между площадками отдельной настройки не
требует: площадка задаётся компонентом dc домена отказа
инстанса. Её устройство описано на страницах
Классы хранения и группы размещения и
Репликация между площадками.
-- Объекты тенанта 0, которые есть не на всех площадках
SELECT count(*) FROM s3r_t0_siterepl;
-- Карта размещения объекта по площадкам
SELECT name, placements FROM s3r_t0_object
WHERE name = 'report.pdf' AND part_no = 0;
Пустая таблица s3r_t<N>_siterepl означает, что у тенанта нет ожидающих копий на другие площадки.
Журнал¶
Плагин записывает сообщения в журнал инстанса Picodata и наследует уровень подробности от настройки Picodata. Уровни соответствуют уровням самой Picodata:
- при уровне
verboseвыводятся отладочные сообщения плагина, например о решениях фоновых процессов и о каждом перестроенном фрагменте; - при уровне
debug— ещё и сообщения о каждом соединении и запросе.
Сообщения, которые подтверждают штатный запуск:
| Сообщение | Значение |
|---|---|
s3r_storage started, configured with N disk(s), listening on ..., advertised as ... |
сервис принял конфигурацию; число дисков указано по конфигурации, до их монтирования |
disk <uuid> at <path> registered: tier ..., domain ... |
при первом запуске диск зарегистрирован в s3r_disk; указаны ярус и полный домен отказа |
disk <uuid> at <path> mounted: N bytes, M extents of E bytes, tier ... |
диск смонтирован для данных |
chunk endpoint serving on ... over mutual TLS |
узел принимает запросы обмена фрагментами; в конце указан режим шифрования |
the cluster moved to step forming, the cluster is active |
кластер перешёл на следующий шаг начального формирования или завершил его |
Сообщения, которые требуют внимания:
| Сообщение | Значение |
|---|---|
the cluster is new (registering) and waits for: ... (или new (forming)) |
начальное формирование ждёт; причины перечислены через точку с запятой (см. «Если установка не завершается») |
this instance's disk list registers nothing: ... |
список дисков инстанса отклонён при первом запуске |
this instance's disk list [...] differs from its registered disks [...] |
локальный список дисков после первой регистрации отличается от зарегистрированных дисков; инстанс работает с зарегистрированными дисками |
disk <id> is blank: ..., disk <id> is foreign: ..., disk <id> is corrupt: ... |
по пути диска нет его собственного накопителя; диск в названном состоянии |
the stored s3r_storage configuration breaks a rule: ... |
сохранённая конфигурация нарушает правило проверки (см. «Сервис s3r_storage») |
placement group N of <владелец> is asymmetric from birth: ... |
группа создана с заменой недоступной позиции плана (см. «Позиции и порядок групп») |
pg N: the re-form ends: ... |
действие «Восстановить размещение» для группы завершено, причина указана |
s3r_storage started with no disks and no listener; this instance stores nothing |
на инстансе нет дисков и слушателя s3r_storage |
Метрики¶
Плагин публикует метрики в формате Prometheus через эндпоинт Picodata /metrics. Каждый инстанс
публикует собственные ряды, а суммирование по кластеру выполняет Prometheus. Метки метрик имеют
ограниченное число значений, поэтому имя пользователя и имя бакета меткой не служат.
Метрики, которые контролируются в первую очередь, перечислены в разделе «Признаки исправного кластера».
В репозитории плагина поставляются:
- панель Grafana
deploy/grafana/s3r-dashboard.jsonиз четырёх рядов: обслуживание запросов, исправность кластера, нагрузка и свободное место; - правила Prometheus
deploy/prometheus/s3r-alerts.yml. Правила задают выражения, а условия оповещения определяет служба эксплуатации.
Ниже перечислены семейства метрик по сервисам. Тип указан словом: счётчик накапливает значение, датчик отражает текущее значение, гистограмма показывает распределение.
Сервис s3r_api¶
| Метрика | Метки | Значение |
|---|---|---|
s3r_requests_total |
op, status |
счётчик обслуженных запросов S3 |
s3r_request_duration_seconds |
op |
гистограмма длительности запроса |
s3r_request_bytes_total |
op, direction |
счётчик переданных байт объекта |
s3r_requests_in_flight |
— | датчик числа запросов в обработке |
s3r_admission_bytes |
— | датчик объёма памяти, занятой обрабатываемыми запросами |
s3r_admission_rejected_total |
— | счётчик запросов, отклонённых из-за ограничения памяти |
s3r_auth_failures_total |
reason |
счётчик отказов аутентификации и авторизации |
s3r_quota_rejected_total |
scope, limit |
отказы по квотам на число бакетов, число объектов и объём данных |
s3r_ratelimit_rejected_total |
scope |
отказы по ограничениям частоты запросов и скорости передачи |
s3r_get_bodies_cut_total |
cause |
счётчик ответов GetObject, тело которых оборвалось после отправки заголовков. Причины: unreadable (полосу не удалось прочитать, в том числе после удаления, перезаписи или переноса объекта на другой ярус во время медленного чтения), deadline (полоса не прочитана за read_timeout_s), memory (не хватило api_memory для частей с более крупными полосами), short (тело закончилось раньше Content-Length), failed (другая ошибка) |
s3r_class_refused_total |
storage_class |
отказы записи из-за отсутствия группы размещения для класса на площадке |
Сервис s3r_meta¶
| Метрика | Метки | Значение |
|---|---|---|
s3r_cas_retries_total |
operation |
повторы операции «сравнить и заменить» (CAS) из-за одновременного изменения данных |
s3r_cas_proposals_total |
operation |
операции «сравнить и заменить» (CAS), которые плагин предложил напрямую; изменения через SQL здесь не учитываются |
s3r_bridge_wait_seconds |
pool |
гистограмма ожидания задания в очереди к потоку TX, по пулу файберов (local, routed, catalog, background) |
s3r_meta_rpc_total |
op |
обращения за метаданными, пересланные через Picodata, как правило на другой инстанс; вместе с s3r_meta_rpc_in_place_total показывает, во сколько обращений обходится запись, в частности по одному на каждую директорию в пути ключа |
s3r_meta_rpc_in_place_total |
op |
обращения за метаданными, которые инстанс обслужил сам, без кодирования запроса и ответа: он мастер репликасета, где находится шард vshard этих метаданных, или его реплика при read_preference = any |
s3r_bridge_queue_depth |
pool |
датчик числа заданий в очереди к потоку TX, по пулу файберов (local, routed, catalog, background) |
s3r_bridge_rejected_total |
— | задания, отклонённые при остановке сервиса |
s3r_namespace_attr_bytes |
— | датчик объёма документов бакетов (политик, правил жизненного цикла и CORS, настроек сайта, тегов) в дереве состояния; предел 8 МиБ, документы сверх него читаются из таблицы |
s3r_tenants |
— | датчик числа тенантов в кластере |
s3r_state_builds_total |
— | сборки дерева состояния; каждая учитывает транзакции, подтверждённые после предыдущей |
s3r_state_publishes_total |
— | сборки дерева состояния, после которых опубликован новый корень |
s3r_state_build_seconds |
— | гистограмма времени потока TX на одну сборку дерева состояния; паузы, когда сборка уступает поток другим файберам, не учитываются |
s3r_state_undecodable_total |
table |
строки отслеживаемых таблиц, которые не удалось разобрать; дерево сохраняет их прежнее определение |
s3r_dedup_content_fingerprints |
— | датчик числа отпечатков содержимого в индексе дедупликации, которые хранит репликасет |
s3r_dedup_resolves_total |
found |
чтения объектов через общую копию содержимого; метка local означает, что общая копия находится на том же инстансе, routed означает одно обращение к инстансу с копией, no означает, что общей копии уже нет |
Значение датчика s3r_dedup_content_fingerprints показывает мастер репликасета: при каждом
опросе он читает число строк в своей части таблицы s3r_content_fingerprint. Реплика показывает
0, поэтому сумма значений по всем инстансам равна числу отпечатков содержимого в кластере.
Сервис s3r_storage¶
| Метрика | Метки | Значение |
|---|---|---|
s3r_disks |
— | датчик числа смонтированных дисков |
s3r_chunk_ops_total |
op, path, result |
операции обмена фрагментами, локально или по сети |
s3r_chunk_bytes_total |
path, direction |
объём фрагментов по пути и направлению |
s3r_chunk_network_seconds |
— | гистограмма времени сетевой операции с фрагментом |
s3r_disk_io_seconds |
disk, op |
гистограмма времени ввода-вывода на диск |
s3r_disk_capacity_bytes |
disk |
датчик ёмкости диска |
s3r_disk_io_time_seconds_total |
disk |
счётчик: время в секундах, когда в ядре была хотя бы одна операция ввода-вывода диска, от отправки до получения её результата. Скорость его роста (rate) показывает загрузку диска. Устроен как node_disk_io_time_seconds_total в node_exporter |
s3r_disk_io_time_weighted_seconds_total |
disk |
счётчик: то же время, умноженное на число операций в ядре. Отношение скоростей роста этого счётчика и s3r_disk_io_time_seconds_total равно среднему числу операций в ядре, пока там есть хотя бы одна: значение около единицы означает, что операции не перекрываются. В это число входят и операции, которые ждут рабочий поток ядра |
s3r_disk_io_bytes_total |
disk, op |
счётчик байтов, которые диск прочитал (read) или записал (write), включая заголовки и выравнивание. Заполнение экстента нулями учитывается как запись всего экстента, даже если нули записала файловая система. В отличие от счётчиков node_exporter, относится к диску s3r, даже если это раздел |
s3r_disk_io_retries_total |
disk, cause |
счётчик операций ввода-вывода, которые драйвер диска отправил повторно после временного отказа ядра. Причины: cancelled (ядро не смогло запустить поток для операции), busy (очередь завершений ядра переполнена), again (ядру не хватило памяти), interrupted (ожидание прервано сигналом), queue_full (очередь отправки заполнена). Рост cancelled означает, что процессу не хватает потоков: проверьте RLIMIT_NPROC и pids.max его контрольной группы |
s3r_disk_crc_failures_total |
disk |
счётчик фрагментов, которые диск прочитал, и заголовков экстентов, которые прочитало монтирование, не прошедших проверку контрольной суммы: повреждение данных на диске. Каждый такой фрагмент читается в обход и перестраивается, а учитывается один раз, пока на его место не записан новый. Если счётчик вырос за последний час, срабатывает правило S3rDiskBitrot; если он продолжает расти, проверьте счётчики ошибок самого накопителя и выведите диск |
s3r_disk_used_bytes |
disk |
датчик объёма, отданного группам размещения: экстенты, которые держат группы, умноженные на размер экстента. Это не число записанных байтов: экстент принадлежит группе с момента, когда он ей выделен, и другой группе уже не достанется |
s3r_extents |
disk, state |
датчик числа экстентов диска: allocated и free. Точен до процента от числа экстентов диска, а в последнем проценте точен полностью |
s3r_disks_drained |
— | датчик числа выведенных дисков, которые больше не входят ни в одну группу размещения и могут быть извлечены |
s3r_drains_waiting |
cause |
датчик числа участников на выводимых дисках, данные которых некуда перенести, по причинам: room (нет места), add_instance (нет инстанса в нужном домене отказа), set_failure_domain (не задан домен отказа), set_shape (не задана схема избыточности яруса), wait (диск или инстанс недоступен). Те же участники перечислены в области groups ответа GET /v2/repair. Значение относится ко всему кластеру, поэтому каждый экземпляр сообщает одно и то же. |
s3r_ec_reconstructions_total |
— | восстановления полосы из сохранившихся фрагментов |
s3r_placement_groups |
ownership |
датчик числа групп размещения по владению: owned, если у группы есть владелец, transferring, пока группа передаётся другому |
s3r_pg_lost |
— | датчик числа групп размещения, в которых сохранившихся участников меньше, чем требуется для чтения. Значение относится ко всему кластеру |
s3r_pg_degraded |
— | датчик числа групп размещения с пониженной избыточностью: сохранившихся участников меньше, чем фрагментов в полосе, но не меньше k. Не сохранившимся считается участник на вышедшем из строя или переформатированном диске, а также участник, поставленный на замену, пока процесс resync не проверит его отстающие экстенты: участник в состоянии new или с записью в списке extents_behind. Поэтому значение больше нуля во время каждой перестройки после отказа, переформатирования или вывода диска, а число групп, ожидающих ресинхронизации, показывает область data ответа GET /v2/repair. Участник на выводимом диске считается сохранившимся, пока не покинет группу. Это же число показывает строка placement ответа GET /v2/health. Если значение больше нуля дольше 15 минут, срабатывает правило S3rPlacementGroupDegraded. Значение относится ко всему кластеру |
s3r_pg_asymmetric |
site, tier |
датчик числа групп размещения, у которых хотя бы один участник стоит не на своей плановой позиции; такие группы возвращает на место только действие «Восстановить размещение» |
s3r_formation_step |
— | датчик шага начального формирования кластера: 0 означает регистрацию дисков, 1 означает формирование первых групп, 2 означает, что кластер в состоянии active и принимает запись |
s3r_damage_stripes |
— | датчик числа полос в реестре повреждённых полос: рассогласованных и утраченных |
s3r_tier_bytes_available |
tier |
датчик объёма объектов, который ещё можно записать в ярус. Он считается по свободным экстентам дисков, доступных группам размещения, и уже учитывает избыточность. Значение относится ко всему кластеру, поэтому каждый экземпляр сообщает одно и то же |
s3r_resync_outstanding |
kind |
датчик того, что ресинхронизации ещё предстоит исправить |
s3r_worker_runs_total |
worker, result |
шаги фоновых процессов |
s3r_worker_duration_seconds |
worker |
гистограмма длительности шага фонового процесса |
s3r_scrub_stripes_checked_total |
— | полосы контрольных сумм, проверенные по данным чётности |
s3r_scrub_inconsistent_total |
— | полосы с расхождением данных чётности |
s3r_chunks_put_back_total |
worker |
счётчик фрагментов, перестроенных и записанных туда, где их не оказалось, по процессам: scrub, resync, resync_queue, а также read, когда повреждение нашло чтение клиента. Повреждение данных на диске не включает, его учитывает s3r_disk_crc_failures_total |
s3r_scrub_groups |
tier |
датчик числа групп размещения яруса, проверку которых ведёт этот инстанс |
s3r_scrub_oldest_pass_timestamp_seconds |
tier |
время завершения последнего полного сканирования самой давно проверявшейся группы, в секундах с начала эпохи Unix. Учитываются только группы, закончившие хотя бы одну проверку: группа, не проверявшаяся ни разу, отставания яруса не создаёт. Если в ярусе ни одна группа ещё не закончила проверку, метрика для него не выводится, и оповещение S3rScrubBehind не срабатывает, пока процесс scrub не проверит ярус |
s3r_scrub_period_seconds |
tier |
период проверки целостности данных яруса, scrub_period_s его записи в erasure |
s3r_repair_paused |
— | датчик режима repair_mode: 1, пока процессы scrub, resync, resync_queue и catalog остановлены администратором, иначе 0. Пока он равен 1, оповещение S3rScrubBehind не срабатывает |
s3r_compression_bytes_total |
direction |
объём данных до и после сжатия: logical и stored |
s3r_transition_total |
result |
завершённые попытки перехода между классами хранения по результату |
s3r_transition_bytes_total |
— | объём данных, переписанных при переходах между классами |