Проверка диска ClickHouse® в режиме только для чтения — для Langfuse, SigNoz и ClickStack на вашем сервере

Диск заполняется, хотя ваших данных немного. Обычно место уходит в собственные таблицы-логи ClickHouse, у которых по умолчанию нет ограничения размера. diskvet показывает, что занимает диск, и печатает точные команды, чтобы это исправить. Сам он ничего не запускает: каждую команду выполняете вы.

Бесплатно, Apache-2.0, без регистрации. Два коротких файла, которые можно прочитать до запуска. Скрипт общается только с вашим ClickHouse и больше никуда ничего не отправляет.

Как это обычно бывает

  • 66,86 ГиБ в system.trace_log при ~51 МиБ в таблицах Langfuse (langfuse#13123);
  • 80+ ГБ системных логов при менее чем 500 МБ телеметрии (SigNoz#12050);
  • том на 10 Gi заполнился за 10 дней (ClickStack-helm-charts#275).

Основное исправление известно: сделать TRUNCATE логов и добавить TTL. Отчёт учитывает и ловушки, на которые при этом натыкаются на практике: лимит 50 ГБ на TRUNCATE, старые копии *_log_N после перезапуска, особый конфиг opentelemetry_span_log, логи Docker без ротации и удалённые строки, которые всё ещё занимают место.

Быстрый старт: Langfuse с docker compose (30 секунд)

На машине, где запущен docker-compose.yml от Langfuse:

cd langfuse                     # папка с docker-compose.yml от Langfuse
curl -fsSLO https://github.com/Protemir/diskvet/releases/latest/download/diskvet.sh
curl -fsSLO https://github.com/Protemir/diskvet/releases/latest/download/checks.sql
curl -fsSLO https://github.com/Protemir/diskvet/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS         # по желанию: оба файла совпадают с релизом
less checks.sql                 # сначала прочитайте: только SELECT из system.*

sh diskvet.sh report --docker auto > report.md

--docker auto сам находит контейнер ClickHouse и запускает clickhouse-client внутри него, так что не нужен ни клиент на хосте, ни открытый порт. Без --user он берёт CLICKHOUSE_USER / CLICKHOUSE_PASSWORD самого контейнера, и пароль не покидает контейнер.

Другие способы подключиться:

sh diskvet.sh report --docker signoz-clickhouse                          # контейнер по имени
sh diskvet.sh report --host 127.0.0.1 --user diskvet --password '...'   # локальный clickhouse-client

Нужны POSIX sh, awk, sed, od, date, а также docker или clickhouse-client. jq и Python не нужны. Отчёт скрипт пишет по-английски. Последняя версия — на странице релизов на GitHub.

Что проверяет diskvet

#ПроверкаОткуда читаетТипичное исправление в отчёте
1Системные логи без TTLsystem.tables, system.partsTRUNCATE (с одноразовым флагом для таблиц больше 50 ГБ), готовый файл с TTL для config.d, старые копии *_log_N на удаление
2Место на диске вне кусков таблиц ClickHousesystem.disks против всех кусковротация логов Docker и где ещё искать
3Заполненность диска и грубый прогнозsystem.disks, system.asynchronous_metric_logчто освобождать первым
4Рост за суткиsystem.part_logв какую таблицу записано больше всего за 24 ч
5Слишком много кусковsystem.parts, system.merge_tree_settings, system.eventsсколько осталось до лимитов таблицы на вставку
6Неактивные и отсоединённые кускиsystem.parts, system.detached_partsзастрявшие куски, DROP DETACHED PART
7Удалённые строки и зависшие мутацииsystem.parts, system.mutationsAPPLY DELETED MASK для конкретных партиций, KILL MUTATION

Каждая проверка пишет OK, INFO, WARN или CRITICAL, пороги — в README. Для каждого исправления указано, насколько оно безопасно и нужен ли перезапуск. Если запрос проверки падает, она показывает NOT_RUN с причиной, а остальные всё равно выполняются.

Что скрипт читает, а что — никогда

Читает

  • метаданные из system.tables, system.parts, system.disks, system.detached_parts, system.merge_tree_settings, system.mutations, system.part_log, system.asynchronous_metric_log, system.asynchronous_metrics, system.events;
  • если разрешено, system.server_settings (только max_table_size_to_drop);
  • один проверочный запрос, SELECT getSetting('readonly'), чтобы убедиться, что сессия только для чтения.

Никогда не читает

  • строки ваших собственных таблиц: никаких FROM или JOIN по ним, ни табличных функций, ни dictGet — это проверяют тесты;
  • system.query_log, тексты запросов, команды мутаций и тексты ошибок.

Локальный отчёт показывает настоящие имена баз и таблиц: они нужны, чтобы выполнить исправления. Отчёт остаётся на вашей машине.

Два безопасных способа запуска

  • Под существующим пользователем. Запросы идут с readonly=2 и ограничениями (30 с, 10 000 строк, 2 потока, 500 МБ). Если сервер не даёт этому пользователю режим только для чтения, скрипт останавливается, ничего не выполнив.
  • Под отдельным пользователем — чтобы пройти проверку службы безопасности: узкие права на системные таблицы выше и никакого доступа к данным продукта. Точный SQL — в README.

Проверено на стандартных образах clickhouse/clickhouse-server 24.1, 24.8, 25.12 и 26.9, на установках, похожих на Langfuse и SigNoz. Пока не проверено: реплицированные кластеры, Kubernetes, диски в объектном хранилище, macOS.

Хотите исправить вручную?

Почему ClickHouse забивает диск в Langfuse и SigNoz на своём сервере и как это исправить

Один запрос только на чтение, чтобы подтвердить диагноз, как освободить место прямо сейчас и как не дать проблеме вернуться, обойдя известные ловушки. Каждая команда в нём проверена на ClickHouse 24.8, 25.12 и 26.9. Для этого diskvet не нужен.

Проверка каждый час: бесплатная бета в октябре

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

  • снимок раз в час: ровно тот JSON, который печатает sh diskvet.sh --print-payload, и ничего больше;
  • письмо до того, как диск заполнится, и только когда меняется статус;
  • сигнал, если снимки перестали приходить;
  • короткий отчёт каждый понедельник.

Ничего не нужно разворачивать у себя и открывать порты: ваш сервер сам отправляет небольшой подписанный снимок, внутрь никто не подключается. Имена хостов, IP-адреса, пользователи, тексты запросов и ошибок не отправляются никогда; имена ваших таблиц покидают сервер только в виде хешей с солью.

Хотите участвовать? Напишите в «Early access» (обсуждение #1), на чём работает ваш ClickHouse и примерно какого размера диск. Можно по-русски. Когда бета откроется, вам ответят там же. Пожалуйста, не пишите там названия компаний и хостов: это публичная ветка.

Бета идёт 30 дней; после неё ежечасные проверки станут платным тарифом, а скрипт останется бесплатным и открытым. Серверы в Казахстане: пока только локальный отчёт.

Нашли проблему, которую скрипт пропускает, или неверное исправление? Откройте issue, можно по-русски. Это самое полезное, что можно сделать.