Чому моніторинг ClickHouse ламається під час зростання навантаження
Поки кластер невеликий, достатньо базових датчиків хоста, і моніторинг ClickHouse здається вирішеним завданням: процесор не на межі, пам’ять вільна, диск відповідає.
Проблема в тому, що вузькі місця кластера живуть не на рівні заліза, а всередині самої СУБД — у черзі запитів, у фонових злиттях частин, у черзі реплікації. Зовнішні сенсори їх не показують, поки перевантаження не сталося.
Першим не витримує потік важких аналітичних запитів. Звіт без обмежень піднімає сотні потоків, витісняє робочий кеш і змушує систему перечитувати дані з диска.
Повільні запити перестають бути поодинокими: те, що відповідало частки секунди, починає відповідати секундами, а черга тільки накопичується. Моніторинг навантаження на рівні хоста в цей момент жваво рапортує про норму.
Відставання реплік розвивається тихіше. Запис іде на один вузол, розбирається через чергу, і коли потік вставок перевищує швидкість її розбору, частина реплік починає віддавати застарілі дані.
Сервіс, що читає, помилок не отримує — запит успішний, просто відповідь неправильна, і відтворюється це не на всіх вузлах.
Підсумок передбачуваний: про те, що повільні запити деградували або репліка відстала, команда дізнається від користувачів. Черговий бачить живий процес і порт, що відповідає, тобто за його приладовою панеллю все гаразд. Розрив саме тут — даних багато, а індикаторів стану, за якими ухвалюють рішення, немає.
Розбираємо, як це закривається: які показники знімати всередині сервера, де ставити пороги й як будувати сигнали, що спрацьовують до скарг.
Що змінюється після впровадження системи алертів і дашбордів
До впровадження алертів метрики ClickHouse зазвичай уже збираються, але ніхто не дивиться на них у момент зростання навантаження: черга вставок зростає годинами, відставання реплік збільшується поступово, і дізнаємося ми про це від користувачів, а не від системи. Після налаштування порогових значень і дашбордів змінюється сам режим роботи з кластером.
Єдина картина кластера
Одна панель зводить стан усіх вузлів: чергу злиттів, відставання реплік, споживання пам’яті, тривалість повільних запитів, активні з’єднання, помилки читання. Інженер відповідає на питання «де вузьке місце» за хвилину замість півгодини обходу вузлів і логів.
Алерти за метриками замість реакції постфактум
Пороги задаються не «на око», а за історичним профілем навантаження — окремо для піків звітності, окремо для нічних переливок.
Сигнал надходить за стійкого відхилення, тому хибні спрацювання не будять чергового, а реальне зростання черги вставок видно до того, як запити почнуть падати за таймаутом.
Деградація видна до відмови
Час реакції на інцидент скорочується з годин до хвилин, і більшість проблем фіксується на етапі зростання метрики, а не після скарг на повільні звіти.
Клас відмов через непомічене переповнення черги або відставання реплік зникає повністю: система не дає пропустити момент, коли запас ресурсів почав танути.
Варіанти збору метрик: агент, експортер, системні таблиці
Метрики ClickHouse за замовчуванням живуть у системних таблицях самого сервера: їх видно лише з хоста й лише в моменті. Щоб будувати графіки та розбирати інциденти постфактум, потрібен окремий контур збору — і тут реально працюють три схеми, між якими й обирають.
| Схема | Коли підходить | Обмеження |
|---|---|---|
| Агент збору на кожному хості | Бази на виділених серверах, кластер із кількох нод, потрібен збір з кожного вузла | Потребує доступу до файлової системи та прав на читання логів; під час оновлення образу хоста агент доводиться перезбирати |
| Зовнішній експортер поруч із сервером | Контейнерні розгортання, де на хост нічого не поставити; єдина точка підключення до бази | Тримає постійне з’єднання із сервером, чутливий до його перезапусків, на одному експортері збирається весь потік |
| Опитування системних таблиць за розкладом | Швидкий старт, разові обстеження, налагодження нестандартних показників | Низька роздільна здатність за часом, історії немає, і кожен запит — додаткове навантаження на робочу базу |
Частота опитування визначає, що ви взагалі побачите: рідкісний інтервал усереднює сплески й приховує короткі сплески за пам’яттю та відмовами.
Зберігання історії виноситься з робочої бази в окреме сховище часових рядів: сирі точки тримають обмежений строк, далі залишаються хвилинні та годинні агрегати — так глибина в місяці не перетворюється на зростання навантаження на сам сервер.
На практиці схеми комбінують: агент або експортер дає потік, а системні таблиці залишаються інструментом точкової діагностики. Розбираємо, як зібрати з цього стійкий контур.
Етапи впровадження: від аудиту схеми до передачі регламентів
Роботи йдуть послідовно: спочатку фіксуємо фактичну картину навантаження й те, які метрики вже доступні, і лише потім будуємо схему збору. Кожен етап закінчується артефактом — конфігурацією, правилом або регламентом, тому результат можна перевірити, а не прийняти на віру.
- Аудит схеми та навантаження. Розбираємо топ запитів, черги, розподіл за репліками: де вузьке місце — диск, пам’ять чи самі запити. На виході — перелік метрик, які справді варто опитувати, та інтервал опитування під поточний темп.
- Проєктування схеми збору. Вирішуємо, які вузли опитуються напряму, а які через проміжний збирач, як зберігається історія і на який строк її вистачає. Схему узгоджуємо до того, як щось буде встановлено.
- Налаштування опитування. Піднімаємо експортери на вузлах, зводимо метрики до єдиних імен, прибираємо дублі й перевіряємо, що сам збір не створює помітного навантаження на базу.
- Правила оповіщень і панелі. Пороги ставимо не «за замовчуванням», а від спостережуваних значень: окремо на деградацію, окремо на відмову, з різною терміновістю. Панелі збираємо під реальні питання — що гальмує зараз і що змінилося за добу.
- Перевірка на стенді. Штучно глушимо репліку, заповнюємо диск, зупиняємо збирач: дивимося, чи спрацювало правило, чи дійшло повідомлення до чергового, чи немає хибних спрацювань. Навантажувальна перевірка показує, що збір метрик не відбирає ресурси в самої бази.
- Передача регламентів. Віддаємо документацію: що означає кожен сигнал, що робить черговий, куди ескалювати. Навчаємо зміну на живому стенді.
Що залишається в замовника: дашборди, алерти, документація
Усе, що ми налаштовуємо, залишається у вас у вигляді звичайних файлів і налаштувань усередині вашого контуру — не «чорна скринька», що тримається на підряднику.
Нижче — повний перелік артефактів, які передаємо разом із доступами, щоб систему можна було розвивати власними силами або віддати іншій команді.
- Панелі Grafana — описи дашбордів у системі контролю версій: огляд кластера, розбивка за шардами й репліками, затримки вставок і злиттів, черга на запис.
- Правила алертів — пороги та вікна спрацювання: недоступність репліки, відставання реплікації, зростання відкладених вставок, вичерпання диска, сплеск помилок у логах.
- Конфігурації збору метрик — цілі збору, інтервали, розрізи за вузлами, політика зберігання: що тримаємо місяцями, а що згортаємо в зведені ряди.
- Доступи та ролі — розподіл прав на перегляд і зміну, сервісні облікові записи для експортерів, зв’язка з вашим єдиним входом і групами.
- Регламент чергувань — хто отримує повідомлення, порядок ескалації, вікна тиші на час планових робіт, фіксація розбору кожного спрацювання.
- Документація — карта метрик із розшифровкою, обґрунтування порогів, порядок підключення нового вузла, схема проходження сигналу від збирача до повідомлення.
- Інструкції щодо типових відмов — покрокові сценарії: не відповідає експортер, втрачено частину історії, хибне спрацювання.
- Чек-ліст приймання — тестове спрацювання алерту, перевірка ролей, повнота історії, відновлення панелі з опису.
Усе перелічене узгоджується на етапі запуску, щоб приймання було формальним і швидким, а не «на слово». Опишіть завдання — повернемося з оцінкою та планом передачі.
Кейс: час реакції на відмову скоротився з годин до хвилин
До впровадження моніторингу про проблеми на кластері ClickHouse команда дізнавалася від користувачів: звіти віддавали помилки раніше, ніж черговий бачив перший сигнал.
Первинна діагностика займала близько сорока хвилин — логи піднімалися вручну, час подій звірявся за файлами, картина збиралася по шматках, і весь цей час простій тривав.
Що змінили
Зняли метрики з кожного вузла й зібрали дашборд за таблицями: швидкість вставки та читання, відставання реплік, кількість незавершених злиттів, витрати пам’яті та місце на дисках, частка запитів, що впираються в ліміти.
Пороги оповіщень поставили на швидкість зміни показника, а не на абсолютне значення — сигнал надходить на попередженні, за 10-15 хвилин до того, як деградацію помітить користувач.
Що отримали
Час виявлення скоротився до 3-5 хвилин, розбір інциденту — з кількох годин до 15-20 хвилин: потрібний інтервал уже на графіках, і видно, який показник зріс першим.
Клас відмов, який раніше доходив до клієнта (переповнення диска під тимчасові дані, відставання репліки після пікового навантаження), тепер закривається на стадії попередження, без простою.
Однакові симптоми більше не розслідуються заново: правило й поріг дописуються один раз, і наступний схожий випадок закривається автоматично — до того, як про нього дізнаються ззовні.
Чим відрізняється моніторинг ClickHouse зсередини та ззовні
Коротка відповідь: це не альтернативи, а два шари, які відповідають на різні питання. Зовнішній контур показує, чи живий сервіс і в якому стані вузол, внутрішній — що відбувається всередині движка: як ідуть злиття, чи наздоганяють репліки, чи зростають черги.
Зсередини збір іде із системних таблиць — system.metrics, system.events, system.query_log та асинхронних показників. Звідти видно те, чого ззовні не вгадати: відставання реплікації, кількість злиттів та їхню тривалість, влучання в кеші, розподіл часу за стадіями виконання.
Ціна — накладні витрати: кожне опитування саме є запитом, потрапляє в журнал і на частому інтервалі починає спотворювати картину.
Ззовні знімають стан процесу та вузла: доступність і час відповіді, заповнення диска, пам’ять, відкриті з’єднання. Цей контур продовжує відповідати, коли движок уже мовчить, — саме він ловить відмову, а не деградацію.
| Підхід | Що показує | Обмеження |
|---|---|---|
| Зсередини движка | Злиття, реплікація, черги, кеші, час стадій запиту | Сам створює навантаження; у разі відмови движка даних немає |
| Зовнішній контур | Доступність, час відповіді, диск, пам’ять, з’єднання | Не бачить внутрішні черги та відставання реплік |
На практиці контури зводять разом: часте опитування ззовні та рідке зсередини — різні інтервали для різних класів метрик, щоб повнота не купувалася зайвим навантаженням.
Алерти розділяють за змістом: зовнішній шар відповідає за «сервіс недоступний», внутрішній — за «сервіс працює, але деградує».
Часті технічні сумніви перед стартом робіт
Збір метрик сам стає навантаженням — побоювання обґрунтоване, але лише за неправильної схеми. Експортер читає системні лічильники, вже пораховані сервером, і не сканує дані таблиць. Нижче — питання, які найчастіше порушують на першій зустрічі.
Опитування не стане зайвим навантаженням на кластер?
Вибірка йде за системними лічильниками з пам’яті вузла, а не за даними таблиць: витрати — мережа та запис у сховище метрик. Гарячі показники знімаємо раз на 15–30 секунд, ємність і розміри — раз на хвилину. Важкі запити до історії в опитування не потрапляють.
Скільки історії зберігати, щоб сховище не зростало нескінченно?
Сирі точки живуть коротким вікном — його вистачає на розбір інциденту. Далі працюють правила агрегації: хвилинні та годинні згортки живуть місяцями, тому графіки за квартал залишаються, а обсяг зростає передбачувано.
Оповіщення не перетворяться на потік хибних спрацювань?
Правила будуємо на похідних: затримка реплікації, черга злиттів, частка відмов — а не на «місце менше порога». У кожного заданий інтервал стійкості, сигнал надходить, лише якщо стан тримається кілька циклів. Черговий бачить, що саме деградувало і на якому вузлі.
У нас уже розгорнуто моніторинг — усе переробляти заново?
Спочатку інвентаризація: що збирається, які панелі живі, де правила дублюють одне одного. Вбудовуємося в наявний контур — доповнюємо джерела та правила, історію метрик зберігаємо й підключаємо до нових панелей, старі залишаємо працювати.
Обговоримо завдання й повернемося з оцінкою та планом робіт
Щоб повернутися з планом робіт, а не із загальними словами, нам потрібні вхідні дані щодо вашого контуру. Достатньо топології: скільки вузлів і шардів, як влаштована реплікація, звідки йдуть вставки та які споживачі читають дані.
Якщо збої вже траплялися, опишіть, як вони проявлялися — затримка реплікації, збої злиттів, зростання черги на вставку або відмова одного вузла.
Доступи продумуємо заздалегідь, щоб нічого не зачепити в бойовому контурі: окремий користувач лише на читання системних таблиць, збір метрик із вузлів ClickHouse і зі збирача, окремий мережевий шлях для панелей із графіками. Жодна з цих змін не потребує прав на запис у дані.
Зі свого боку повертаємося не однією цифрою, а розбором, за яким можна ухвалювати рішення:
- Вхідні дані щодо контуру: кількість вузлів і шардів, схема реплікації, джерела вставки, обсяг даних.
- Доступи: користувач лише на читання системних таблиць, мережеві правила для вузлів і панелей.
- Історія відмов: як проявлялися, за скільки хвилин їх помічали, скільки йшло на діагностику.
- Пороги та оповіщення: які метрики важливі саме вам і хто отримує сигнал черговому.
- Склад робіт і межі: що робимо ми, що залишається на вашому боці — мережа, права, зміни конфігурації.
- План робіт за етапами зі строками та точками, де ви бачите проміжний результат.
- Оцінка проєкту: обсяг робіт, залежності та ризики, а не одна цифра без пояснень.
Опишіть завдання у вільній формі — напишіть, що вже болить і які метрики хочете бачити на дашбордах. Повернемося з оцінкою, складом робіт і строками.







