Перейти к содержанию

Наблюдение за кластером

Страница для инженера эксплуатации: что проверять в первую очередь, как отличить исправный кластер от неисправного, где смотреть состояние дисков, групп размещения, свободного места и репликации между площадками. В конце — справочник метрик и сообщений журнала.

Как устранять найденное, описано на страницах Поведение при отказах, Действия с дисками, Контроль целостности и Диагностика неполадок.

Что проверять в первую очередь

У кластера четыре источника сведений о состоянии. Они отвечают на разные вопросы и доступны по-разному.

Источник Что показывает Где и кому доступен
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 участника переносит действие «Восстановить размещение»

Занятость и освобождение места

Место, занятое удалённым объектом, освобождается не сразу и без участия администратора. Раздел объясняет, когда его ждать и что на это влияет.

Удаление объекта состоит из одной операции: строка объекта исключается из пространства имён. Очереди освобождения нет, фрагменты на дисках при этом не переписываются. Дальше место освобождается в три шага:

  1. Позиции блоков объекта становятся свободными. Это происходит, когда об удалении узнаёт владелец группы: он ведёт учёт занятых и свободных позиций блоков группы (вид группы). Удаляющий инстанс отправляет владельцу подсказку, и позиции блоков освобождаются сразу. Если подсказка потеряна, их освобождает ближайшая сверка вида группы с каталогом. Потеря подсказки стоит одной сверки и никогда не стоит места.
  2. Свободная позиция блока выдерживается refill_after_s секунд и только потом выдаётся под запись: клиент, который уже прочитал строку объекта, может ещё читать его фрагменты.
  3. Экстент, все блоки которого свободны дольше 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 — объём данных, переписанных при переходах между классами