Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Мониторинг и отладка
monitoring

Мониторинг и отладка

Системные таблицы, логи, метрики, трассировка запросов, профилирование и оповещения

Мониторинг и отладка

Системные таблицы, метрики и оповещения, которые ведут от симптома к причине

#Результат урока

Вы свяжете пользовательский симптом с запросом, ресурсом и внутренним процессом ClickHouse, а затем оформите оповещение с действием, а не просто с порогом.

#Системные таблицы для мониторинга

#system.query_log — логи запросов

-- Последние выполненные запросы SELECT query_id, query, event_date, event_time, elapsed, read_rows, read_bytes, result_rows, result_bytes, memory_usage, user FROM system.query_log WHERE event_date = today() ORDER BY event_time DESC LIMIT 20; -- Медленные запросы (> 1 секунды) SELECT query, elapsed, read_rows, read_bytes, memory_usage, user FROM system.query_log WHERE event_date = today() AND elapsed > 1.0 ORDER BY elapsed DESC; -- Ошибки выполнения SELECT query, exception_code, exception_text, event_time FROM system.query_log WHERE event_date = today() AND type = 'Exception' ORDER BY event_time DESC;

Типы записей:

  • QueryStart — начало выполнения
  • QueryFinish — успешное завершение
  • Exception — ошибка выполнения

#system.processes — текущие запросы

-- Активные запросы SELECT query_id, query, elapsed, read_rows, read_bytes, memory_usage, user, host FROM system.processes ORDER BY elapsed DESC; -- Запросы с большим потреблением памяти SELECT query, memory_usage, elapsed, user FROM system.processes WHERE memory_usage > 1000000000 -- 1 GB ORDER BY memory_usage DESC; -- Убийство запроса KILL QUERY WHERE query_id = 'query_id';

#system.metrics — метрики сервера

-- Все метрики SELECT metric, value, description FROM system.metrics ORDER BY metric; -- Ключевые метрики SELECT metric, value FROM system.metrics WHERE metric IN ( 'Query', 'Merge', 'HTTPConnection', 'TCPConnection', 'MemoryTracking' );

Важные метрики:

МетрикаОписание
QueryКоличество выполненных запросов
MergeКоличество слияний частей
HTTPConnectionАктивные HTTP подключения
TCPConnectionАктивные TCP подключения
MemoryTrackingИспользуемая память

#system.events — события сервера

-- События с момента запуска SELECT event, value, description FROM system.events ORDER BY event; -- События за период (через query_log) SELECT 'Queries' AS event, count() AS value FROM system.query_log WHERE event_date = today();

#system.asynchronous_metrics — асинхронные метрики

-- Метрики, обновляемые периодически SELECT metric, value FROM system.asynchronous_metrics WHERE metric LIKE '%Memory%' OR metric LIKE '%Disk%';

Примеры:

  • TotalMemoryAllocated — выделенная память
  • FilesystemFree — свободное место на диске

#system.disks — информация о дисках

SELECT name, path, free_space, total_space, keep_free_space, type FROM system.disks;

#system.parts — части таблиц

-- Статус частей таблиц SELECT database, table, partition, name, active, level, rows, bytes_on_disk, modification_time FROM system.parts WHERE database = 'default' AND active = 1 ORDER BY modification_time DESC; -- Неактивные части (ожидают удаления) SELECT database, table, name, bytes_on_disk FROM system.parts WHERE active = 0 ORDER BY bytes_on_disk DESC; -- Части с большим количеством уровней (проблемы с merge) SELECT database, table, name, level, rows FROM system.parts WHERE active = 1 AND level > 10 ORDER BY level DESC;

#system.replicas — статус репликации

-- Статус реплик SELECT database, table, total_replicas, active_replicas, is_readonly, is_session_expired, absolute_delay, last_queue_update FROM system.replicas; -- Проблемы с репликацией SELECT database, table, is_readonly, is_session_expired, absolute_delay FROM system.replicas WHERE is_readonly = 1 OR is_session_expired = 1 OR absolute_delay > 60;

#system.replication_queue — очередь репликации

-- Очередь репликации SELECT database, table, position, node_name, type, required_quorum, is_currently_executing, create_time FROM system.replication_queue ORDER BY create_time; -- Зависшие операции репликации SELECT database, table, position, type, is_currently_executing, create_time FROM system.replication_queue WHERE create_time < now() - INTERVAL 1 HOUR;

#system.merges — текущие слияния

-- Активные слияния SELECT database, table, elapsed, progress, num_parts, result_part_name, bytes_read_uncompressed, bytes_written_uncompressed FROM system.merges ORDER BY elapsed DESC; -- Мутации (UPDATE/DELETE) SELECT database, table, mutation_id, command, create_time, is_done, latest_fail_reason FROM system.mutations WHERE is_done = 0;

#system.clusters — информация о кластерах

-- Узлы кластера SELECT cluster, shard_num, replica_num, host_name, host_address, port, is_local FROM system.clusters WHERE cluster = 'cluster_default';

#system.distributed_ddl_queue — очередь DDL

-- Статус выполнения DDL на кластере SELECT query, host, shard_num, replica_num, status, exception_code, exception_text, query_finish_time FROM system.distributed_ddl_queue ORDER BY entry DESC LIMIT 20;

#Трассировка запросов

#query_log с деталями

-- Детальная информация о запросе SELECT query_id, query, event_type, elapsed, read_rows, read_bytes, written_rows, written_bytes, result_rows, result_bytes, memory_usage, peak_memory_usage, read_latency_ms, ProfileEvents, Settings FROM system.query_log WHERE query_id = 'specific_query_id' ORDER BY event_time;

#ProfileEvents — события выполнения

-- События для конкретного запроса SELECT ProfileEvents['ReadBufferFromFileDescriptorRead'] AS file_reads, ProfileEvents['ReadBufferFromFileDescriptorReadBytes'] AS file_read_bytes, ProfileEvents['OSReadChars'] AS os_read_chars, ProfileEvents['OSWriteChars'] AS os_write_chars FROM system.query_log WHERE query_id = 'specific_query_id' AND type = 'QueryFinish';

Важные ProfileEvents:

  • ReadBufferFromFileDescriptorRead — чтения с диска
  • SelectedRows — отобранные строки
  • SelectedBytes — отобранные байты
  • MergedRows — строки после merge
  • MergedColumns — колонки после merge

#trace_log — трассировка выполнения

-- Включить трассировку (в конфигурации) -- <query_log> -- <collect_query_traces>1</collect_query_traces> -- </query_log> -- Просмотр трассировки SELECT query_id, event_time, trace, arrayMap(x -> demangle(x), trace) AS trace_demangled FROM system.trace_log WHERE query_id = 'specific_query_id' ORDER BY event_time;

#Метрики производительности

#Информация о запросах

-- Статистика по запросам за период SELECT toDate(event_time) AS date, count() AS total_queries, avg(elapsed) AS avg_elapsed, max(elapsed) AS max_elapsed, avg(read_rows) AS avg_read_rows, avg(memory_usage) AS avg_memory FROM system.query_log WHERE event_date >= today() - INTERVAL 7 DAY AND type = 'QueryFinish' GROUP BY date ORDER BY date; -- Топ запросов по потреблению памяти SELECT query, avg(memory_usage) AS avg_memory, max(memory_usage) AS max_memory, count() AS executions FROM system.query_log WHERE event_date = today() GROUP BY query ORDER BY avg_memory DESC LIMIT 20; -- Топ запросов по времени выполнения SELECT query, avg(elapsed) AS avg_elapsed, max(elapsed) AS max_elapsed, count() AS executions FROM system.query_log WHERE event_date = today() GROUP BY query ORDER BY avg_elapsed DESC LIMIT 20;

#Информация о таблицах

-- Размер таблиц SELECT database, table, sum(rows) AS total_rows, sum(bytes_on_disk) AS total_bytes, sum(bytes_on_disk) / sum(rows) AS bytes_per_row FROM system.parts WHERE active = 1 GROUP BY database, table ORDER BY total_bytes DESC; -- Статистика по партициям SELECT database, table, partition, sum(rows) AS rows, sum(bytes_on_disk) AS bytes, min(modification_time) AS oldest_part, max(modification_time) AS newest_part FROM system.parts WHERE active = 1 GROUP BY database, table, partition ORDER BY modification_time DESC;

#Оповещения

#Проверка свободного места

-- Предупреждение о низком месте на диске SELECT name, free_space, total_space, round(free_space * 100.0 / total_space, 2) AS free_pct FROM system.disks WHERE free_space < 10000000000 -- 10 GB OR free_space * 100.0 / total_space < 10;

#Проверка отставания реплик

-- Предупреждение об отставании реплик SELECT database, table, total_replicas, active_replicas, absolute_delay FROM system.replicas WHERE absolute_delay > 60 -- 1 минута OR active_replicas < total_replicas;

#Проверка зависших мутаций

-- Предупреждение о зависших мутациях SELECT database, table, mutation_id, command, create_time, latest_fail_reason FROM system.mutations WHERE is_done = 0 AND create_time < now() - INTERVAL 1 HOUR;

#Проверка активных слияний

-- Предупреждение о долгих слияниях SELECT database, table, elapsed, num_parts, bytes_read_uncompressed FROM system.merges WHERE elapsed > 3600; -- 1 час

#Инструменты мониторинга

#Prometheus + Grafana

ClickHouse экспортирует метрики в формате Prometheus:

<!-- config.xml --> <clickhouse> <prometheus> <endpoint>/metrics</endpoint> <port>9363</port> <metrics>true</metrics> <events>true</events> <asynchronous_metrics>true</asynchronous_metrics> </prometheus> </clickhouse>

URL метрик:

  • http://clickhouse:9363/metrics — все метрики

#ClickHouse Exporter для Prometheus

# prometheus.yml scrape_configs: - job_name: 'clickhouse' static_configs: - targets: ['clickhouse:9363']

#Grafana дашборды

Популярные дашборды:

  • ClickHouse Overview (ID: 13726)
  • ClickHouse Cluster (ID: 14041)

#Отладка проблем

#Медленные запросы

-- Найти медленные запросы SELECT query, avg(elapsed) AS avg_elapsed, count() AS executions FROM system.query_log WHERE event_date = today() GROUP BY query HAVING avg_elapsed > 1.0 ORDER BY avg_elapsed DESC; -- Анализ плана выполнения EXPLAIN PIPELINE SELECT ...; -- Проверка использования индексов EXPLAIN indexes = 1 SELECT ...;

#Проблемы с памятью

-- Запросы с большим потреблением памяти SELECT query, max(memory_usage) AS max_memory, event_time FROM system.query_log WHERE event_date = today() AND memory_usage > 1000000000 ORDER BY max_memory DESC; -- Лимиты памяти SELECT name, value FROM system.settings WHERE name LIKE '%memory%';

#Проблемы с репликацией

-- Проверка статуса реплик SELECT database, table, is_readonly, is_session_expired, absolute_delay, last_queue_update_exception FROM system.replicas; -- Ошибки в очереди репликации SELECT database, table, position, type, create_time, latest_fail_reason FROM system.replication_queue WHERE latest_fail_reason != '';

#Практика: разбор деградации

Создайте запрос, который превышает учебный лимит памяти или заметно читает лишние данные. Найдите его в system.query_log, объясните ProfileEvents, подтвердите причину через EXPLAIN и предложите исправление. Оповещение должно содержать окно, порог, влияние на SLO и первый безопасный шаг дежурного.

Наблюдаемость показывает, кто и что делает с кластером. Теперь ограничим эти действия ролями, квотами и политиками доступа к строкам.

Далее: Безопасность и доступ