29
Graphite@Scale: Как сохранять миллионы точек в секунду Vladimir Smirnov System Administrator hangops_ru 2017 13 Апреля 2017

Graphite@Scale: Как сохранять миллионы точек в секунду

Embed Size (px)

Citation preview

Page 1: Graphite@Scale: Как сохранять миллионы точек в секунду

Graphite@Scale:Как сохранять миллионы точек в секунду

Vladimir SmirnovSystem Administrator

hangops_ru 201713 Апреля 2017

Page 2: Graphite@Scale: Как сохранять миллионы точек в секунду

Зачем вообще хранить метрики?

Обычно метрики нужны когда:I Пришло время планировать закупки железаI Отладка проблем и расследование инцидентовI Бизнес-метрики и их визуализацияI И многое многое другое...

Page 3: Graphite@Scale: Как сохранять миллионы точек в секунду

Graphite и его архитектура

Оригинал: graphiteapp.org

I Хранит time-series данныеI Текствой протокол и простой HTTP APII Моудльный — меняй что хочешь

Page 4: Graphite@Scale: Как сохранять миллионы точек в секунду

Типичный 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

Page 5: Graphite@Scale: Как сохранять миллионы точек в секунду

Ломаем 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 Время ответа увеличиваетсяс ростом инфраструктуры

Page 6: Graphite@Scale: Как сохранять миллионы точек в секунду

"Чиним"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

Page 7: Graphite@Scale: Как сохранять миллионы точек в секунду

"Чиним"carbon-relay

carbon-c-relay:I Написан на CI Может 1M точек в секунду всего на 2-х ядрахI Играет роль L7 балансировщикаI Может делать агрегациюI Позволяет пережить маленький падения

Page 8: Graphite@Scale: Как сохранять миллионы точек в секунду

Zipper: скрываем проблемы от пользователей

Оригинал: "The essence of bugfixing" by irisuhime

Page 9: Graphite@Scale: Как сохранять миллионы точек в секунду

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

Page 10: Graphite@Scale: Как сохранять миллионы точек в секунду

Zipper: Архитектура

LoadBalancer

carbonzipper

carbonservergo-carbon

Store1

DC1

User Requests

carbonservergo-carbon

Store2

carbonzipper

carbonservergo-carbon

Store1

DC2

carbonservergo-carbon

Store2

graphite-web graphite-web

Page 11: Graphite@Scale: Как сохранять миллионы точек в секунду

Zipper: Результаты

I Написан на GoI Может опрашивать несколько серверов параллельноI Может "Лечить"данныеI carbonzipper ⇔ carbonserver — 2700 RPSgraphite-web ⇔ carbon-cache — 80 RPS.

I carbonserver теперь модуль go-carbon (с декабря 2016)

Page 12: Graphite@Scale: Как сохранять миллионы точек в секунду

Распределение метрик: как это работало

Разница до 20%

Page 13: Graphite@Scale: Как сохранять миллионы точек в секунду

Распределение метрик: jump hash

arxiv.org/pdf/1406.2294v1.pdf

Page 14: Graphite@Scale: Как сохранять миллионы точек в секунду

Переписываем Frontend на Go: carbonapi

LoadBalancer

carbonzipper

carbonservergo-carbon

Store1

DC1

carbon-c-relay

User Requests

carbonservergo-carbon

Store2

graphite-web carbonapi

Page 15: Graphite@Scale: Как сохранять миллионы точек в секунду

Переписываем Frontend на Go: итог

I Существенно ускорились ответы пользователям (99-ыйПерцентиль 15s ⇒ 0.8s)

I Стало возможно быстро выполнять сложные запросыI Проще добавлять новые мат. функцииI Также можно использовать в другом коде, как package

Page 16: Graphite@Scale: Как сохранять миллионы точек в секунду

Replication factor — что это такое и как его готовить

a,h c,a

b,c d,e

e,f g,b

f,d h,g

Replication Factor 2

Page 17: Graphite@Scale: Как сохранять миллионы точек в секунду

Replication factor — что это такое и как его готовить

a,e c,g

b,f d,h

a,e c,g

b,f d,h

Replication Factor 1

Page 18: Graphite@Scale: Как сохранять миллионы точек в секунду

Replication factor — что это такое и как его готовить

a,e c,g

b,f d,h

a,g h,e

c,f b,d

Replication Factor 1, randomized

Page 19: Graphite@Scale: Как сохранять миллионы точек в секунду

Replication factor — что это такое и как его готовить

Page 20: Graphite@Scale: Как сохранять миллионы точек в секунду

Replication factor — что это такое и как его готовить

Page 21: Graphite@Scale: Как сохранять миллионы точек в секунду

carbonsearch — простой поиск по тэгам

Пример:

target = sum(virt.v1. ∗ .dc : dc1.status : live.role : graphiteStore.text −match : metricsReceived)

I Поток тэгов и данных разделенI Не совсем честный — отсутствует история измененийI Синтаксис поддерживает только фильтрацию по "and"

Page 22: Graphite@Scale: Как сохранять миллионы точек в секунду

Ищем тех кто неправильно использует систему

Page 23: Graphite@Scale: Как сохранять миллионы точек в секунду

Ищем тех кто неправильно использует систему: flamegraphs

Собираем данные каждые 30 минут.

Page 24: Graphite@Scale: Как сохранять миллионы точек в секунду

Что у нас есть сейчас

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.

Page 25: Graphite@Scale: Как сохранять миллионы точек в секунду

Тестируем Clickhouse на одном сервере

Page 26: Graphite@Scale: Как сохранять миллионы точек в секунду

Планы на будущее

I Поиск по метаданным (в процессе)I Найти замену Whisper (в процессе)I Придумать что делать с АгрегаторамиI Заменить протокол общения между компонентамиI Улучшить совместимость с Graphite 1.0.0I Доделать тэгиI Документация, пакеты, Docker образы

Page 27: Graphite@Scale: Как сохранять миллионы точек в секунду

А еще все это — 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

Page 28: Graphite@Scale: Как сохранять миллионы точек в секунду

И еще пара ссылок на интересные проекты

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

Page 29: Graphite@Scale: Как сохранять миллионы точек в секунду

What’s next?

Спасибо за внимание!А еще мы нанимаем в Амстердам!

Site Reliability EngineerSite Reliability Engineer - Team Lead

Контакты: [email protected]