Upload
vladimir-smirnov
View
130
Download
1
Embed Size (px)
Citation preview
Graphite@Scale:Как сохранять миллионы точек в секунду
Vladimir SmirnovSystem Administrator
hangops_ru 201713 Апреля 2017
Зачем вообще хранить метрики?
Обычно метрики нужны когда:I Пришло время планировать закупки железаI Отладка проблем и расследование инцидентовI Бизнес-метрики и их визуализацияI И многое многое другое...
Graphite и его архитектура
Оригинал: graphiteapp.org
I Хранит time-series данныеI Текствой протокол и простой HTTP APII Моудльный — меняй что хочешь
Типичный Graphite
LoadBalancer
graphite-web
graphite-webcarbon-cache
Store1
DC1
Servers, Apps, etc
carbon-relay
Metrics
User Requests
graphite-webcarbon-cache
Store2
graphite-web
graphite-webcarbon-cache
Store1
DC2
graphite-webcarbon-cache
Store2
carbon-aggegator
Ломаем Graphtie: проблемы масштабирования
LoadBalancer
graphite-web
graphite-webcarbon-cache
Store1
DC1
Servers, Apps, etc
carbon-relay
Metrics
User Requests
graphite-webcarbon-cache
Store2
graphite-web
graphite-webcarbon-cache
Store1
DC2
graphite-webcarbon-cache
Store2
carbon-aggegator
Что не так с этой схемой?I carbon-relay — SPOFI Плохо масштабируетсяI Синхронизация данныхпосле аварий?
I Время ответа увеличиваетсяс ростом инфраструктуры
"Чиним"carbon-relay
LoadBalancer
graphite-web
graphite-webcarbon-cache
Store1
DC1
carbon-c-relay
carbon-c-relay
Metrics
User Requests
graphite-webcarbon-cache
Store2
graphite-web
graphite-webcarbon-cache
Store1
DC2
graphite-webcarbon-cache
Store2
carbon-c-relay
Servers, Apps, etc Server
carbon-c-relay
"Чиним"carbon-relay
carbon-c-relay:I Написан на CI Может 1M точек в секунду всего на 2-х ядрахI Играет роль L7 балансировщикаI Может делать агрегациюI Позволяет пережить маленький падения
Zipper: скрываем проблемы от пользователей
Оригинал: "The essence of bugfixing" by irisuhime
Zipper: скрываем проблемы от пользователей
Запрос: target=sys.server.cpu.user
Результат:
t0 V V V V V t1 Node1
t0 V V V V V t1 Node2
t0 V V V V V V V t1 Zipped metric
Zipper: Архитектура
LoadBalancer
carbonzipper
carbonservergo-carbon
Store1
DC1
User Requests
carbonservergo-carbon
Store2
carbonzipper
carbonservergo-carbon
Store1
DC2
carbonservergo-carbon
Store2
graphite-web graphite-web
Zipper: Результаты
I Написан на GoI Может опрашивать несколько серверов параллельноI Может "Лечить"данныеI carbonzipper ⇔ carbonserver — 2700 RPSgraphite-web ⇔ carbon-cache — 80 RPS.
I carbonserver теперь модуль go-carbon (с декабря 2016)
Распределение метрик: как это работало
Разница до 20%
Переписываем Frontend на Go: carbonapi
LoadBalancer
carbonzipper
carbonservergo-carbon
Store1
DC1
carbon-c-relay
User Requests
carbonservergo-carbon
Store2
graphite-web carbonapi
Переписываем Frontend на Go: итог
I Существенно ускорились ответы пользователям (99-ыйПерцентиль 15s ⇒ 0.8s)
I Стало возможно быстро выполнять сложные запросыI Проще добавлять новые мат. функцииI Также можно использовать в другом коде, как package
Replication factor — что это такое и как его готовить
a,h c,a
b,c d,e
e,f g,b
f,d h,g
Replication Factor 2
Replication factor — что это такое и как его готовить
a,e c,g
b,f d,h
a,e c,g
b,f d,h
Replication Factor 1
Replication factor — что это такое и как его готовить
a,e c,g
b,f d,h
a,g h,e
c,f b,d
Replication Factor 1, randomized
Replication factor — что это такое и как его готовить
Replication factor — что это такое и как его готовить
carbonsearch — простой поиск по тэгам
Пример:
target = sum(virt.v1. ∗ .dc : dc1.status : live.role : graphiteStore.text −match : metricsReceived)
I Поток тэгов и данных разделенI Не совсем честный — отсутствует история измененийI Синтаксис поддерживает только фильтрацию по "and"
Ищем тех кто неправильно использует систему
Ищем тех кто неправильно использует систему: flamegraphs
Собираем данные каждые 30 минут.
Что у нас есть сейчас
I 32 Frontend сервераI 400 RPS на чтениеI 40k Метрик читается в секундуI 3.5B точек в самом сложном периодическом запросе*I 11 Gbps трафик на backendI 200 серверов в 2-х DCI 3M уникальных метрик в секудну (12M попадают на storage)I 130 TB данныхI Заменили весь стэк
* — Чтобы отфильтровать из них 9kb JSON.
Тестируем Clickhouse на одном сервере
Планы на будущее
I Поиск по метаданным (в процессе)I Найти замену Whisper (в процессе)I Придумать что делать с АгрегаторамиI Заменить протокол общения между компонентамиI Улучшить совместимость с Graphite 1.0.0I Доделать тэгиI Документация, пакеты, Docker образы
А еще все это — Open Source!
I carbonapi — github.com/go-graphite/carbonapiI carbonzipper — github.com/go-graphite/carbonzipperI carbonsearch — github.com/kanatohodets/carbonsearchI carbon-c-relay — github.com/grobian/carbon-c-relayI go-carbon — github.com/lomik/go-carbonI carbonmem — github.com/go-graphite/carbonmemI replication factor test — github.com/Civil/graphite-rf-test
И еще пара ссылок на интересные проекты
I Организация в которой мы собираем кластеризуемыйграфит: github.com/go-graphite
I buckytools — менедмент и ребалансировка графита,написанная на Go: github.com/jjneely/buckytools
I Proof of concept построения список метрик в виде flamegraph:github.com/Civil/carbonserver-flamegraphs
I Офигенный адаптер Clickhouse->Graphite от РоманаЛомоносова: github.com/lomik/graphite-clickhouse
I Офигенный адаптер Graphite->Clickhouse от РоманаЛомоносова: github.com/lomik/carbon-clickhouse
I Официальный адаптер Clickhouse<->Graphite:github.com/yandex/graphouse
What’s next?
Спасибо за внимание!А еще мы нанимаем в Амстердам!
Site Reliability EngineerSite Reliability Engineer - Team Lead
Контакты: [email protected]