Проверка диска 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 | Системные логи без TTL | system.tables, system.parts | TRUNCATE (с одноразовым флагом для таблиц больше 50 ГБ), готовый файл с TTL для config.d, старые копии *_log_N на удаление |
| 2 | Место на диске вне кусков таблиц ClickHouse | system.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.mutations | APPLY 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, можно по-русски. Это самое полезное, что можно сделать.