Ko'rsatkichlarni saqlash: qanday qilib biz Graphite+Whisper-dan Graphite+ClickHouse-ga o'tdik

Hammaga salom! Uning ichida oxirgi maqola Men mikroservis arxitekturasi uchun modulli monitoring tizimini tashkil qilish haqida yozganman. Hech narsa to'xtamaydi, bizning loyihamiz doimiy ravishda o'sib bormoqda va saqlangan ko'rsatkichlar soni ham shunday. Yuqori yuk sharoitida Graphite+Whisper-dan Graphite+ClickHouse-ga o'tishni qanday tashkil qildik, undan kutilgan narsalar va kesish ostidagi migratsiya natijalari haqida o'qing.

Ko'rsatkichlarni saqlash: qanday qilib biz Graphite+Whisper-dan Graphite+ClickHouse-ga o'tdik

Graphite+Whisper-da ko'rsatkichlarni saqlashdan Graphite+ClickHouse-ga o'tishni qanday tashkil qilganimizni aytib berishdan oldin, men bunday qarorni qabul qilish sabablari va biz uzoq vaqt birga yashagan Whisper-ning kamchiliklari haqida ma'lumot bermoqchiman.

Grafit + Shivirlash muammolari

1. Disk quyi tizimidagi yuqori yuk

O'tish vaqtida bizga daqiqada taxminan 1.5 million ko'rsatkich kelib tushdi. Bunday oqim bilan serverlarda diskdan foydalanish ~ 30% ni tashkil etdi. Umuman olganda, bu juda maqbul edi - hamma narsa barqaror ishladi, tez yozildi, tez o'qildi ... Rivojlanish guruhlaridan biri yangi xususiyatni ishga tushirguncha va bizga daqiqada 10 million ko'rsatkichni yuborishni boshlamaguncha. O'shanda diskning quyi tizimi kuchaytirildi va biz 100% foydalanishni ko'rdik. Muammo tezda hal qilindi, ammo qoldiq qoldi.

2. Replikatsiya va izchillikning yo'qligi

Katta ehtimol bilan, Graphite+Whisper-dan foydalanadigan/ishlatgan har bir kishi singari, biz xatolarga chidamlilikni yaratish uchun bir vaqtning o'zida bir nechta Graphite serverlariga bir xil o'lchovlar oqimini quydik. Va bu bilan hech qanday maxsus muammolar yo'q edi - serverlardan biri biron sababga ko'ra ishdan chiqqan paytgacha. Ba'zida biz yiqilgan serverni tezda olishga muvaffaq bo'ldik va uglerod-c-relay uning keshidan ko'rsatkichlarni yuklashga muvaffaq bo'ldi, lekin ba'zida yo'q. Va keyin o'lchovlarda teshik bor edi, biz uni rsync bilan to'ldirdik. Jarayon ancha uzoq edi. Yagona qutqaruvchi inoyat, bu juda kamdan-kam hollarda sodir bo'ldi. Shuningdek, biz vaqti-vaqti bilan tasodifiy o'lchovlar to'plamini oldik va ularni klasterning qo'shni tugunlarida bir xil turdagi boshqalar bilan taqqosladik. Taxminan 5% hollarda bir nechta qiymatlar boshqacha edi, bu bizni unchalik xursand qilmadi.

3. Katta oyoq izi

Biz Graphite-da nafaqat infratuzilmani, balki biznes ko'rsatkichlarini (va endi Kubernetes ko'rsatkichlarini ham) yozganimiz sababli, biz ko'pincha metrikada bir nechta qiymatlarni o'z ichiga olgan vaziyatga duch kelamiz va .wsp fayli barcha saqlashni hisobga olgan holda yaratilgan. davri va oldindan ajratilgan joyni egallaydi, bu biz uchun ~2MB edi. Vaqt o'tishi bilan ko'plab shunga o'xshash fayllar paydo bo'lishi muammoni yanada kuchaytiradi va ular bo'yicha hisobotlarni tuzishda bo'sh nuqtalarni o'qish juda ko'p vaqt va resurslarni talab qiladi.

Darhol ta'kidlashni istardimki, yuqorida tavsiflangan muammolarni turli xil usullar va turli darajadagi samaradorlik bilan hal qilish mumkin, ammo siz qanchalik ko'p ma'lumot olishni boshlasangiz, ular shunchalik yomonlashadi.

Yuqoridagilarning barchasiga ega bo'lish (oldingisini hisobga olgan holda maqolalar), shuningdek, qabul qilingan ko'rsatkichlar sonining doimiy o'sishi, barcha ko'rsatkichlarni 30 soniya saqlash oralig'iga o'tkazish istagi. (kerak bo'lsa 10 soniyagacha), biz Whisper-ga istiqbolli alternativ sifatida Graphite+ClickHouse-ni sinab ko'rishga qaror qildik.

Grafit+ClickHouse. Kutishlar

Yandex yigitlarining bir nechta uchrashuvlariga tashrif buyurib, o'qigan Habré haqida bir nechta maqola, hujjatlarni ko'rib chiqib, ClickHouse-ni Graphite ostida bog'lash uchun oqilona komponentlarni topib, biz chora ko'rishga qaror qildik!

Men quyidagilarni qabul qilmoqchiman:

  • disk quyi tizimidan foydalanishni 30% dan 5% gacha kamaytirish;
  • egallagan joy hajmini 1TB dan 100GB gacha kamaytirish;
  • serverga daqiqada 100 million ko'rsatkichni qabul qila olish;
  • ma'lumotlarning takrorlanishi va nosozliklarga bardoshliligi;
  • bir yil davomida ushbu loyihada o'tirmang va o'tishni oqilona vaqt oralig'ida amalga oshiring;
  • uzilishlarsiz o'tish.

Juda ambitsiyali, to'g'rimi?

Grafit+ClickHouse. Komponentlar

Grafit protokoli orqali ma'lumotlarni qabul qilish va keyin uni ClickHouse-da yozib olish uchun men tanladim uglerod klikxonasi (golang).

Vaqt seriyalarini saqlash uchun ma'lumotlar bazasi sifatida ClickHouse-ning so'nggi versiyasi, barqaror versiyasi 1.1.54253 tanlangan. U bilan ishlashda muammolar bor edi: xatolar tog'i jurnallarga to'kilgan va ular bilan nima qilish kerakligi aniq emas edi. bilan munozarada Roman Lomonosov (carbon-clickhouse, graphite-clickhouse va boshqa ko'plab mualliflar) yoshi kattasi tanlangan. 1.1.54236 versiyasi. Xatolar yo'qoldi - hamma narsa portlash bilan ishlay boshladi.

ClickHouse maʼlumotlarini oʻqish uchun tanlangan grafit-slickhouse (golang). Grafit uchun API sifatida - karbonapi (golang). ClickHouse jadvallar orasidagi replikatsiyani tashkil qilish uchun ishlatilgan hayvonot bog'i xodimi. Marshrutlash ko'rsatkichlari uchun biz sevgilimizni tark etdik uglerod-c-relesi (C) (oldingi maqolaga qarang).

Grafit+ClickHouse. Jadval tuzilishi

"grafit" - biz jadvallarni kuzatish uchun yaratilgan ma'lumotlar bazasi.

“graphite.metrics” - ReplicatedReplacingMergeTree dvigatelli jadval (replikatsiya qilingan) MergeTree-ni almashtirish). Ushbu jadval ko'rsatkichlar nomlarini va ularga yo'llarni saqlaydi.

CREATE TABLE graphite.metrics ( Date Date, Level UInt32, Path String, Deleted UInt8, Version UInt32 ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/replicator/graphite.metrics', ‘r1’, Date, (Level, Path), 8192, Version);

“graphite.data” - ReplicatedGraphiteMergeTree dvigatelli jadval (replikatsiya qilingan) GraphiteMergeTree). Ushbu jadval metrik qiymatlarni saqlaydi.

CREATE TABLE graphite.data ( Path String, Value Float64, Time UInt32, Date Date, Timestamp UInt32 ) ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/replicator/graphite.data', 'r1', Date, (Path, Time), 8192, 'graphite_rollup')

"graphite.date_metrics" - bu ReplicatedReplacingMergeTree dvigateli bilan shartli to'ldirilgan jadval. Ushbu jadvalda kun davomida duch kelgan barcha ko'rsatkichlar nomlari qayd etilgan. Uning yaratilish sabablari bo'limda tasvirlangan "Muammolar" ushbu maqolaning oxirida.

CREATE MATERIALIZED VIEW graphite.date_metrics ( Path String,  Level UInt32,  Date Date) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/replicator/graphite.date_metrics', 'r1', Date, (Level, Path, Date), 8192) AS SELECT toUInt32(length(splitByChar('.', Path))) AS Level, Date, Path FROM graphite.data

"graphite.data_stat" - shartga muvofiq to'ldirilgan jadval, ReplicatedAggregatingMergeTree dvigateli (replikatsiya qilingan) Aggregating Merge Tree). Ushbu jadval kiruvchi ko'rsatkichlar sonini 4 ta joylashtirish darajasiga bo'lingan holda qayd etadi.

CREATE MATERIALIZED VIEW graphite.data_stat ( Date Date,  Prefix String,  Timestamp UInt32,  Count AggregateFunction(count)) ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/replicator/graphite.data_stat', 'r1', Date, (Timestamp, Prefix), 8192) AS SELECT toStartOfMonth(now()) AS Date, replaceRegexpOne(Path, '^([^.]+.[^.]+.[^.]+).*$', '1') AS Prefix, toUInt32(toStartOfMinute(toDateTime(Timestamp))) AS Timestamp, countState() AS Count FROM graphite.data  GROUP BY Timestamp, Prefix

Grafit+ClickHouse. Komponentlarning o'zaro ta'siri diagrammasi

Ko'rsatkichlarni saqlash: qanday qilib biz Graphite+Whisper-dan Graphite+ClickHouse-ga o'tdik

Grafit+ClickHouse. Ma'lumotlarni ko'chirish

Ushbu loyihadan kutganimizdek, ClickHouse-ga o'tish to'xtab qolmasdan bo'lishi kerak; shunga ko'ra, biz qandaydir tarzda butun monitoring tizimimizni foydalanuvchilarimiz uchun iloji boricha shaffof tarzda yangi xotiraga o'tkazishimiz kerak edi.
Biz buni shunday qildik.

  • ClickHouse jadvallarini replikatsiya qilishda ishtirok etuvchi serverlardan birining uglerod-clickhouse-ga qoʻshimcha oʻlchovlar oqimini yuborish uchun uglerod-c-relayiga qoida qoʻshildi.

  • Biz python-da kichik skript yozdik, u whisper-dump kutubxonasidan foydalanib, bizning xotiramizdagi barcha .wsp fayllarini o'qib chiqdi va bu ma'lumotlarni yuqorida tavsiflangan uglerod-klikxonaga 24 ta mavzuda yubordi. Carbon-clickhouse-da qabul qilingan metrik qiymatlar soni 125 million / min ga etdi va ClickHouse hatto ter to'kmadi.

  • Mavjud boshqaruv panellarida ishlatiladigan funksiyalarni disk raskadrovka qilish uchun Grafana-da alohida DataSource yaratdik. Biz foydalanadigan funktsiyalar ro'yxatini aniqladik, ammo ular carbonapida amalga oshirilmadi. Biz ushbu funktsiyalarni qo'shdik va karbonapi mualliflariga PR yubordik (ularga alohida rahmat).

  • Balanslashtiruvchi sozlamalarida o'qish yukini almashtirish uchun biz oxirgi nuqtalarni grafit-api (Graphite+Whisper uchun API interfeysi) dan karbonapiga o'zgartirdik.

Grafit+ClickHouse. natijalar

  • disk quyi tizimidan foydalanishni 30% dan 1% gacha qisqartirish;

    Ko'rsatkichlarni saqlash: qanday qilib biz Graphite+Whisper-dan Graphite+ClickHouse-ga o'tdik

  • egallagan joy miqdori 1 TB dan 300 GB gacha qisqartirildi;
  • biz serverga daqiqada 125 million ko'rsatkichni qabul qilish imkoniyatiga egamiz (migratsiya vaqtidagi cho'qqilar);
  • barcha ko'rsatkichlarni o'ttiz soniya saqlash oralig'iga o'tkazdi;
  • olingan ma'lumotlarni takrorlash va xatolarga chidamlilik;
  • uzilishlarsiz o'zgartirildi;
  • Hammasini bajarish uchun taxminan 7 hafta kerak bo'ldi.

Grafit+ClickHouse. Muammolar

Bizning holatda, ba'zi tuzoqlar bor edi. O'tishdan keyin biz bu narsaga duch keldik.

  1. ClickHouse har doim ham konfiguratsiyalarni tezda qayta o'qimaydi; ba'zan uni qayta ishga tushirish kerak. Misol uchun, ClickHouse konfiguratsiyasida zookeeper klasterining tavsifi bo'lsa, u clickhouse-server qayta ishga tushirilgunga qadar ishlatilmagan.
  2. Katta ClickHouse so'rovlari bajarilmadi, shuning uchun graphite-clickhouse-da bizning ClickHouse ulanish qatorimiz quyidagicha ko'rinadi:
    url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000"
  3. ClickHouse tez-tez barqaror nashrlarning yangi versiyalarini chiqaradi; ular kutilmagan hodisalarni o'z ichiga olishi mumkin: ehtiyot bo'ling.
  4. Kubernetlarda dinamik ravishda yaratilgan konteynerlar qisqa va tasodifiy ishlash muddati bilan ko'p sonli o'lchovlarni yuboradi. Bunday ko'rsatkichlar uchun ko'p nuqtalar mavjud emas va bo'sh joy bilan bog'liq muammolar yo'q. Ammo so'rovlarni yaratishda ClickHouse "ko'rsatkichlar" jadvalidan bir xil ko'rsatkichlarning juda ko'p sonini oladi. 90% hollarda derazadan tashqarida ular haqida ma'lumot yo'q (24 soat). Biroq, bu ma'lumotlarni "ma'lumotlar" jadvalida qidirishga vaqt sarflanadi va oxir-oqibat vaqt tugaydi. Ushbu muammoni hal qilish uchun biz kun davomida duch kelgan ko'rsatkichlar bo'yicha ma'lumotlar bilan alohida ko'rinishni davom ettira boshladik. Shunday qilib, dinamik ravishda yaratilgan konteynerlar uchun hisobotlarni (grafiklarni) yaratishda biz butun vaqt davomida emas, balki faqat ma'lum bir oynada uchraydigan ko'rsatkichlarni so'raymiz, bu ular bo'yicha hisobotlarni qurishni sezilarli darajada tezlashtiradi. Yuqorida tavsiflangan yechim uchun men to'pladim grafit-klikxona (vilkalar), bu date_metrics jadvali bilan ishlashni amalga oshirishni o'z ichiga oladi.

Grafit+ClickHouse. Teglar

1.1.0 versiyasi bilan Graphite rasmiylashtirildi qo'llab-quvvatlash teglari. Va biz ushbu tashabbusni grafit + klik xaus stekida qo'llab-quvvatlash uchun nima va qanday qilish haqida faol o'ylaymiz.

Grafit+ClickHouse. Anomaliya detektori

Yuqorida tavsiflangan infratuzilmaga asoslanib, biz anomaliya detektorining prototipini joriy qildik va u ishlaydi! Ammo keyingi maqolada u haqida ko'proq.

Obuna bo'ling, yuqoriga o'qni bosing va baxtli bo'ling!

Manba: www.habr.com

a Izoh qo'shish